一 事件机制
每一个任务都会有很多种事件,包括系统消息、任务事件等等。
二 事件的触发启动
函数1:启动一个定时器、定时delaytime时间、之后触发 TaskID 的event事件.延时时间以ms为单位。
osal_start_timerEx( TaskID, event , delaytime );
函数2:置 tasksEvents[]数组的事件标志位为1、系统轮询这个数组确定是否触发事件
osal_set_event( simpleBLEPeripheral_TaskID, SBP_START_DEVICE_EVT );
三 消息机制之创建发送
//给消息定义一个结构体并分配
//设置结构体
msgPtr->hdr.event = KEY_CHANGE;
msgPtr->state = state;
msgPtr->keys = keys;
//发送消息
二 消息机制之接收处理
if ( events & SYS_EVENT_MSG )
{
uint8 *pMsg;
)// 接收消息
{
)//处理消息
) //删除消息空间
}
return (events ^ SYS_EVENT_MSG);
二 按键处理过程:
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 */
void InitBoard( uint8 level )
----> HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);
/这个函数对,按键相关的寄存器设置为中断模式(协议栈默认的情况下是使用中断方式处理这个按键)
//同时向协议栈注册回调函数 OnBoard_KeyCallback ();
osal_init_system() ;
-----> osalInitTasks(); //各任务初始化
------> 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 )
- ->( pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL); //这里调用按键回调函数处理按键
--->OnBoard_KeyCallback()--处理键值向注册按键服务的任务发生消息
---> OnBoard_SendKeys ()
--->osal_msg_send() 发送消息的函数