原创 ZStack-1.4.3-1.2.1学习(1)

2010-3-16 21:17 3301 11 11 分类: MCU/ 嵌入式

以下以ZStack-<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1.4.1-1.2.1Generic工程为例分析操作系统对任务事件的响应过程。


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事件。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
11
关闭 站长推荐上一条 /3 下一条