强化任务调度管理,为了精确统计任务时间做准备

This commit is contained in:
nnhy 2015-07-15 07:59:35 +00:00
parent ca64567c62
commit 6b8f12b948
6 changed files with 39 additions and 66 deletions

44
Sys.cpp
View File

@ -216,7 +216,6 @@ TSys::TSys()
Interrupt.Init(); Interrupt.Init();
//_Scheduler = NULL;
OnStart = NULL; OnStart = NULL;
} }
@ -546,63 +545,36 @@ void TSys::ToHex(byte* buf, byte* src, uint len)
// 任务 // 任务
#include "Task.h" #include "Task.h"
// 任务类
TaskScheduler* _Scheduler;
// 创建任务返回任务编号。priority优先级dueTime首次调度时间usperiod调度间隔us-1表示仅处理一次 // 创建任务返回任务编号。priority优先级dueTime首次调度时间usperiod调度间隔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)
{ {
// 屏蔽中断,否则可能有线程冲突 return Scheduler.Add(func, param, dueTime, period, name);
SmartIRQ irq;
if(!_Scheduler) _Scheduler = new TaskScheduler("系统");
return _Scheduler->Add(func, param, dueTime, period);
} }
void TSys::RemoveTask(uint taskid) void TSys::RemoveTask(uint taskid)
{ {
assert_ptr(_Scheduler); Scheduler.Remove(taskid);
_Scheduler->Remove(taskid);
}
void TSys::SetTask(uint taskid, bool enable)
{
Task* task = (*_Scheduler)[taskid];
if(task) task->Enable = enable;
} }
void TSys::Start() void TSys::Start()
{ {
if(!_Scheduler) _Scheduler = new TaskScheduler("系统");
#if DEBUG #if DEBUG
//AddTask(ShowTime, NULL, 2000000, 2000000); //AddTask(ShowTime, NULL, 2000000, 2000000);
#endif #endif
if(OnStart) if(OnStart)
OnStart(); OnStart();
else else
_Scheduler->Start(); Scheduler.Start();
}
void TSys::StartInternal()
{
_Scheduler->Start();
}
void TSys::Stop()
{
_Scheduler->Stop();
} }
void TimeSleep(uint us) 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(); ulong start = Time.Current();
// 1ms一般不够调度新任务留给硬件等待 // 1ms一般不够调度新任务留给硬件等待
@ -613,7 +585,7 @@ void TimeSleep(uint us)
{ {
ulong start2 = Time.Current(); ulong start2 = Time.Current();
_Scheduler->Execute(us); Scheduler.Execute(us);
ulong now = Time.Current(); ulong now = Time.Current();
cost += (int)(now - start2); cost += (int)(now - start2);
@ -626,7 +598,7 @@ void TimeSleep(uint us)
if(task) if(task)
{ {
_Scheduler->Current = task; Scheduler.Current = task;
task->SleepTime += cost; task->SleepTime += cost;
} }

11
Sys.h
View File

@ -127,25 +127,16 @@ public:
private: private:
int _Index; // MCU在型号表中的索引 int _Index; // MCU在型号表中的索引
// 任务类
//TaskScheduler* _Scheduler;
public: public:
// 创建任务返回任务编号。dueTime首次调度时间usperiod调度间隔us-1表示仅处理一次 // 创建任务返回任务编号。dueTime首次调度时间usperiod调度间隔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 RemoveTask(uint taskid);
void SetTask(uint taskid, bool enable);
void Start(); // 开始系统大循环 void Start(); // 开始系统大循环
void StartInternal();
Func OnStart; Func OnStart;
void Stop();
}; };
extern TSys Sys; //创建一个全局的Sys对象 会在main函数之前执行构造函数 extern TSys Sys; //创建一个全局的Sys对象 会在main函数之前执行构造函数
// 任务
//#include "Task.h"
// 内存管理 // 内存管理
#include "Memory.h" #include "Memory.h"

View File

