diff --git a/Sys.cpp b/Sys.cpp index 1a2ff519..54a96238 100644 --- a/Sys.cpp +++ b/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; } diff --git a/Sys.h b/Sys.h index d8461cd4..c61eed35 100644 --- a/Sys.h +++ b/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" diff --git a/Task.cpp b/Task.cpp index cd57d920..01045ce8 100644 --- a/Task.cpp +++ b/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)) { diff --git a/Task.h b/Task.h index af429375..df06d963 100644 --- a/Task.h +++ b/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 _Tasks; + FixedArray _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(); diff --git a/Thread.cpp b/Thread.cpp index dcd2efb8..9734465f 100644 --- a/Thread.cpp +++ b/Thread.cpp @@ -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; diff --git a/WatchDog.cpp b/WatchDog.cpp index 6364122b..6982cf57 100644 --- a/WatchDog.cpp +++ b/WatchDog.cpp @@ -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, "看门狗"); }