强化任务调度管理,为了精确统计任务时间做准备
This commit is contained in:
parent
ca64567c62
commit
6b8f12b948
44
Sys.cpp
44
Sys.cpp
|
@ -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首次调度时间us,period调度间隔us,-1表示仅处理一次
|
// 创建任务,返回任务编号。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)
|
||||||
{
|
{
|
||||||
// 屏蔽中断,否则可能有线程冲突
|
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
11
Sys.h
|
@ -127,25 +127,16 @@ public:
|
||||||
private:
|
private:
|
||||||
int _Index; // MCU在型号表中的索引
|
int _Index; // MCU在型号表中的索引
|
||||||
|
|
||||||
// 任务类
|
|
||||||
//TaskScheduler* _Scheduler;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// 创建任务,返回任务编号。dueTime首次调度时间us,period调度间隔us,-1表示仅处理一次
|
// 创建任务,返回任务编号。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 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"
|
||||||
|
|
||||||
|
|
33
Task.cpp
33
Task.cpp
|
@ -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首次调度时间us,period调度间隔us,-1表示仅处理一次
|
// 创建任务,返回任务编号。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* 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
10
Task.h
|
@ -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首次调度时间us,period调度间隔us,-1表示仅处理一次
|
// 创建任务,返回任务编号。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 Remove(uint taskid);
|
||||||
|
|
||||||
void Start();
|
void Start();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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, "看门狗");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue