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

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();
//_Scheduler = NULL;
OnStart = NULL;
}
@ -546,63 +545,36 @@ void TSys::ToHex(byte* buf, byte* src, uint len)
// 任务
#include "Task.h"
// 任务类
TaskScheduler* _Scheduler;
// 创建任务返回任务编号。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)
{
// 屏蔽中断,否则可能有线程冲突
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
View File

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

View File

@ -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首次调度时间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->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
View File

@ -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首次调度时间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 Start();

View File

@ -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;

View File

@ -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, "看门狗");
}