相信不少工程師在閱讀RT-Thread相關源代碼的時候,都會經常看到如下圖所示的宏定義,按照宏定義的命名來理解,這些宏定義似乎都是對一些初始化函數進行某些聲明工作。

如上圖所示,通過對源碼的跟蹤發現,這些INIT_XXX_EXPORT的宏定義,最終都是調用了INIT_EXPORT這個宏定義,而這個宏定義,就是把該初始化函數放在自定義的rti_fn符號段里面,源碼在rtdef.h頭文件里面,如下圖所示。

把初始化函數放到自定義的符號段里面,有什么作用呢?答案就是,可以通過這種方式,讓這些初始化函數被隱式調用,不用手動往RT-Thread的初始化過程里面添加該函數。
什么是隱式調用?隱式調用的意思就是,當我們往工程代碼里面添加某個系統組件或外接設備的時候,這個組件或設備都需要進行初始化,而這個初始化函數,我們不需要在main函數或RT-Thread的啟動函數里面直接添加調用,這樣可以避免修改RT-Thread的啟動過程代碼。
先來看一下RT-Thread的啟動函數調用流程,留意紅色方框里面的內容,如下圖所示。

啟動函數里面,rt_components_board_init() 與 rt_components_init()這兩個函數是專門用來處理自動初始化的,這兩個函數的原型和注釋,如下圖所示。

從上面的函數原型可以看出,這兩個函數都是從符號段區間里面,通過for循環不斷遍歷符號段里面的初始化函數,并獲取這些初始化函數的指針,然后進行調用,以達到對設備或組件初始化的目的。
rt_components_board_init()函數最先執行,這個函數是用來初始化芯片相關的硬件的,這個函數會遍歷用 INIT_BOARD_EXPORT(fn)聲明的函數列表。
rt_components_init()函數是在系統啟動后,在main線程里面被調用執行,這個函數是用來初始化其他用 INIT_XXX_EXPORT(fn)聲明的函數列表的。
目前RT-Thread內核里面,用來實現自動初始化功能的宏定義接口,如下圖所示。

綜上所述,要使用RT-Thread的自動初始化流程,可以概括為以下如圖所示的步驟。

為什么初始化函數加入了符號段之后,就可以被自動調用?符號段是什么?使用這種方式有什么好處?
把函數加入符號段,其實就是使用了MDK編譯器的__attribute__((section(x)))關鍵字,對函數進行聲明,通過section關鍵字進行聲明的函數,在編譯器進行鏈接的時候,就會自動收集這些函數并把他們放到一個集中的區域里面,查看以下.map文件可知。

如上圖紅框所示,rt_hw_pin_init和rt_hw_usart_init都是使用 INIT_BOARD_EXPORT(fn)聲明的函數,因此,它們是存放在橙色豎線所在的區間的,使用rt_components_board_init()函數就可以對這個區間進行遍歷。
如上圖藍框和綠框所示,它們分別是用 INIT_COMPONENT_EXPORT(fn)和 INIT_APP_EXPORT(fn)聲明的函數,這些函數是存放在紅色豎線所在的區間的,使用rt_components_init()函數就可以對這個區間進行遍歷。
從上面的分析可以看出,使用符號段的方式來存放初始化函數,好處就是當我需要添加某一個初始化函數的時候,就不需要再去改動RT-Thread的啟動代碼了,直接通過section關鍵字,把初始化函數添加到相應的符號段即可。

以上就是RT-Thread的自動初始化機制分析,正是由于采用了這種機制,所以,當我們對內核或組件進行裁剪的時候,并不需要修改RT-Thread的初始化函數,也可以對組件進行初始化。
責任編輯:lq
-
函數
+關注
關注
3文章
4417瀏覽量
67502 -
編譯器
+關注
關注
1文章
1672瀏覽量
51600 -
RT-Thread
+關注
關注
32文章
1613瀏覽量
44872
原文標題:【RT-Thread專題連載3】RT-Thread啟動過程分析RT-Thread自動初始化機制分析
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
恩智浦亮相RT-Thread 20周年開發者大會
首搭RT-Thread程翧車控平臺| RT-Thread程翧 S32K344 快速原型開發平臺正式上市!| 產品動態
2025年RT-Thread開發者巡回培訓報名正式啟動!
如何使用rt-thread studio中,使用 定制化的SDK建立工程?
rt-thread studio 2.2.9如何使用最新的RT-Thread v5.2.0 released?
Windows上使用ENV工具開發基于先楫MCU的RT-Thread應用
在Ubuntu上開發基于先楫MCU的RT-Thread應用指南
【好書推薦】RT-Thread第20本相關書籍!《嵌入式實時操作系統RT-Thread原理與應用》| 技術集結
RT-Thread 遇上 Rust:安全內核 RusT-Thread 的誕生
用SPI玩轉WiFi,RT-Thread ESP-Hosted驅動深度適配指南 | 技術集結
RT-Thread榮獲2025優秀開源項目 | 新聞速遞
深度剖析 RT-Thread 線程調度流程
揭秘RT-Thread上的AUTOSAR CP系統
2025 RT-Thread全球技術大會議程正式發布!
RT-Thread審核團招募: 深度參與開源RTOS社區治理與演進
RT-Thread啟動過程分析RT-Thread自動初始化機制分析
評論