BES2300 代碼主架構筆記

1、BES的內核用的是RTX的內核,並且用了ARM推廣的CMSIS_RTOS API接口;這樣做的好處是可以方便內核的更換,方便移植上層代碼。
在這裏插入圖片描述在這裏插入圖片描述
2、程序是從RTX_CM_LIB.H裏面的_main_init()開始的,裏面包括了內核的初始化,堆棧的設置,線程任務main的創建,內核的開啓。
此函數以絕對的物理內存地址定義在內存開始段中,上電直接運行。
在這裏插入圖片描述
3、然後,程序開啓了第一個線程main的運行,在Main.cpp文件中。
在這裏插入圖片描述
4、需要提及的是CMSIS_RTOS API中,經常以這種風格來定義線程跟定時器,郵件通訊等的配置;
在這裏插入圖片描述
app_thread爲線程loop函數,osThread其實是一個宏
在這裏插入圖片描述
其實現在就是取os_thread_def_app_thread的地址,而這個地址從何而來?
一般在線程創建的文件中,會看到如下圖這樣的定義:
在這裏插入圖片描述
osThreadDef其實也是一個宏
在這裏插入圖片描述
到了這裏,我們知道了os_thread_def_app_thread的數據源了,是一個結構體變量初始化賦值,看其結構類型:
在這裏插入圖片描述
至此我們應該就能清楚明白了整個線程創建的定義了,通過osThreadDef設置線程名,優先級,堆棧大小,通過osThread獲取配置的結構體變量的指針,作爲形參傳入osThreadCreate()函數中。
在這裏插入圖片描述
5、以上的案列,我們看到了最重要的一個線程的創建過程,這個線程就是app_thread線程,它在app_thread.c裏面的app_os_init()函數裏面創建,由main調用或者app_init()調用。這個線程將是以後應用模塊修改跟添加的主要線程。
6、下面,我們看一下app_thread線程裏面模塊設計的實現。
在這裏插入圖片描述
我們可以看到在app_thread線程中,反覆的在獲取郵件信息app_mailbox_get(),並傳入mod_handler[]裏面
在這裏插入圖片描述
看其數據類型
在這裏插入圖片描述
是一個函數指針數組,再看其數組下標的定義。
在這裏插入圖片描述
我們再看一下,誰用到了mod_handler[]。
在這裏插入圖片描述
看下app_set_threadhandle原型
在這裏插入圖片描述
到此,我們看到了app_thread線程中,設置各模塊,事件回調函數的API。
全局搜索下,誰調用了app_set_threadhandle?
在這裏插入圖片描述
7、繼續研究app_thread線程中,模塊的架構以及驅動層的調用。我們就從app_set_threadhandle的調用,進入到APP_MODUAL_BATTERY模塊,分析具體的代碼。
在這裏插入圖片描述
可以看到app_battery_open()調用了 app_set_threadhandle(APP_MODUAL_BATTERY, app_battery_handle_process);其中,app_battery_handle_process()就是app_thread線程回調的模塊調用函數。
另外可以看一下文件目錄結構:在這裏插入圖片描述在這裏插入圖片描述
後續自己的模塊可以按照它SDK的風格,加入進來。
我們繼續看代碼,
在這裏插入圖片描述
app_battery_open()是由app_init()調用的,初始化battery模塊。
其中,battery模塊用到的全局變量爲
在這裏插入圖片描述
數據結構爲

在這裏插入圖片描述
在這裏插入圖片描述
從變量的初始化,我們可以看到客製化的設置,在tgt_hardware.h裏面
在這裏插入圖片描述
其他客製化的設置,也可以一併在這個頭文件裏面看看。
在app_battery_handle_process()裏面,我們可以看到
在這裏插入圖片描述
電池電量的獲取以及更新,並通過BLE傳給手機。
在這裏插入圖片描述
通過APP_BATTERY_STATUS_OVERVOLT看到app_battery_irqhandler()裏面發起的事件
在這裏插入圖片描述
app_battery_measure.cb在app_battery_open()中有定義,

在這裏插入圖片描述
在這裏插入圖片描述
可以看到app_battery_event_process()發出的郵件信息。
回到app_battery_irqhandler(),

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

通過追蹤,我們看到了定時器開啓的app_battery_timehandler()回調。
至此,我們看到了battery模塊電池電量的獲取,中間層的流程,定時器,間隔固定時間通過驅動層獲取當前電量的值,給到模塊事件處理,再給到應用層。
關於定時器的配置和設置,上面有講過CMSIS_RTOS的風格,這裏就不追蹤了。
8、我們看下battery模塊,用到的ADC驅動層的代碼應用。

在這裏插入圖片描述
在這裏插入圖片描述
通過這個入口所在的文件,看下驅動層所在的文件路徑:
在這裏插入圖片描述
後續驅動的調用跟運用,可以看這個文件夾裏面的文件。
回到代碼:
在這裏插入圖片描述
可以看到,傳入的回調函數指針,賦值給了 gpadc_event_cb[channel] ,另外,用到驅動的地方,要加互斥鎖。
在這裏插入圖片描述
追蹤gpadc_event_cb的調用,進入hal_gpadc_irq_handler()

在這裏插入圖片描述
在這裏插入圖片描述
通過上圖,我們看到 gpadc_event_cb調用了app_battery_irqhandler,並傳入了ADC掃描到的值。
在這裏插入圖片描述
以上,爲ADC最底層接口。
我們再通過hal_gpadc_irq_handler(),追蹤

在這裏插入圖片描述
在這裏插入圖片描述
以上,是ADC開啓中斷獲取的流程 ,至此,驅動層開啓ADC獲取電量值的流程。
9、除app_thread主要線程外,我們可以看到還有BT跟audio一些線程,關於線程間的通信,以及BLE應用層處理的流程,今後再更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章