自動初始化機制是指初始化函式不需要被顯式呼叫,只需要在函式定義處通過巨集定義的方式進行申明,就會在系統啟動過程中被執行。
例如在串列埠驅動中呼叫乙個巨集定義告知系統初始化需要呼叫的函式,**如下:
int rt_hw_usart_init(void) /* 串列埠初始化函式 */
init_board_export(rt_hw_usart_init); /* 使用元件自動初始化機制 */
示例**最後的 init_board_export(rt_hw_usart_init) 表示使用自動初始化功能,按照這種方式,rt_hw_usart_init() 函式就會被系統自動呼叫,那麼它是在**被呼叫的呢?
在系統啟動流程圖中,有兩個函式:rt_components_board_init() 與 rt_components_init(),其後的帶底色方框內部的函式表示被自動初始化的函式,其中:
「board init functions」 為所有通過 init_board_export(fn) 申明的初始化函式。
「pre-initialization functions」 為所有通過 init_prev_export(fn)申明的初始化函式。
「device init functions」 為所有通過 init_device_export(fn) 申明的初始化函式。
「components init functions」 為所有通過 init_component_export(fn)申明的初始化函式。
「enviroment init functions」 為所有通過 init_env_export(fn) 申明的初始化函式。
rt_components_board_init() 函式執行的比較早,主要初始化相關硬體環境,執行這個函式時將會遍歷通過 init_board_export(fn) 申明的初始化函式表,並呼叫各個函式。
rt_components_init() 函式會在作業系統執行起來之後建立的 main 執行緒裡被呼叫執行,這個時候硬體環境和作業系統已經初始化完成,可以執行應用相關**。rt_components_init() 函式會遍歷通過剩下的其他幾個巨集申明的初始化函式表。
rt-thread 的自動初始化機制使用了自定義 rti 符號段,將需要在啟動時進行初始化的函式指標放到了該段中,形成一張初始化函式表,在系統啟動過程中會遍歷該錶,並呼叫表中的函式,達到自動初始化的目的。
用來實現自動初始化功能的巨集介面定義詳細描述如下表所示:
初始化順序巨集介面描述
1init_board_export(fn)
非常早期的初始化,此時排程器還未啟動
2init_prev_export(fn)
主要是用於純軟體的初始化、沒有太多依賴的函式
3init_device_export(fn)
外設驅動初始化相關,比如網絡卡裝置
4init_component_export(fn)
元件初始化,比如檔案系統或者 lwip
5init_env_export(fn)
系統環境初始化,比如掛載檔案系統
6應用初始化,比如 gui 應用
初始化函式主動通過這些巨集介面進行申明,如 init_board_export(rt_hw_usart_init),鏈結器會自動收集所有被申明的初始化函式,放到 rti 符號段中,該符號段位於記憶體分布的 ro 段中,該 rti 符號段中的所有函式在系統初始化時會被自動呼叫。
SparkContext的初始化機制
1.createtaskscheduler 建立sparkscheduler,sparkdeployschedulerbackend 它在底層負責接收taskschedulerimpl的控制,實際上負責與master的註冊,executor的反註冊,task傳送到executor等操作 呼叫task...
變數的自動初始化
變數的初始化分為倆種型別 1.內建型別自動初始化。程式中有乙個資料區,存放已初始化的全域性變數,靜態變數和常量,所以會增加目標檔案的大小。還有乙個未初始化資料區bss 存放未初始化全域性變數,但是在程式開始執行之前,這些資料會被初始化為0或者null。所以bss資料在目標檔案中只佔乙個符號位,編譯器...
變數的自動初始化
1 1 include2 define const 100 3int p1 4int a 2 5 intb 6static intc 7main 8 輸出 const 100 a 0 0 b 0c 0 d 2514932 e 0f 0 1307813 p2 457819009 資料區存放已初始化的全...