BLE-NRF518223-sdk程序框架剖析.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 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  

文档评论(0)

希望之星 + 关注
实名认证
内容提供者

我是一名原创力文库的爱好者!从事自由职业!

1亿VIP精品文档

相关文档