ble协议栈cc2540x-1.3.2之通过key处理过程看任务、事件、消息机制

来源:互联网 发布:matlab矩阵绝对值 编辑:程序博客网 时间:2024/04/30 14:39

一   事件机制

       每一个任务都会有很多种事件,包括系统消息、任务事件等等。

二   事件的触发启动

  函数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()  发送消息的函数


2 1