- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
BLE-NRF51822教程3-sdk程序框架剖析
【IT168 技术】本讲为框架介绍,不会牵涉到太多代码细节。51822的官方SDK其实是没有框架依耐性的。什么叫框架,比如TI的BLE SDK中就有一个 HYPERLINK /list/b/0501_1.shtml \o 操作系统 \t _blank 操作系统抽象层(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个函数设备一样可以运行, HYPERLINK /list/b/0302_1.shtml \o 手机 \t _blank 手机也能搜到设备并与设备通信。
这种初始化的方式可以说是与我们一般的单片机开发没有区别。
那么初始化之后呢。以前的裸板单片机开发我们就是进入一个while循环执行一些周而复始的事,后面为了降低功耗开始在while(1)循环中加个睡眠代码让没有工作时 HYPERLINK /list/b/1420_1.shtml \o 芯片 \t _blank 芯片处于睡眠状态,并依靠中断来唤醒从而处理到来的事物。
而上面的51822的main函数最后也是一个for{}循环,power_manage(); 内部代码其实就是一个睡眠指令。Main函数到这里就已经没了,最后其实就是一个循环睡眠。这里看不到任何任务(task),只有睡眠。那么可想而知,51822的协议栈实现应该是基于”事件唤醒”的,也就是没事的时候睡眠,有事的时候唤醒工作而后继续睡眠。那么那些处理事件的代码都是在哪里的?
那协议栈到底是怎么运作的?我希望创建一个服务在哪里添加? HYPERLINK /Mobile/10734_1.html \o 手机 \t _blank 手机发送来的数据在哪里?我怎么发送数据给手机?
下面一一解释这些问题:
协议栈如何运作?
要明白协议栈怎么运作,首先就要理解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_
文档评论(0)