概述
按键的事件捕获
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;
}
}
{
#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) (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中的事件捕获所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复