再閱讀之前,你需要:
1. nimble 協議棧官方源碼
首先分析nimble源碼目錄架構:
整個nimble協議棧共包含6個目錄:
- /apps 文件夾包含了使用nimble協議棧實現的藍牙應用程序。
- /docs 文件夾包含了nimble協議棧的一些說明文檔,后綴為.rst
- /ext 文件夾包含了nimble 協議棧使用的加密庫
- /nimble 文件夾包含了整個 nimble 協議棧代碼實現
- /porting 文件夾包含了nimble 協議棧移植到不同os上所需的適配的API
- /targets 不關心的文件夾(我也不曉得是撒子,單元測試?)
我們最需要關心的是 /nimble 目錄和 /porting 目錄
整個nimble藍牙協議棧的拓撲結構如下:
/nimble 目錄:主機與控制器協議棧實現
協議棧的實現包含了5個目錄:
- /controller,該目錄包含控制器側的協議棧實現
- /drivers,該目錄包含控制器協議棧對藍牙射頻芯片硬件的驅動API原型和實現,因為控制器協議棧與硬件是直接耦合的,所以對不同的芯片,驅動接口的實現不同
- /host,該目錄包含主機側的協議棧,以及各種服務的實現
- /include,該目錄包含了一些外部提供的API原型,比如:主機協議棧和控制器協議棧都會調用的HCI通信API原型(在ble_hci_trans.h中),以及主機協議棧與OS相關的API原型(nimble_npl.h文件中)
- /transport,該目錄包含了不同HCI類型對應的HCI的通信API實現
/porting目錄:移植目錄
該目錄包含4個文件夾:
- /examples,移植到不同OS平台完成后的協議棧啟動示例,dummy與linux
- /nimble,nimble協議棧移植的剩余部分(這些接口可能都不需要更改,根據實際使用環境而定)
- /npl,不同os平台的移植目錄,該目錄主要實現了主機協議棧在不同OS平台的操作api實現,這些 api 原型在 nimble_npl.h 文件中
- /targets,不關心,我也不曉得是撒子
/porting/nimble目錄:移植剩余目錄?研究一下
該目錄總共包含兩個頭文件,include和src
我們主要研究/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 池的初始化與注冊
共同學習
一起進步