以下以ZStack-<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1.4.1-1.2.1的Generic工程为例分析操作系统对任务事件的响应过程。
Zmain目录下Zmain.c中的main函数有两个重要的函数调用osal_init_system()和osal_start_system()。osal_init_system()调用osalInitTasks()初始化操作系统任务并赋予任务号,其中GenericApp_Init( taskID )为应用程序任务初始化函数。osal_start_system()使用tasksEvents[idx]保存任务事件消息,events = tasksEvents[idx] 将任务事件按照优先级取出,然后调用events = (tasksArr[idx])( idx, events )响应任务事件消息,并清除已取出的任务事件消息tasksEvents[idx] = 0,返回未处理的任务事件消息tasksEvents[idx] |= events。其中tasksArr[]是任务事件响应函数指针数组
const pTaskEventHandlerFn tasksArr[] = {
macEventLoop,
nwk_event_loop,
Hal_ProcessEvent,
#if defined( MT_TASK )
MT_ProcessEvent,
#endif
APS_event_loop,
ZDApp_event_loop,
GenericApp_ProcessEvent
};
那么操作系统是如何保存任务事件消息,即如何修改数组tasksEvents[idx]的呢?以P1口的按键事件响应过程为例,按键中断响应函数HAL_ISR_FUNCTION( halKeyPort1Isr, P1INT_VECTOR )调用按键中断处理函数halProcessKeyInterrupt(),halProcessKeyInterrupt()判断是否有感兴趣的按键,如
#if defined (HAL_KEY_SW_5_ENABLE)
if (HAL_KEY_SW_5_PXIFG & HAL_KEY_SW_5_BIT)
{
HAL_KEY_SW_5_PXIFG = ~(HAL_KEY_SW_5_BIT);
valid = TRUE;
}
#endif
如有,则调用osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_DEBOUNCE_VALUE),函数osal_start_timerEx开启一个定时器,并在定时到时设置HAL_KEY_EVENT事件。
文章评论(0条评论)
登录后参与讨论