1、任务的调度
实际就是循环遍历一个任务列表,检查任务的执行状态,可以执行的 就开始执行。循环遍历。
实际就是sfwd的实现原理
两个数组(指针)记录任务的调度
*tasksEvents记录序号从0到taskcnt对应的任务是否被执行;
*tasksArr记录每个任务的入口地址;
for(;😉 // Forever Loop
{
uint8 idx = 0;
Hal_ProcessPoll(); // 先不管1
do {
if (tasksEvents[idx]) // 寻找最高优先级的任务来运行
{
break;
}
} while (++idx < tasksCnt);
if (idx < tasksCnt) //如果有任务需要运行
{
uint16 events;
halIntState_t intState;
HAL_ENTER_CRITICAL_SECTION(intState);
events = tasksEvents[idx];
tasksEvents[idx] = 0; // 本任务运行完了,要对其清空,为后面要运行的任务让路
HAL_EXIT_CRITICAL_SECTION(intState);
events = (tasksArr[idx])( idx, events );//最关键的一句话,如图一中,运行对应的任务
HAL_ENTER_CRITICAL_SECTION(intState);
tasksEvents[idx] |= events; // 本任务可能没完全完成,如果是这样,再次设置标志位