本人现在还是zigbee的初学者。现在正在努力的学习之中。理解可能会有一些偏差和错误,希望各位能够指正。
1.Zigbee的任务调度
首先找到zigbee协议的主函数,在主函数里面,大部分是以一些初始化函数。有关应用程序最主要的函数为osal_init_system()和osal_start_system()。
在osal_init_system()进行了内存、消息队列、和系统时间的初始化。我们主要看osalInitTasks()(此函数为系统任务的初始化)。在函数里面为每个任务分配了任务ID。这个 ID和tasksEvents,tasksArr的ID是对应的,顺序不能错。
tasksEvents这个数组存放的是从序号为0到tasksCnt,每个任务在本次循环中是否要被运行,需要运行的任务其值非0。
而tasksArr数组则存放了对应每个任务的入口地址,只有在tasksEvents中记录的需要运行的任务,在本次循环中才会被调用到。
void osal_start_system( void ) //系统任务开始
{
#if !defined ( ZBIT ) && !defined ( UBIT )
for(;;) // Forever Loop 死循环
#endif
{
uint8 idx = 0;
osalTimeUpdate(); //更新系统时间
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; // Clear the Events for this task.
HAL_EXIT_CRITICAL_SECTION(intState); //跳出中断临界状态:恢复先前中断状态
events = (tasksArr[idx])( idx, events ); //对应的任务函数运行
HAL_ENTER_CRITICAL_SECTION(intState);
tasksEvents[idx] |= events; // Add back unprocessed events to the current task.
HAL_EXIT_CRITICAL_SECTION(intState);
}
#if defined( POWER_SAVING )
else
{
osal_pwrmgr_powerconserve(); //没有任务运行时,处理器休眠
}
#endif
}
}