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