浅谈 OSAL中的事件捕获

按键的事件捕获
1.HAL\Commen\ hal_drivers.c”中
    if (events & HAL_KEY_EVENT)
        {
                #if (defined HAL_KEY) && (HAL_KEY == TRUE)
                /* Check for keys */
                 HalKeyPoll();
                /* if interrupt disabled, do next polling */
                if (!Hal_KeyIntEnable)
                {
                        osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100);
                }
                #endif // HAL_KEY
                return events ^ HAL_KEY_EVENT;
        }
  }
     每隔100毫秒都会执行HalKeyPoll()函数。
2. HalKeyPoll()
         在接近函数末尾的地方, keys变量(在函数起始位置定义的)获得了当前按键的状态。
        最后,有一个十分重要的函数调用。
   (pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL);
         pHalKeyProcessFunction这个函数指针 指向 void OnBoard_KeyCallback ( uint8 keys, uint8 state )
            因为 在HAL\Commen\ hal_drivers.c这个文件中, HalDriverInit这个函数调用 HalKeyInit,内有   pHalKeyProcessFunction  = NULL;
             这说明在初始化以后pHalKeyProcessFunction并没有指向任何一个函数。
            就在HalKeyInit的下方有一个这样的函数HalKeyConfig。其中有这样一条语句:
           pHalKeyProcessFunction = cback;   cback是HalKeyConfig所传进来的参数
               在main函数中有这样一个函数调用:InitBoard( OB_READY );此函数中做了如下调用:
             HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);
3. “ZMain\OnBoard .c”      void OnBoard_KeyCallback ( uint8 keys, uint8 state )
         在这个函数中,又 调用了byte OnBoard_SendKeys( byte keys, byte state )
        调用 osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr );   egisteredKeysTaskID所指示的任务正式我们需要响应按键的GenericApp这个任务。
         调用osal_set_event( destination_task, SYS_EVENT_MSG ); 其中 tasksEvents[task_id] |= event_flag;


定时器事件的捕获

最重要的数据结构
定时器链表timerHead
typedef struct
{
  void *next;
  UINT16 timeout;
  UINT16 event_flag;
  byte task_id;
} osalTimerRec_t;
osalTimerRec_t   *timerHead;


1
当启动一个定时器时  osal_start_timerEx(p2p_test_TaskID,p2p_test_SEND_WATER_GAGE_MSG_EVT,3000);  
   osal_start_timerEx()调用    newTimer = osalAddTimer( taskID, event_id, timeout_value );                    
        osalAddTimer( taskID, event_id, timeout_value )  调用 osalFindTimer( task_id, event_flag )
osalFindTimer( task_id, event_flag )中找到已有定时器,更新timeout,没有,则增加 newTimer,插入到 定时器链表 timerHead最后

2
osal_start_system()死循环中,每次都执行Hal_ProcessPoll();
在Hal_ProcessPoll()中调用  HalTimerTick();
HalTimerTick() ; 这个函数是专门用来检测是否有硬件定时器溢出的。 如果定时器有溢出的话,就要调用 halProcessTimerX () ;(X表示 1 3 4).这里假设是HalProcessTimer4()。
当1ms心跳来临时,Timer4的中断标志置位,这样在OSAL的死循环中,通过一开始的Hal_ProcessPoll()函数检测到这中断标志位,在Hal_ProcessPoll ()函数中调用了   HalTimerTick();函数,这个函数是专门用来检测是否有硬件定时器溢出的。)
相当于每1ms都要执行一次 HalProcessTimer4()
HalProcessTimer4()中调用  halTimerSendCallBack  (HAL_TIMER_2, HAL_TIMER_CHANNEL_B, HAL_TIMER_CH_MODE_OUTPUT_COMPARE);
  halTimerSendCallBack()中 调用 (halTimerRecord[hwtimerid].callBackFunc)
halTimerRecord[hwtimerid].callBackFunc)通过 在InitBoard()函数中调用了函数HalTimerConfig()进行了配置,即
halTimerRecord[hwtimerid].callBackFunc  = Onboard_TimerCallBack()
相当于在 halTimerSendCallBack()中调用Onboard_TimerCallBack(
Onboard_TimerCallBack() 中调用 osal_update_timers()
osal_update_timers() 中调用 osalTimerUpdate( tmr_decr_time ) 其中  tmr_decr_time  =  TIMER_DECR_TIME =1ms
osalTimerUpdate( tmr_decr_time )中更新系统时间,和各个定时器的timeout,当timeout == 0时,表示定时到,执行
osal_set_event( srchTimer->task_id, srchTimer->event_flag ),即可设置相应的事件了(也就是捕获了相应的事件
这样在主循环 osal_start_system() 中就可以检测到这个消息,并且检测到这个消息是属于那个任务的,然后,调用相应的消息处理函数

本文参考了一部分经典帖子加个人总结整理而成~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值