强化任务调度管理,为了精确统计任务时间做准备
This commit is contained in:
parent
ca64567c62
commit
6b8f12b948
44
Sys.cpp
44
Sys.cpp
|
@ -216,7 +216,6 @@ TSys::TSys()
|
|||
|
||||
Interrupt.Init();
|
||||
|
||||
//_Scheduler = NULL;
|
||||
OnStart = NULL;
|
||||
}
|
||||
|
||||
|
@ -546,63 +545,36 @@ void TSys::ToHex(byte* buf, byte* src, uint len)
|
|||
|
||||
// 任务
|
||||
#include "Task.h"
|
||||
// 任务类
|
||||
TaskScheduler* _Scheduler;
|
||||
|
||||
// 创建任务,返回任务编号。priority优先级,dueTime首次调度时间us,period调度间隔us,-1表示仅处理一次
|
||||
uint TSys::AddTask(Action func, void* param, ulong dueTime, long period)
|
||||
uint TSys::AddTask(Action func, void* param, ulong dueTime, long period, string name)
|
||||
{
|
||||
// 屏蔽中断,否则可能有线程冲突
|
||||
SmartIRQ irq;
|
||||
|
||||
if(!_Scheduler) _Scheduler = new TaskScheduler("系统");
|
||||
|
||||
return _Scheduler->Add(func, param, dueTime, period);
|
||||
return Scheduler.Add(func, param, dueTime, period, name);
|
||||
}
|
||||
|
||||
void TSys::RemoveTask(uint taskid)
|
||||
{
|
||||
assert_ptr(_Scheduler);
|
||||
|
||||
_Scheduler->Remove(taskid);
|
||||
}
|
||||
|
||||
void TSys::SetTask(uint taskid, bool enable)
|
||||
{
|
||||
Task* task = (*_Scheduler)[taskid];
|
||||
if(task) task->Enable = enable;
|
||||
Scheduler.Remove(taskid);
|
||||
}
|
||||
|
||||
void TSys::Start()
|
||||
{
|
||||
if(!_Scheduler) _Scheduler = new TaskScheduler("系统");
|
||||
|
||||
#if DEBUG
|
||||
//AddTask(ShowTime, NULL, 2000000, 2000000);
|
||||
#endif
|
||||
if(OnStart)
|
||||
OnStart();
|
||||
else
|
||||
_Scheduler->Start();
|
||||
}
|
||||
|
||||
void TSys::StartInternal()
|
||||
{
|
||||
_Scheduler->Start();
|
||||
}
|
||||
|
||||
void TSys::Stop()
|
||||
{
|
||||
_Scheduler->Stop();
|
||||
Scheduler.Start();
|
||||
}
|
||||
|
||||
void TimeSleep(uint us)
|
||||
{
|
||||
// 在这段时间里面,去处理一下别的任务
|
||||
if(_Scheduler && (!us || us >= 1000))
|
||||
if(!us || us >= 1000)
|
||||
{
|
||||
// 记录当前正在执行任务
|
||||
Task* task = _Scheduler->Current;
|
||||
Task* task = Scheduler.Current;
|
||||
|
||||
ulong start = Time.Current();
|
||||
// 1ms一般不够调度新任务,留给硬件等待
|
||||
|
@ -613,7 +585,7 @@ void TimeSleep(uint us)
|
|||
{
|
||||
ulong start2 = Time.Current();
|
||||
|
||||
_Scheduler->Execute(us);
|
||||
Scheduler.Execute(us);
|
||||
|
||||
ulong now = Time.Current();
|
||||
cost += (int)(now - start2);
|
||||
|
@ -626,7 +598,7 @@ void TimeSleep(uint us)
|
|||
|
||||
if(task)
|
||||
{
|
||||
_Scheduler->Current = task;
|
||||
Scheduler.Current = task;
|
||||
task->SleepTime += cost;
|
||||
}
|
||||
|
||||
|
|
11
Sys.h
11
Sys.h
|
@ -127,25 +127,16 @@ public:
|
|||
private:
|
||||
int _Index; // MCU在型号表中的索引
|
||||
|
||||
// 任务类
|
||||
//TaskScheduler* _Scheduler;
|
||||
|
||||
public:
|
||||
// 创建任务,返回任务编号。dueTime首次调度时间us,period调度间隔us,-1表示仅处理一次
|
||||
uint AddTask(Action func, void* param, ulong dueTime = 0, long period = 0);
|
||||
uint AddTask(Action func, void* param, ulong dueTime = 0, long period = 0, string name = NULL);
|
||||
void RemoveTask(uint taskid);
|
||||
void SetTask(uint taskid, bool enable);
|
||||
void Start(); // 开始系统大循环
|
||||
void StartInternal();
|
||||
Func OnStart;
|
||||
void Stop();
|
||||
};
|
||||
|
||||
extern TSys Sys; //创建一个全局的Sys对象 会在main函数之前执行构造函数(!!!!!)
|
||||
|
||||
// 任务
|
||||
//#include "Task.h"
|
||||
|
||||
// 内存管理
|
||||
#include "Memory.h"
|
||||
|
||||
|
|
35
Task.cpp
35
Task.cpp
|
@ -1,9 +1,13 @@
|
|||
#include "Task.h"
|
||||
|
||||
// 全局任务调度器
|
||||
TaskScheduler Scheduler("系统");
|
||||
|
||||
Task::Task(TaskScheduler* scheduler)
|
||||
{
|
||||
_Scheduler = scheduler;
|
||||
|
||||
Name = NULL;
|
||||
Times = 0;
|
||||
CpuTime = 0;
|
||||
SleepTime = 0;
|
||||
|
@ -11,15 +15,15 @@ Task::Task(TaskScheduler* scheduler)
|
|||
Enable = true;
|
||||
}
|
||||
|
||||
/*Task::~Task()
|
||||
Task::~Task()
|
||||
{
|
||||
if(ID) _Scheduler->Remove(ID);
|
||||
}*/
|
||||
}
|
||||
|
||||
// 显示状态
|
||||
void Task::ShowStatus()
|
||||
{
|
||||
debug_printf("Task::Status 任务 %d [%d] 执行 %dus 平均 %dus\r\n", ID, Times, CpuTime, Cost);
|
||||
debug_printf("Task::%s %d [%d] 执行 %dus 平均 %dus\r\n", Name, ID, Times, CpuTime, Cost);
|
||||
}
|
||||
|
||||
TaskScheduler::TaskScheduler(string name)
|
||||
|
@ -40,14 +44,15 @@ TaskScheduler::~TaskScheduler()
|
|||
}
|
||||
|
||||
// 创建任务,返回任务编号。dueTime首次调度时间us,period调度间隔us,-1表示仅处理一次
|
||||
uint TaskScheduler::Add(Action func, void* param, ulong dueTime, long period)
|
||||
uint TaskScheduler::Add(Action func, void* param, ulong dueTime, long period, string name)
|
||||
{
|
||||
Task* task = new Task(this);
|
||||
task->ID = _gid++;
|
||||
task->Callback = func;
|
||||
task->Param = param;
|
||||
task->Period = period;
|
||||
task->NextTime = Time.Current() + dueTime;
|
||||
Task* task = new Task(this);
|
||||
task->ID = _gid++;
|
||||
task->Name = name;
|
||||
task->Callback = func;
|
||||
task->Param = param;
|
||||
task->Period = period;
|
||||
task->NextTime = Time.Current() + dueTime;
|
||||
|
||||
Count++;
|
||||
_Tasks.Add(task);
|
||||
|
@ -59,10 +64,10 @@ uint TaskScheduler::Add(Action func, void* param, ulong dueTime, long period)
|
|||
{
|
||||
uint dt = dueTime / 1000;
|
||||
int pd = period > 0 ? period / 1000 : period;
|
||||
debug_printf("%s::添加任务%d 0x%08x FirstTime=%ums Period=%dms\r\n", Name, task->ID, func, dt, pd);
|
||||
debug_printf("%s::添加%d %s 0x%08x FirstTime=%ums Period=%dms\r\n", Name, task->ID, name, func, dt, pd);
|
||||
}
|
||||
else
|
||||
debug_printf("%s::添加任务%d 0x%08x FirstTime=%uus Period=%dus\r\n", Name, task->ID, func, (uint)dueTime, (int)period);
|
||||
debug_printf("%s::添加%d %s 0x%08x FirstTime=%uus Period=%dus\r\n", Name, task->ID, name, func, (uint)dueTime, (int)period);
|
||||
#endif
|
||||
|
||||
return task->ID;
|
||||
|
@ -77,7 +82,7 @@ void TaskScheduler::Remove(uint taskid)
|
|||
if(task->ID == taskid)
|
||||
{
|
||||
_Tasks.RemoveAt(i);
|
||||
debug_printf("%s::删除任务%d 0x%08x\r\n", Name, task->ID, task->Callback);
|
||||
debug_printf("%s::删除%d %s 0x%08x\r\n", Name, task->ID, task->Name, task->Callback);
|
||||
// 首先清零ID,避免delete的时候再次删除
|
||||
task->ID = 0;
|
||||
delete task;
|
||||
|
@ -92,7 +97,7 @@ void TaskScheduler::Start()
|
|||
|
||||
#if DEBUG
|
||||
//Add(ShowTime, NULL, 2000000, 2000000);
|
||||
Add(ShowStatus, this, 10000000, 120000000);
|
||||
Add(ShowStatus, this, 10000000, 120000000, "任务状态");
|
||||
#endif
|
||||
debug_printf("%s::准备就绪 开始循环处理%d个任务!\r\n\r\n", Name, Count);
|
||||
|
||||
|
@ -179,7 +184,7 @@ void TaskScheduler::Execute(uint usMax)
|
|||
void TaskScheduler::ShowStatus(void* param)
|
||||
{
|
||||
TaskScheduler* ts = (TaskScheduler*)param;
|
||||
|
||||
|
||||
int i = -1;
|
||||
while(ts->_Tasks.MoveNext(i))
|
||||
{
|
||||
|
|
10
Task.h
10
Task.h
|
@ -6,6 +6,9 @@
|
|||
|
||||
class TaskScheduler;
|
||||
|
||||
// 全局任务调度器
|
||||
extern TaskScheduler Scheduler;
|
||||
|
||||
// 任务
|
||||
class Task
|
||||
{
|
||||
|
@ -18,6 +21,7 @@ private:
|
|||
|
||||
public:
|
||||
uint ID; // 编号
|
||||
string Name; // 名称
|
||||
Action Callback; // 回调
|
||||
void* Param; // 参数
|
||||
long Period; // 周期us
|
||||
|
@ -29,7 +33,7 @@ public:
|
|||
bool Enable; // 是否启用
|
||||
byte Reversed[3];// 保留,避免对齐问题
|
||||
|
||||
//~Task();
|
||||
~Task();
|
||||
|
||||
void ShowStatus(); // 显示状态
|
||||
};
|
||||
|
@ -38,7 +42,7 @@ public:
|
|||
class TaskScheduler
|
||||
{
|
||||
private:
|
||||
FixedArray<Task, 32> _Tasks;
|
||||
FixedArray<Task, 16> _Tasks;
|
||||
uint _gid; // 总编号
|
||||
|
||||
friend class Task;
|
||||
|
@ -54,7 +58,7 @@ public:
|
|||
~TaskScheduler();
|
||||
|
||||
// 创建任务,返回任务编号。dueTime首次调度时间us,period调度间隔us,-1表示仅处理一次
|
||||
uint Add(Action func, void* param, ulong dueTime = 0, long period = 0);
|
||||
uint Add(Action func, void* param, ulong dueTime = 0, long period = 0, string name = NULL);
|
||||
void Remove(uint taskid);
|
||||
|
||||
void Start();
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include "Thread.h"
|
||||
#include "Task.h"
|
||||
|
||||
//#define TH_DEBUG DEBUG
|
||||
#define TH_DEBUG 0
|
||||
|
@ -608,7 +609,7 @@ void Thread::OnTick()
|
|||
}
|
||||
|
||||
void Idle_Handler(void* param) { while(1); }
|
||||
void Main_Handler(void* param) { Sys.StartInternal(); while(1); }
|
||||
void Main_Handler(void* param) { Scheduler.Start(); while(1); }
|
||||
|
||||
bool Thread::Inited = false;
|
||||
uint Thread::g_ID = 0;
|
||||
|
|
|
@ -173,5 +173,5 @@ void WatchDog::Start(uint ms)
|
|||
uint us = ms * 1000;
|
||||
|
||||
debug_printf("WatchDog::Start ");
|
||||
Sys.AddTask(FeedDogTask, &dog, us, us);
|
||||
Sys.AddTask(FeedDogTask, &dog, us, us, "看门狗");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue