RT Thread 啟動流程

2021-10-25 21:53:14 字數 1511 閱讀 5929

一般了解乙份**大多數從啟動部分開始,同樣這裡也是採用這種方式,先尋找啟動的源頭。以mdk_arm為例。

mdk_arm的使用者程式入口為main()函式,位於main.c檔案中。系統啟動後先從彙編**startup_stm32f103xe.s開始執行,然後跳轉到c**,進行rt_thread系統功能初始化,最後進入使用者程式入口main()。

為了在進入main()之前完成rt_thread系統功能初始化,我們使用了mdk擴充套件功能$sub$$和$super$$main可以給main新增$sub$$的字首符號作為新功能函式$sub$$main,這個$sub$$main可以先呼叫一些需要補充在main之前的功能函式(這裡新增rt_thread系統初始化功能),在呼叫$super$$main轉到main()函式執行,這樣可以讓使用者不用去管main()之前的初始化。

關於$sub$$和$super$$擴充套件的使用,詳見如下:rt-thread程式設計高階用法

下面我們來看看在這段**:

/*$sub$$main 函式*/

int $sub$$main

(void

)

在這裡$sub$$main函式僅呼叫了rtthread_startup函式。rt_thread支援多種平台和多種編譯器,而rtthread_startup()函式是rt_thread規定的統一入口函式點,所以$sub$$main函式只需呼叫rtthread_startup()函式即可(例如採用gnu gcc 編譯器編譯的rt_thread,就直接從彙編啟動**跳轉到rtthread_startup()函式中,並開始第乙個c**的執行),在components.c的**中找到rtthread_startup()函式,我們看到rt_thread的啟動流程如下所示:

其中rtthread_startup()函式的**如下所示:

int

rtthraed_startup

(void

)

這部分啟動**,大致可以分為四個部分:

1、初始化與系統相關的硬體;

2、初始化系統核心物件,例如定時器、排程器、訊號;

3、建立main執行緒,在main執行緒中對各類模組依次進行初始化;

4、初始化定時器執行緒、空閒執行緒、並啟動排程器。

rt_hw_board_init()中完成系統時鐘設定,為系統提供心跳,串列埠初始化,將系統輸入輸出由終端繫結到這個串列埠,後續系統執行資訊就會從串列埠列印出來。

main()函式是rt_thread的使用者**入口,使用者可以在main()函式裡新增。

int

main

(void

)

RT Thread 2 啟動流程

rt thread 官網有這樣一張圖,詳細講解了os啟動流程。1.在mdk環境下,上電復位後進入復位中斷,並呼叫 main 函式 2.rt thread重定義了 sub main 函式,因此復位中斷先跳轉到 sub main 函式 4.rtthread startup 函式最後啟動排程器,os隨後進...

rt thread 串列埠裝置的配置流程

板級硬體初始化 系統定時器初始化 系統排程器初始化 建立初始化執行緒 元件初始化 定時器執行緒初始化 空閒執行緒初始化 系統排程器工作 串列埠裝置配置函式中遍歷要使用的串列埠裝置,做一些工作引數配置和裝置介面實現並註冊裝置 但在此不初始化裝置或不使能裝置 具體配置過程 1.註冊串列埠裝置,以便 fi...

rt thread的PIN裝置的啟動

在rt thread 403上檢視 啟動 reset handler reset handler proc export reset handler weak import main import systeminit ldr r0,systeminit blx r0 ldr r0,main bx ...