詳解FreeRTOS:FreeRTOS編程方法
在目前的 RTOS 中,主要有兩種比較流行的編程方法,接下來我將通過偽代碼的方式來講解下這兩種編程方式。
1
main函數中初始化硬件和RTOS,創建所有任務
這種方法是在 main 函數中將硬件初始化,RTOS 系統初始化,所有任務都創建好,最后啟動 RTOS 的調度器,開始多任務的調度。
偽代碼如下所示:
程序說明如下:
(1)、硬件初始化。硬件初始化這一步還屬于裸機的范疇,我們可以把需要使用到的硬件都初始化好而且測試好,確保無誤。
(2)、RTOS 系統初始化。比如 RTOS 里面的全局變量的初始化,空閑任務的創建等。不同的 RTOS,它們的初始化有細微的差別。
(3)、創建各種任務。這里把所有要用到的任務都創建好,但還不會進入調度,因為這個時候 RTOS 的調度器還沒有開啟。
(4)、啟動 RTOS 調度器,開始任務調度。這個時候調度器就從剛剛創建好的任務中選擇一個優先級最高的任務開始運行。
(5)(6)、任務實體通常是一個不帶返回值的無限循環的 C 函數,函數體必須有阻塞的情況出現,不然任務(如果優先權恰好是最高)會一直在 while 循環里面執行,導致其它任務沒有執行的機會。
2
main函數中初始化硬件和RTOS,創建啟動任務
這種方法是在 main 函數中將硬件和 RTOS 系統先初始化好,然后創建一個啟動任務后就啟動任務調度器,然后在啟動任務里面創建各種應用任務,當所有任務都創建成功后,啟動任務把自己刪除。
偽代碼如下所示:
程序說明如下:
(1)、硬件初始化。來到硬件初始化這一步還屬于裸機的范疇,我們可以把需要使用到的硬件都初始化好而且測試好,確保無誤。
(2)、RTOS 系統初始化。比如 RTOS 里面的全局變量的初始化,空閑任務的創建等。不同的 RTOS,它們的初始化有細微的差別。
(3)、創建一個開始任務。然后在這個初始任務里面創建各種應用任務。
(4)、啟動 RTOS 調度器,開始任務調度。這個時候調度器就去執行剛剛創建好的初始任務。
(5)、我們通常說任務是一個不帶返回值的無限循環的 C函數,但是因為初始任務的特殊性,它不能是無限循環的,只執行一次后就關閉。在初始任務里面我們創建我們需要的各種任務。
(6)、創建任務。每創建一個任務后它都將進入就緒態,系統會進行一次調度,如果新創建的任務的優先級比初始任務的優先級高的話,那將去執行新創建的任務,當新的任務阻塞時再回到初始任務被打斷的地方繼續執行。反之,則繼續往下創建新的任務,直到所有任務創建完成。
(7)、各種應用任務創建完成后,初始任務自己關閉自己,使命完成。
(8)(9)、任務實體通常是一個不帶返回值的無限循環的 C 函數,函數體必須有阻塞的情況出現,不然任務(如果優先權恰好是最高)會一直在 while 循環里面執行,其它任務沒有執行的機會。
那有關這兩種方法孰優孰劣?我暫時沒發現。LiteOS 和 ucos 第1種和第2種都可以使用,由用戶選擇,RT-Thread 和 FreeRTOS 則默認使用第二種
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。