欢迎来到天天文库
浏览记录
ID:40509226
大小:21.08 KB
页数:11页
时间:2019-08-03
《蓝牙4.0协议栈按键流程分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、在介绍蓝牙按键流程分析之前,我们需要了解一个概念,那就是就是OSAL。什么是OSAL呢?可能大伙对于OS是比较了解的,学了计算机的搞过OS的也基本接触过,简单来说就是一个操作系统抽象层,可以理解为运行在CC2540上的操作系统,说操作系统还不能算,TI的OSAL只实现了任务切换和消息机制。并且把协议栈的代码、硬件处理的代码,用户程序的代码等分别放到了OSAL层的不同任务处理函数中去了,各任务函数之间通过消息机制、同一个任务之间通过事件的的方式来通信。什么是EVENT事件?OSAL为每个任务函数分配了一个16位的事件变量,每一位代表一个事件,最高位为0x8000表示为系统事件SYS_EVEN
2、T_MSG。其余的15位留给用户自定义需要的事件。通常事件由定时器启动,比如一秒后我要点亮LED2,这就需要发送一个点亮LED2的事件,然后等待定时器1s后溢出,于是启动点亮LED2事件,事件会调用相应的hal层API点亮LED2。什么是MSG消息MSG是比EVENT事件更具体并且可以携带数据的一种通信方式,MSG的标记是按数值,而不是按位。比如0x01和0x02是两个不同的消息,但对于事件0x03则是0x01事件和0x02事件的组合。MSG收发使用osal_msg_send()和osal_msg_receive();当调用osal_msg_send()发送一个msg的同时会在EVENT列
3、表中触发一个messagereadyevent。(请注意最后一句话,这句话点出了为什么按键时间的触发为何会导致系统事件也接受到了)现在以SimpleBLEPeripheral为例说明按键流程在SimpleBLEPeripheral任务初始化函数中有这样一条代码: //Registerforallkeyevents-Thisappwillhandleallkeyevents RegisterForKeys(simpleBLEPeripheral_TaskID);这个函数来自OnBoard.c源文件中/********************************************
4、**************************KeyboardRegisterfunction**Thekeyboardhandlerissetuptosendallkeyboardchangesto*onetask(ifataskisregistered).**Ifataskregisters,itwillgetallthekeys.Youcanchangethis*toregisterforindividualkeys.*********************************************************************/uint8Regist
5、erForKeys(uint8task_id){ //Allowonlythefirsttask if(registeredKeysTaskID==NO_TASK_ID) { registeredKeysTaskID=task_id; return(true); } else return(false);}向一个全局变量registeredKeysTaskID中赋值自己的任务ID,调用了这个函数就能成功注册按键服务,那这个全局变量在何时使用呢?分析到这里,感觉有点迷糊了,我们可以从顶到下分析。任何一个程序都是从main函数开始的,这点我们要坚信。所以我们首先找到这个main
6、函数打开SimpleBLEPeripheral_Main.c文件可以看到/***************************************************************************************************@fn main**@brief Startofapplication.**@param none**@return none*************************************************************************************
7、**************/intmain(void){ /*Initializehardware*/ HAL_BOARD_INIT(); //InitializeboardI/O InitBoard(OB_COLD); /*InitialzetheHALdriver*/ HalDriverInit(); /*InitializeNVsystem*/ osal_snv_init(); /*Init
此文档下载收益归作者所有