dialog DA14580 SDK版本:5.0.4。
本文介紹了SDK的運行流程,剖析arch_main.c的工作過程。
dialog的BLE協議棧,本來是想學習一下,看看是否能夠移植到其他平台上,但是學習到目前,沒看到希望。之前也了解過過TCP/IP協議棧(LWIP),有足夠的獨立性,可以自成體系,底層接口、上層API都很明晰,即使不懂內部運作,移植起來也不費力。但是,,,,,Dialog的這個協議棧明顯是,,,沒有多少的獨立性。且不說它的底層,沒有明顯的統一的底層接口,更主要的是它跟一個偽/微操作系統緊密耦合在一起,構成一個整體,自然,操作系統是內置在芯片中ROM函數的,還有BLE的主機控制器接口及一下幾層都是內置在芯片的ROM中,只留出了API接口。所以暫時無法把BLE協議棧跟芯片、偽/微OS分割開。但是通過它了解BLE協議的運行還是可以的。當然,水平有限,如有不當,請多多斧正。
廢話不多說,來看正文。
1、初始化:
1.1、平台初始化:
看門狗、時鍾、IO、存儲器、外設、散列處理器、RF。
其中,IO(GPIO_init()->GPIO_reservations())、外設初始化(periph_init())可以有限的自行配置。
1.2、BLE初始化:
內核、電源、時鍾;清除中斷;RW初始化;鏈路層任務、屬性協議任務、通用訪問層規范任務初始化(注冊初始化函數);開啟BLE內核;RF校准;關閉睡眠;
1.3、應用初始化:
APP初始化:
復位任務環境;
創建APP任務(TASK_DESC_APP->app_default_handler->app_default_state->app_entry_point_handler),初始化任務變量(關閉狀態);
初始化后的用戶的初始化(user_app_main_loop_callbacks..app_on_init= user_app_init,)包括制造商標識初始化(mnf_data_init)、默認APP應用初始化(default_app_on_init),在該函數中可以看的添加的服務種類:電池服務、發現服務、在線更新固件服務等,這樣需要相應的“開關”開啟的。
鏈路層驅動的睡眠功能初始化;
1.4、時序設置、看門狗設置。
2、BLE事件調度(schedule_while_ble_on()):
這是個while循環,循環中處理這樣幾個事情:首先檢查BLE是否上電了,然后獲取BLE的事件結束標志。執行消息和事件的調度。如果BLE事件結束標志置位了,就執行RF校准(包涵溫度和頻率的校准)、APP的異步事件等。
while循環退出的條件是:app_asynch_trm() == GOTO_SLEEP,即:user_app_main_loop_callbacks.app_on_ble_powered()。user_callback_config.h。目前是NULL。可以修改。
rwip_schedule()是內置於ROM中,目前還不清楚是怎么運行的。
3、進入睡眠等待中斷:
如果GLT空閑,關閉中斷,異步睡眠處理,關閉RW電源,關閉RF電源,關閉看門狗,進入睡眠模式。
4、從中斷中喚醒
恢復操作arch_resume_from_sleep(),開啟中斷,開啟看門狗。