学习ZigBee Stack协议栈时,使用到按键,发现OSAL里面有关于按键的任务调度。
相关文件
hal_key.c
hal_key.h
hal_board_cfg.h
zmain.c
OnBoard.c
函数调用过程
-
InitBoard( OB_READY )调用HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE,
OnBoard_KeyCallback)在HalKeyConfig()函数中主要是非中断使能,执行下面的代码。将按键事件添加到应用程序任务中,该Hal_TaskID在Hal_Init( taskID++ )函数里面完成初始化。当系统查询到该任务有按键事件时,执行Hal_ProcessEvent( uint8 task_id, uint16 events )响应程序。
osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE);
- Hal_ProcessEvent(),在该函数中有下列事件
SYS_EVENT_MSG 系统事件
HAL_LED_BLINK_EVENT LED闪烁事件
HAL_KEY_EVENT 按键事件
HAL_SLEEP_TIMER_EVENT 睡眠事件
- 在按键事件中执行HalKeyPoll()按键查询扫函数,然后如果有按键发生,如果键值halKeySavedKeys发生改变,那么存储键值。
- 然后执行回调函数pHalKeyProcessFunction,该函数在HalKeyConfig()中初始化为OnBoard_KeyCallback()。
- 在OnBoard_KeyCallback()函数中执行OnBoard_SendKeys()函数,该函数向OSAL任务(即任务ID为registeredKeysTaskID,该ID在SampleApp_Init()函数中调用RegisterForKeys()函数初始化)发送板载资源消息事件。
按键消息事件内容是:
msgPtr->hdr.event = KEY_CHANGE;//事件类型
msgPtr->state = state;//按键状态
msgPtr->keys = keys;//按键键值
uint8 OnBoard_SendKeys( uint8 keys, uint8 state )
{
keyChange_t *msgPtr;
if ( registeredKeysTaskID != NO_TASK_ID )
{
// Send the address to the task
msgPtr = (keyChange_t *)osal_msg_allocate( sizeof(keyChange_t) );
if ( msgPtr )
{
msgPtr->hdr.event = KEY_CHANGE;
msgPtr->state = state;
msgPtr->keys = keys;
osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr );
}
return ( ZSuccess );
}
else
return ( ZFailure );
}
- 然后该任务的服务程序(SampleApp_ProcessEvent())接收到该消息事件,并处理该事件。