可实现在单片机裸机下还能有很好的实时性
/* 任务调度器 */
_SCHEDULER_TASK scheduler_tasks[] =
{
{&P_loop_1000Hz,1000, 0, 0},
{&P_loop_500Hz , 500, 0, 0},
{&P_loop_200Hz , 200, 0, 0},
{&P_loop_100Hz , 100, 0, 0},
{&P_loop_50Hz , 50, 0, 0},
{&P_loop_20Hz , 20, 0, 0},
{&P_loop_2Hz , 2, 0, 0},
};
/* 计算线程数量 */
#define TASK_NUM (sizeof(scheduler_tasks)/sizeof(_SCHEDULER_TASK))
/* 初始化任务表 */
void Scheduler_Setup(void)
{
u8 index = 0;
for(index=0; index<TASK_NUM; index++)
{
/* 计算每个任务的延时周期数 */
scheduler_tasks[index].interval_ticks = 1000/scheduler_tasks[index].rate_hz;
/* 最小单位为1ms */
if(scheduler_tasks[index].interval_ticks < 1)
{
scheduler_tasks[index].interval_ticks = 1;
}
}
}
void Scheduler_Run(void)
{
u8 index = 0;
for(index=0; index<TASK_NUM; index++)
{
u32 T_now = SysTick_GetTick();
if(T_now - scheduler_tasks[index].last_run >= scheduler_tasks[index].interval_ticks)
{
scheduler_tasks[index].last_run = T_now;
scheduler_tasks[index].task_func();
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)