我是靠谱客的博主 积极柚子,最近开发中收集的这篇文章主要介绍浅谈 OSAL中的事件捕获,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

按键的事件捕获
1.HALCommen 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 )
            因为 在HALCommen hal_drivers.c这个文件中, HalDriverInit这个函数调用 HalKeyInit,内有   pHalKeyProcessFunction  = NULL;
             这说明在初始化以后pHalKeyProcessFunction并没有指向任何一个函数。
            就在HalKeyInit的下方有一个这样的函数HalKeyConfig。其中有这样一条语句:
           pHalKeyProcessFunction = cback;   cback是HalKeyConfig所传进来的参数
               在main函数中有这样一个函数调用:InitBoard( OB_READY );此函数中做了如下调用:
             HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);
3. “ZMainOnBoard .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() 中就可以检测到这个消息,并且检测到这个消息是属于那个任务的,然后,调用相应的消息处理函数

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

最后

以上就是积极柚子为你收集整理的浅谈 OSAL中的事件捕获的全部内容,希望文章能够帮你解决浅谈 OSAL中的事件捕获所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部