定时器触发事件一般为程序内部触发,若外部触发事件,可以用系统消息触发,以按键触发为例。在初始化时候,InitBoard()中,注册了按键回调函数HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);该函数中注册按键 ...
定时器触发事件一般为程序内部触发,若外部触发事件,可以用系统消息触发,以按键触发为例。
在初始化时候,InitBoard()中,注册了按键回调函数
HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);
该函数中注册按键回调函数到pHalKeyProcessFunction,并启动定时器事件,ID为HAL层ID,事件为按键事件,调用HalKeyPoll(),启动按键轮询,等待按键触发。
halProcessKeyInterrupt()通过HAL_ISR_FUNCTION()注册到OSAL的中断机制中,此部分代码没有公开,可能是底层按键触发中断,然后调用halProcessKeyInterrupt()上报事件,HalKeyPoll()中调用初始化时候注册的按键回调函数(pHalKeyProcessFunction) ()进行处理;
在回调函数中,调用OnBoard_SendKeys()函数发送系统消息,消息结构如下
typedef struct
{
void *next;
uint16 len;
uint8 dest_id;
} osal_msg_hdr_t;
typedef struct
{
uint8 event;
uint8 status;
} osal_event_hdr_t;
typedef struct
{
osal_event_hdr_t hdr;
uint8 state;
uint8 keys;
} keyChange_t;
回调函数OnBoard_SendKeys()原型如下:
1 /********************************************************************* 2 3 * @fn OnBoard_SendKeys 4 5 * 6 7 * @brief Send "Key Pressed" message to application. 8 9 *10 11 * @param keys - keys that were pressed12 13 * state - shifted14 15 *16 17 * @return status18 19 *********************************************************************/20 21 uint8 OnBoard_SendKeys( uint8 keys, uint8 state )22 23 {24 25 keyChange_t *msgPtr;26 27 if ( registeredKeysTaskID != NO_TASK_ID )28 29 {30 31 // Send the address to the task32 33 msgPtr = (keyChange_t *)osal_msg_allocate( sizeof(keyChange_t) );34 35 if ( msgPtr )36 37 {38 39 msgPtr->hdr.event = KEY_CHANGE;40 41 msgPtr->state = state;42 43 msgPtr->keys = keys;44 45 46 osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr );47 48 }49 50 return ( SUCCESS );51 52 }53 54 else55 56 return ( FAILURE );57 58 }
海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com
原标题:OSAL的消息机制触发事件流程
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。