蓝牙协议栈按键流程分析样本.doc_第1页
蓝牙协议栈按键流程分析样本.doc_第2页
蓝牙协议栈按键流程分析样本.doc_第3页
蓝牙协议栈按键流程分析样本.doc_第4页
蓝牙协议栈按键流程分析样本.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

蓝牙协议栈按键流程分析样本 蓝牙协议栈按键流程分析本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。 文档如有不当之处,请联系本人或网站删除。 是在介绍蓝牙按键流程分析之前,我们需要了解一个概念,那就是就是OSAL。 是什么是OSAL呢?于可能大伙对于OS是比较了解的,学了计算机的搞过OS的也基本接触过,简单来说就是一个操作系统抽象层,能够理解为运行在CC2540上的操作系统,说操作系统还不能算,TI的的OSAL只实现了任务切换和消息机制。 并且把协议栈的代码、硬件处理的代码,用户程序的代码等分别放到了OSAL层的不同任务处理函数中去了,各任务函数之间通过消息机制、同一个任务之间通过事件的的方式来通信。 什么是EVENT事件?OSAL为每个任务函数分配了一个16位的事件变量,每一位代表一个事件,最高位为0x8000表示为系统事件SYS_EVENT_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列表中触发一个message ready event。 (请注意最后一句话,这句话点出了为什么按键时间的触发为何会导致系统事件也接受到了)现在以SimpleBLEPeripheral为例说明按键流程在SimpleBLEPeripheral任务初始化函数中有这样一条代码:/Register forall keyevents-This appwill handleall keyevents RegisterForKeys(simpleBLEPeripheral_TaskID);这个函数源文件中/*Keyboard Registerfunction*The keyboardhandler issetup tosend all keyboard changesto*one task(if atask isregistered).*If atask registers,it willget allthe keys.You canchange this*to registerfor individualkeys.*/uint8RegisterForKeys(uint8task_id)/Allow onlythe firsttask if(registeredKeysTaskID=NO_TASK_ID)本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。 文档如有不当之处,请联系本人或网站删除。 registeredKeysTaskID=task_id;return(true);else return(false);向一个全局变量registeredKeysTaskID中赋值自己的任务ID,调用了这个函数就能成功注册按键服务,那这个全局变量在何时使用呢?从分析到这里,感觉有点迷糊了,我们能够从顶到下分析。 任何一个程序都是从main函数开始的,这点我们要坚信。 所个以我们首先找到这个main函数*fn main*brief Startof application.*param none*return none*/int main(void)/*Initialize hardware*/HAL_BOARD_INIT();/Initialize boardI/O InitBoard(OB_COLD);/*Initialze theHAL driver*/HalDriverInit();/*Initialize NVsystem*/osal_snv_init();/*Initialize LL*/*Initialize theoperating system*/osal_init_system();本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。 文档如有不当之处,请联系本人或网站删除。 /*Enable interrupts*/HAL_ENABLE_INTERRUPTS();/Final boardinitialization InitBoard(OB_READY);#if defined(POWER_SAVING)osal_pwrmgr_device(PWRMGR_BATTERY);#endif/*Start OSAL*/osal_start_system();/No Returnfrom herereturn0;我们打开InitBoard(OB_READY);能够看到如下代码/*fn InitBoard()*brief Initializethe CC2540DB BoardPeripherals*param level:COLD,WARM,READY*return None*/void InitBoard(uint8level)if(level=OB_COLD)/Interrupts offosal_int_disable(INTS_ALL);/Turn allLEDs offHalLedSet(HAL_LED_ALL,HAL_LED_MODE_OFF);/Check forBrown-Out reset/ChkReset();else/!OB_COLD/*Initialize Keystuff*/OnboardKeyIntEnable=HAL_KEY_INTERRUPT_ENABLE;/OnboardKeyIntEnable=HAL_KEY_INTERRUPT_DISABLE;HalKeyConfig(OnboardKeyIntEnable,OnBoard_KeyCallback);看到我上面标注的函数了吧?那个是一个按键回调服务注册函数,注册了一个OnBoard_KeyCallback函数HalKeyConfig函数的实现:本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。 文档如有不当之处,请联系本人或网站删除。 将上述的回调函数的地址复制给了函数指针变量。 通过跟踪发现该函数的指针变量在按键的轮询函数中调用了,如下图:/*fn HalKeyPoll*brief Calledby hal_driver topoll the keys*param None*return None*/void HalKeyPoll(void)uint8keys=0;uint8notify=0;#if defined(CC2540_MINIDK)if(!(HAL_KEY_SW_1_PORT&HAL_KEY_SW_1_BIT)/*Key isactive low*/keys|=HAL_KEY_SW_1;if(!(HAL_KEY_SW_2_PORT&HAL_KEY_SW_2_BIT)/*Key isactive low*/keys|=HAL_KEY_SW_2;#else if(!(HAL_KEY_SW_6_PORT&HAL_KEY_SW_6_BIT)/*Key isactive low*/keys|=HAL_KEY_SW_6;if(HAL_KEY_JOY_MOVE_PORT&HAL_KEY_JOY_MOVE_BIT)/*Key isactive HIGH*/keys=halGetJoyKeyInput();#endif/*If interruptsare notenabled,previous keystatus andcurrent keystatus*are paredto findout ifa keyhas changedstatus.*/if(!Hal_KeyIntEnable)本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。 文档如有不当之处,请联系本人或网站删除。 if(keys=halKeySavedKeys)/*Exit-since nokeys havechanged*/return;elsenotify=1;else/*Key interrupthandled here*/if(keys)notify=1;/*Store thecurrent keysfor parationnext time*/halKeySavedKeys=keys;/*Invoke Callbackif newkeys weredepressed*/if(notify&(pHalKeyProcessFunction)(pHalKeyProcessFunction)(keys,HAL_KEY_STATE_NORMAL);在这里底层的按键查询函数调用一个函数指针,而非具体的函数,这样就将处理按键的接口留给了上层,上层应用中,叧需解析的函数指针传入的参数1:keys就知道是哪个按键被按下了。 我们再回到刚才的OnBoard_KeyCallback回调函数处,该回调函数代码如下:/*fn OnBoard_KeyCallback*brief Callbackservice for keys*param keys-keys thatwere pressed*state-shifted*本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。 文档如有不当之处,请联系本人或网站删除。 *return void*/void OnBoard_KeyCallback(uint8keys,uint8state)uint8shift;(void)state;/shift key(S1)is usedto generatekey interrupt/applications shouldnot useS1when keyinterrupt isenabled shift=(OnboardKeyIntEnable=HAL_KEY_INTERRUPT_ENABLE)?false:(keys&HAL_KEY_SW_6)?true:false);if(OnBoard_SendKeys(keys,shift)!=SUCCESS)/就是这句话将按键消息上传到应用层去处理的/Process SW1here if(keys&HAL_KEY_SW_1)/Switch1/Process SW2here if(keys&HAL_KEY_SW_2)/Switch2/Process SW3here if(keys&HAL_KEY_SW_3)/Switch3/Process SW4here if(keys&HAL_KEY_SW_4)/Switch4/Process SW5here if(keys&HAL_KEY_SW_5)/Switch5/Process SW6here if(keys&HAL_KEY_SW_6)/Switch6/*If anykey iscurrently presseddown andinterrupt isstill enabled,disable interruptand switchto polling*/if(keys!=0)本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。 文档如有不当之处,请联系本人或网站删除。 if(OnboardKeyIntEnable=HAL_KEY_INTERRUPT_ENABLE)OnboardKeyIntEnable=HAL_KEY_INTERRUPT_DISABLE;HalKeyConfig(OnboardKeyIntEnable,OnBoard_KeyCallback);/*If nokey iscurrently presseddown andinterrupt isdisabled,enable interruptand turnoff polling*/elseif(OnboardKeyIntEnable=HAL_KEY_INTERRUPT_DISABLE)OnboardKeyIntEnable=HAL_KEY_INTERRUPT_ENABLE;HalKeyConfig(OnboardKeyIntEnable,OnBoard_KeyCallback);进入按键消息发送函数中能够看到/*fn OnBoard_SendKeys*brief SendKey Pressedmessage toapplication.*param keys-keys thatwere pressed*state-shifted*return status*/uint8OnBoard_SendKeys(uint8keys,uint8state)keyChange_t*msgPtr;if(registeredKeysTaskID!=NO_TASK_ID)/Send theaddress tothe taskmsgPtr=(keyChange_t*)osal_msg_allocate(sizeof(keyChange_t);if(msgPtr)msgPtr-=KEY_CHANGE;msgPtr-state=state;本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。 文档如有不当之处,请联系本人或网站删除。 msgPtr-keys=keys;osal_msg_send(registeredKeysTaskID,(uint8*)msgPtr);return(SUCCESS);else return(FAILURE);主要是将按键时间,状态和按键值打包到信息中最后通过osal_msg_send(registeredKeysTaskID,(uint8*)msgPtr);发送到注册了按键服务的应用层去,最终用户按了哪个按键,如何响应该按键在系统事件SYS_EVENT_MSG中处理。 疑问又来了,为什么通过osal_msg_send收发的消息会出现在SYS_EVENT_MSG中呢?的这个疑问,就是刚才我说过的osal_msg_send(registeredKeysTaskID,(uint8*)msgPtr)会产生一个a messageready eventin thedestination tasksevent list./*fn osal_msg_send*brief*This functionis calledby atask tosend amand message to*another taskor processingelement.The sending_task fieldmust*refer toa validtask,since thetask IDwill beused*for theresponse message.This functionwill alsoset amessage*readyeventin thedestination tasksevent list.*param uint8destination_task-Send msgto TaskID*param uint8*msg_ptr-pointer tonew messagebuffer*return SUCCESS,INVALID_TASK,INVALID_MSG_POINTER*/uint8osal_msg_send(uint8destination_task,uint8*msg_ptr)return(osal_msg_enqueue_push(destination_task,msg_ptr,FALSE);/*fn simpleBLEPeripheral_ProcessOSALMsg*brief Processan iningtask message.本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。 文档如有不当之处,请联系本人或网站删除。 *param pMsg-messagetoprocess*return none*/static voidsimpleBLEPeripheral_ProcessOSALMsg(osal_event_hdr_t*pMsg)switch(pMsg-event)#if defined(CC2540_MINIDK)case KEY_CHANGE:/按键处理事件,用户产生的按键都是在这里处理simpleBLEPeripheral_HandleKeys(keyChange_t*)pMsg)-state,(keyChange_t*)pMsg)-keys);break;#endif/#if defined(CC2540_MINIDK)default:/do nothingbreak;在SimpleBLEPeripheral中,对按键的响应如下:joystick right(SW2)收发广播的开启和关闭/*fn simpleBLEPeripheral_HandleKeys*brief Handlesallkeyevents forthis device.*param shift-true ifin shift/alt.*param keys-bit fieldforkeyevents.Valid entries:*HAL_KEY_SW_2*HAL_KEY_SW_1*return none*/static voidsimpleBLEPeripheral_HandleKeys(uint8shift,uint8keys)uint8SK_Keys=0;VOID shift;/Intentionally unreferencedparameter本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。 文档如有不当之处,请联系本人或网站删除。 if(keys&HAL_KEY_SW_1)SK_Keys|=SK_KEY_LEFT;if(keys&HAL_KEY_SW_2)SK_Keys|=SK_KEY_RIGHT;/if deviceis notin aconnection,pressing ther

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论