- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
BLE-NRF51822教程3-sdk程序框架剖析 【IT168 技术】本讲为框架介绍,不会牵涉到太多代码细节。51822的官方SDK其实是没有框架依耐性的。什么叫框架,比如TI的BLE SDK中就有一个操作系统抽象层(OSAL)他是一个轮训的调度。你需要按照他的方式去创建任务等等。 而51822的SDK本质上只是提供了各种调用接口,比如开启初始化协议栈,初始化一些硬件功能模块,开始广播,发起链接等等。这些接口怎么用完全取决于自己。不过一般固件开发都是一些类似的流程各种资源的初始化,51822也不例外。所以sdk中的作为从机的例子main函数都是类似如下的步骤: 以官方的串口BLE 为例: int main(void) { leds_init(); //非必须,只是该例子中用到了 timers_init(); //非必须,只是该例子中用到了 buttons_init(); //非必须,只是该例子中用到了 uart_init(); //非必须,只是该例子中用到了串口 ble_stack_init(); //必须 gap_params_init(); //必须 services_init(); //跟自己创建的服务相关,不同的服务细节不同但大体建立 //过程基本一致,通常在直接使用官方的例子修改一些参数即可 advertising_init(); //广播数据初始化,必须 conn_params_init(); //是情况而定,如果连接后不需要连接参数的协商,该初始化也 //可不要 sec_params_init(); //安全参数初始化,如果没用到配对绑定相关这个也可以不初始化 advertising_start(); //开启广播,必须 // Enter main loop for (;;) { power_manage(); //进入睡眠 } } 可以看到其实核心必要的只有这5个函数而已。你可以将其他代码全都去掉,只要留下这5个函数设备一样可以运行,手机也能搜到设备并与设备通信。 这种初始化的方式可以说是与我们一般的单片机开发没有区别。 那么初始化之后呢。以前的裸板单片机开发我们就是进入一个while循环执行一些周而复始的事,后面为了降低功耗开始在while(1)循环中加个睡眠代码让没有工作时芯片处于睡眠状态,并依靠中断来唤醒从而处理到来的事物。 而上面的51822的main函数最后也是一个for{}循环,power_manage(); 内部代码其实就是一个睡眠指令。Main函数到这里就已经没了,最后其实就是一个循环睡眠。这里看不到任何任务(task),只有睡眠。那么可想而知,51822的协议栈实现应该是基于”事件唤醒”的,也就是没事的时候睡眠,有事的时候唤醒工作而后继续睡眠。那么那些处理事件的代码都是在哪里的? 那协议栈到底是怎么运作的?我希望创建一个服务在哪里添加?手机发送来的数据在哪里?我怎么发送数据给手机? 下面一一解释这些问题: 协议栈如何运作? 要明白协议栈怎么运作,首先就要理解51822的协议栈是基于100%的事件驱动的。就是说协议栈向app发送的任何数据都是基于事件的。 比如设备收到手机发来的链接请求,或是手机发过来的数据等等。协议栈首先收到这些数据后做一些处理,然后将这些数据(比如链接请求,或是普通数据等)打包成一个结构体,并附上事件ID,比如BLE_GAP_EVT_CONNECTED或BLE_GATTS_EVT_WRITE来分别告诉上层app这个事件结构体代表的事件。 比如BLE_GAP_EVT_CONNECTED代表链接事件,那么这个事件结构体中包含的数据就是连接参数等数据。而BLE_GATTS_EVT_WRITE代表写事件,那么结构体中的数据就是对端设备(比如手机)写给板子的数据。 比如uart的demo中dispatch派发函数?static void ble_evt_dispatch(ble_evt_t * p_ble_evt){??? ble_conn_params_on_ble_evt(p_ble_evt);??? ble_nus_on_ble_evt(m_nus, p_ble_evt);??? on_ble_evt(p_ble_evt);} 在任何与BLE相关的事件被协议栈上抛上来给app时,ble_evt_dispatch就会被调用。从而将事件抛给各个服务函数或处理模块,这里是将事件抛给了 连接参数管理处理函数ble_conn_params_on_ble_evt Uart服务的事件处理函数ble_nus_on_ble_evt (nus为Nordicuart server) 通用的事件处理函数on_ble_evt
您可能关注的文档
最近下载
- 肺吸入给药剂型及临床应用答案-2025年执业药师继续教育.docx VIP
- 交通运输工作汇报工作汇报PPT.pptx VIP
- 铁路工程测量:铁路轨道施工测量PPT教学课件.pptx
- 成都市青白江区公务车辆定点维修采购招标文件.doc VIP
- PDCA提高卧床患者踝泵运动锻炼的正确率.pptx VIP
- 2023年最新资料员考试题库附参考答案【精练】.docx
- 工业设计报价单格式2023.pdf VIP
- 党课:扣好人生的第一粒扣子PPT部队官兵思想教育党课.pptx VIP
- 牛津自然拼读world 5 Unit 2 ou ow oi oy oo u Lesson 1 课件.ppt VIP
- 08D800-4民用建筑电气设计与施工 照明控制与灯具安装.pdf VIP
原创力文档


文档评论(0)