OSAL系统简介

看一段程序的时候,往往要从它的数据结构入手。
 main()函数中主循环存在两个关键数组,*tasksEvents与*tasksArr,
 tasksEvents这个数组存放的是从序号为0到tasksCnt,每个任务在本次循环中是否要被运行,需要运行的任务其值非0,否则为0。
 而tasksArr数组则存放了对应每个任务的入口地址,只有在tasksEvents中记录的需要运行的任务,在本次循环中才会被调用到。

for(;;) // Forever Loop
{
uint8 idx = 0;
Hal_ProcessPoll(); // 系统定时器设置
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; // 本任务可能没完全完成,如果是这样,再次设置标志位,在下一次循环中继续执行
HAL_EXIT_CRITICAL_SECTION(intState);
}
}


 

你可能感兴趣的:(OSAL)