OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3757|回复: 0

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

[复制链接]

5

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2019-9-17
在线时间
21 小时
发表于 2020-8-18 17:58:08 | 显示全部楼层 |阅读模式
再阅读之前,你需要: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);


共同学习,一起进步


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表