@ -1,9 +1,13 @@
#include "Task.h" #include "Task.h"
// 全局任务调度器
TaskScheduler Scheduler("系统");
Task::Task(TaskScheduler* scheduler) Task::Task(TaskScheduler* scheduler)
{ {
_Scheduler = scheduler; _Scheduler = scheduler;
Name = NULL;
Times = 0; Times = 0;
CpuTime = 0; CpuTime = 0;
SleepTime = 0; SleepTime = 0;
@ -11,15 +15,15 @@ Task::Task(TaskScheduler* scheduler)
Enable = true; Enable = true;
} }
/*Task::~Task() Task::~Task()
{ {
if(ID) _Scheduler->Remove(ID); if(ID) _Scheduler->Remove(ID);
}*/ }
// 显示状态 // 显示状态
void Task::ShowStatus() 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) TaskScheduler::TaskScheduler(string name)
@ -40,14 +44,15 @@ TaskScheduler::~TaskScheduler()
} }
// 创建任务返回任务编号。dueTime首次调度时间usperiod调度间隔us-1表示仅处理一次 // 创建任务返回任务编号。dueTime首次调度时间usperiod调度间隔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* task = new Task(this);
task->ID = _gid++; task->ID = _gid++;
task->Callback = func; task->Name = name;
task->Param = param; task->Callback = func;
task->Period = period; task->Param = param;
task->NextTime = Time.Current() + dueTime; task->Period = period;
task->NextTime = Time.Current() + dueTime;
Count++; Count++;
_Tasks.Add(task); _Tasks.Add(task);
@ -59,10 +64,10 @@ uint TaskScheduler::Add(Action func, void* param, ulong dueTime, long period)
{ {
uint dt = dueTime / 1000; uint dt = dueTime / 1000;
int pd = period > 0 ? period / 1000 : period; 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 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 #endif
return task->ID; return task->ID;
@ -77,7 +82,7 @@ void TaskScheduler::Remove(uint taskid)
if(task->ID == taskid) if(task->ID == taskid)
{ {
_Tasks.RemoveAt(i); _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的时候再次删除 // 首先清零ID避免delete的时候再次删除
task->ID = 0; task->ID = 0;
delete task; delete task;
@ -92,7 +97,7 @@ void TaskScheduler::Start()
#if DEBUG #if DEBUG
//Add(ShowTime, NULL, 2000000, 2000000); //Add(ShowTime, NULL, 2000000, 2000000);
Add(ShowStatus, this, 10000000, 120000000); Add(ShowStatus, this, 10000000, 120000000, "任务状态");
#endif #endif
debug_printf("%s::准备就绪 开始循环处理%d个任务\r\n\r\n", Name, Count); debug_printf("%s::准备就绪 开始循环处理%d个任务\r\n\r\n", Name, Count);

10
Task.h
View File

@ -6,6 +6,9 @@
class TaskScheduler; class TaskScheduler;
// 全局任务调度器
extern TaskScheduler Scheduler;
// 任务 // 任务
class Task class Task
{ {
@ -18,6 +21,7 @@ private:
public: public:
uint ID; // 编号 uint ID; // 编号
string Name; // 名称
Action Callback; // 回调 Action Callback; // 回调
void* Param; // 参数 void* Param; // 参数
long Period; // 周期us long Period; // 周期us
@ -29,7 +33,7 @@ public:
bool Enable; // 是否启用 bool Enable; // 是否启用
byte Reversed[3];// 保留,避免对齐问题 byte Reversed[3];// 保留,避免对齐问题
//~Task(); ~Task();
void ShowStatus(); // 显示状态 void ShowStatus(); // 显示状态
}; };
@ -38,7 +42,7 @@ public:
class TaskScheduler class TaskScheduler
{ {
private: private:
FixedArray<Task, 32> _Tasks; FixedArray<Task, 16> _Tasks;
uint _gid; // 总编号 uint _gid; // 总编号
friend class Task; friend class Task;
@ -54,7 +58,7 @@ public:
~TaskScheduler(); ~TaskScheduler();
// 创建任务返回任务编号。dueTime首次调度时间usperiod调度间隔us-1表示仅处理一次 // 创建任务返回任务编号。dueTime首次调度时间usperiod调度间隔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 Remove(uint taskid);
void Start(); void Start();

View File

@ -1,4 +1,5 @@
#include "Thread.h" #include "Thread.h"
#include "Task.h"
//#define TH_DEBUG DEBUG //#define TH_DEBUG DEBUG
#define TH_DEBUG 0 #define TH_DEBUG 0
@ -608,7 +609,7 @@ void Thread::OnTick()
} }
void Idle_Handler(void* param) { while(1); } 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; bool Thread::Inited = false;
uint Thread::g_ID = 0; uint Thread::g_ID = 0;

View File

@ -173,5 +173,5 @@ void WatchDog::Start(uint ms)
uint us = ms * 1000; uint us = ms * 1000;
debug_printf("WatchDog::Start "); debug_printf("WatchDog::Start ");
Sys.AddTask(FeedDogTask, &dog, us, us); Sys.AddTask(FeedDogTask, &dog, us, us, "看门狗");
} }