再阅读之前,你需要:1. nimble 协议栈官方源码2. RTT的 nimble 移植工程 RTT为移植nimble协议栈所做的适配API都在如下工程目录里中 rtt-nrf52832-nimble\packages\NimBLE-latest\porting\npl\rtthread Include 目录内容如下: Src 目录内容如下:
最重要的:这两个目录存在目的是为了让nimble协议栈可以正常在RTT操作系统上运行。nimble协议栈会调用一些涉及到系统资源的接口,针对这些接口,不同的操作系统的具体实现不同,比如:信号量,队列,定时器等等。所以,为了让nimble协议栈可以在RTT上运行,我们需要以RTT的系统API实现nimble协议栈的系统资源接口(这种方式称为适配)。 幸运的是,所有需要适配的函数已经在 nimble 的官方协议栈的 nimble_npl.h 文件中列出了函数原型。 该文件目录:rtt-nrf52832-nimble\packages\NimBLE-latest\nimble\include\nimble。
nimble_npl.h文件定义的函数原型绝大部分在上面的src目录的npl_os_rtthread.c 源文件中实现。 另一个很重要的:在上面的src目录下,存在一个nimble_port_rtthread.c文件,该文件主要实现了两个接口。接口1:int nimble_port_rtthread_init(void);
这个函数是RTT自定义的,nimble协议栈并没有定义标准函数原型。该接口中调用了nimble_port_init 函数来初始化协议栈(主机和控制器协议栈),控制器协议栈可通过宏来选择性的初始化。 在该接口中,如果配置了控制宏:NIMBLE_CFG_CONTROLLER则会创建并直接运行控制器初始化和协议栈处理线程 ble_ll_task()
该函数会对控制器进行硬件初始化,并直接运行控制器的协议栈处理函数 特别注意(如果你跟我一样,不了解RTT的话): RTT使用了下面的宏在RTT调度器启动之前(即rtthread_startup 函数中)调用该接口,初始化nimble协议栈,从而不需要显式的执行协议栈初始化函数。
接口2: void ble_hs_thread_startup(void);
这个函数同样是RTT自定义的,nimble协议栈并没定义标准函数原型。RTT把该函数的原型定义在了nimble_npl.h 文件中。 蓝牙应用程序调用该函数来启动主机协议栈处理线程。该接口主要是调用如下函数来启动主机协议栈处理函数 void nimble_port_run(void);
共同学习,一起进步
|