自己移植nimble_0.nimble蓝牙协议栈架构

 

再阅读之前,你需要:

 

 

1. nimble 协议栈官方源码

 

 

首先分析nimble源码目录架构:

 

 

整个nimble协议栈共包含6个目录:

  1. /apps 文件夹包含了使用nimble协议栈实现的蓝牙应用程序。
  2. /docs 文件夹包含了nimble协议栈的一些说明文档,后缀为.rst
  3. /ext   文件夹包含了nimble 协议栈使用的加密库
  4. /nimble 文件夹包含了整个 nimble 协议栈代码实现
  5. /porting 文件夹包含了nimble 协议栈移植到不同os上所需的适配的API
  6. /targets  不关心的文件夹(我也不晓得是撒子,单元测试?)

我们最需要关心的是 /nimble 目录和 /porting 目录

整个nimble蓝牙协议栈的拓扑结构如下:

 

 

/nimble 目录:主机与控制器协议栈实现

 

 

协议栈的实现包含了5个目录:

  1. /controller,该目录包含控制器侧的协议栈实现
  2. /drivers,该目录包含控制器协议栈对蓝牙射频芯片硬件的驱动API原型和实现,因为控制器协议栈与硬件是直接耦合的,所以对不同的芯片,驱动接口的实现不同
  3. /host,该目录包含主机侧的协议栈,以及各种服务的实现
  4. /include,该目录包含了一些外部提供的API原型,比如:主机协议栈和控制器协议栈都会调用的HCI通信API原型(在ble_hci_trans.h中),以及主机协议栈与OS相关的API原型(nimble_npl.h文件中)
  5. /transport,该目录包含了不同HCI类型对应的HCI的通信API实现

/porting目录:移植目录

 

 

该目录包含4个文件夹:

  1. /examples,移植到不同OS平台完成后的协议栈启动示例,dummylinux
  2. /nimblenimble协议栈移植的剩余部分(这些接口可能都不需要更改,根据实际使用环境而定)
  3. /npl,不同os平台的移植目录,该目录主要实现了主机协议栈在不同OS平台的操作api实现,这些 api 原型在 nimble_npl.h 文件中
  4. /targets,不关心,我也不晓得是撒子

 

/porting/nimble目录:移植剩余目录?研究一下

 

 

 

该目录总共包含两个头文件,includesrc

 

我们主要研究/src目录吧

 

 

 

/endian.c : 查看源代码,该库主要提供数组与整型按大/小端转换,数组颠倒,数组倒序交换

 

/hal_timer.c : 该文件主要提供一个基于nrf52 硬件平台的定时器服务库,这些定时服务API主要供 /os_cputIme.c 调用

 

/mem.c : 提供了分配内存池并初始化的操作,还提供了从内存池中分段的操作

 

/nimble_port.c : 提供了移植通用操作库,比如 nimble_port_init() 启动nimble 协议栈,nimble_port_run() 主机协议栈处理函数,nimble_port_get_dflt_eventq() 获得nimble主机协议栈的默认事件队列, nimble_port_ll_task_func() 控制器协议栈处理函数。

 

/os_cputime.c : CPU时间服务模块,该模块为控制器提供时间(定时与延时)服务(控制器协议栈与硬件直接耦合),该模块使用 /hal_timer.c 提供的接口  

 

/os_cputime_pwr.c : 类似CPU时间服务模块的补充api   

 

/os_mbuf.c : 该文件是 mbuf 操作库,mbuf 是用来存储数据的结构体,这个库提供了协议栈对mbuf的所有操作API                         

 

/os_mempool.c : 该文件提供了操作内存池的API

 

/os_msys_init.c : 该文件提供了一个静态内存区,如下:

 

这个静态内存区作为 mbuf 池,并将这个mbuf池以 msys 的类型注册进nimble协议栈。所以 /os_msys_init.c 文件主要提供一个 msys 类型的 mbuf 池的初始化与注册

 

共同学习

一起进步

 

posted @ 2020-08-13 18:04  书山有  阅读(2438)  评论(0编辑  收藏  举报