一 事件机制
每一个任务都会有很多种事件,包括系统消息、任务事件等等。
二 事件的触发启动
函数1:启动一个定时器、定时delaytime时间、之后触发TaskID的event事件.延时时间以ms为单位。
osal_start_timerEx( TaskID,
event,delaytime);
函数2:置 tasksEvents[]数组的事件标志位为1、系统轮询这个数组确定是否触发事件
osal_set_event( simpleBLEPeripheral_TaskID, SBP_START_DEVICE_EVT );
三 消息机制之创建发送
keyChange_t *msgPtr;
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 );
}
二 消息机制之接收处理
if ( events & SYS_EVENT_MSG )
{
uint8 *pMsg;
if ( (pMsg = osal_msg_receive( SimpleOsal_TaskID )) != NULL )// 接收消息
{
SimpleOsal_ProcessOSALMsg( (osal_event_hdr_t *)pMsg)//处理消息
VOID osal_msg_deallocate( pMsg)
//删除消息空间
}
return (events ^ SYS_EVENT_MSG);
}
二 按键处理过程:
1.按键初始化
HalDriverInit();
---> HalKeyInit();// 相关寄存器的设置、 这个函数协议栈里边默认是使能的
..........
-->HAL_KEY_SW_6_SEL &= ~(HAL_KEY_SW_6_BIT); /* Set pin function to GPIO */
-->HAL_KEY_SW_6_DIR &= ~(HAL_KEY_SW_6_BIT); /* Set pin direction to Input */
.........
2.注册按键回调函数:
void InitBoard( uint8 level )
----> HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);
//这个函数对,按键相关的寄存器设置为中断模式(协议栈默认的情况下是使用中断方式处理这个按键)
//同时向协议栈注册回调函数OnBoard_KeyCallback();
3.按键注册函数:
osal_init_system();
----->osalInitTasks();//各任务初始化
----> SimpleOsal_Init( task_id )//application任务初始化函数
------>uint8 RegisterForKeys( uint8 task_id )
/ / 将第一个调用这个函数的TASK_ID 赋值给一个registeredKeysTaskID全局变量
4.按键中断处理函数-----hal_key.h发生中断时的调用顺序
HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )
--> halProcessKeyInterrupt()-----产生HAL事件
-->osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_DEBOUNCE_VALUE);
//启动Hal_TaskID任务的HAL_KEY_EVENT事件处理过程这个处理函数定义在hal_driver.c里边
--> uint16 Hal_ProcessEvent( uint8 task_id, uint16 events )
--->HalKeyPoll();按键轮询函数----获得键值
-
->(pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL);//这里调用按键回调函数处理按键
--->OnBoard_KeyCallback()--处理键值向注册按键服务的任务发生消息
---> OnBoard_SendKeys ()
--->osal_msg_send() 发送消息的函数
ble协议栈cc2540x-1.3.2之通过key处理过程看任务、事件、消息机制