RTT 移植的 nimble 蓝牙协议栈的思路整理——2.RTT协议栈移植工程为 NimBle 协议栈做的API适配

再阅读之前,你需要:

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);

 

 

共同学习,一起进步

 

posted @ 2020-08-12 11:11  书山有  阅读(1305)  评论(0)    收藏  举报