電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 56|回復(fù): 0
收起左側(cè)

詳解FreeRTOS:FreeRTOS編程方法

[復(fù)制鏈接]

660

主題

660

帖子

4567

積分

四級會員

Rank: 4

積分
4567
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2023-7-26 12:00:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

2 y' @8 _+ @9 E  Z: Y點擊上方藍色字體,關(guān)注我們. g! N+ d" g/ R

3 f; G2 b8 D/ Z程序說明如下:
: _& f) C' e0 C8 N( X2 }(1)、硬件初始化。硬件初始化這一步還屬于裸機的范疇,我們可以把需要使用到的硬件都初始化好而且測試好,確保無誤。) |" j" N6 N+ E+ T  X& _) G8 |
(2)、RTOS 系統(tǒng)初始化。比如 RTOS 里面的全局變量的初始化,空閑任務(wù)的創(chuàng)建等。不同的 RTOS,它們的初始化有細微的差別。7 y0 ^$ J6 ^, L( I6 y: Y5 w1 b
(3)、創(chuàng)建各種任務(wù)。這里把所有要用到的任務(wù)都創(chuàng)建好,但還不會進入調(diào)度,因為這個時候 RTOS 的調(diào)度器還沒有開啟。
$ J, ~: Y3 Z# `% w(4)、啟動 RTOS 調(diào)度器,開始任務(wù)調(diào)度。這個時候調(diào)度器就從剛剛創(chuàng)建好的任務(wù)中選擇一個優(yōu)先級最高的任務(wù)開始運行。
' b4 ^2 r% K' b2 [(5)(6)、任務(wù)實體通常是一個不帶返回值的無限循環(huán)的 C 函數(shù),函數(shù)體必須有阻塞的情況出現(xiàn),不然任務(wù)(如果優(yōu)先權(quán)恰好是最高)會一直在 while 循環(huán)里面執(zhí)行,導(dǎo)致其它任務(wù)沒有執(zhí)行的機會。
( ?1 j3 W4 R" L. E2
( _0 j1 K9 U4 H' k/ ^" `main函數(shù)中初始化硬件和RTOS,創(chuàng)建啟動任務(wù)" y: n8 z- @! Q+ @1 |2 a7 k) J% c
這種方法是在 main 函數(shù)中將硬件和 RTOS 系統(tǒng)先初始化好,然后創(chuàng)建一個啟動任務(wù)后就啟動任務(wù)調(diào)度器,然后在啟動任務(wù)里面創(chuàng)建各種應(yīng)用任務(wù),當(dāng)所有任務(wù)都創(chuàng)建成功后,啟動任務(wù)把自己刪除。
0 l+ w: e6 Z6 |- H9 {0 @
9 T5 r. |1 Y/ e1 ]3 ~偽代碼如下所示:
! P* R8 X; l1 a6 n: o# u7 J# [- Q
" c7 H  R4 m# d' Z/ e0 w/ p

! u1 Y! T* d$ y; o+ W9 ]% u' f程序說明如下:5 h5 s2 y/ ?- k0 ]! [# J
(1)、硬件初始化。來到硬件初始化這一步還屬于裸機的范疇,我們可以把需要使用到的硬件都初始化好而且測試好,確保無誤。2 z6 N, K. ?7 p6 |) z4 q0 U7 V! w; x
(2)、RTOS 系統(tǒng)初始化。比如 RTOS 里面的全局變量的初始化,空閑任務(wù)的創(chuàng)建等。不同的 RTOS,它們的初始化有細微的差別。
) N) g0 D% k- l: f8 T' u(3)、創(chuàng)建一個開始任務(wù)。然后在這個初始任務(wù)里面創(chuàng)建各種應(yīng)用任務(wù)。' ~: t, E3 T) I! P+ J& q
(4)、啟動 RTOS 調(diào)度器,開始任務(wù)調(diào)度。這個時候調(diào)度器就去執(zhí)行剛剛創(chuàng)建好的初始任務(wù)。/ C2 }& F# \2 }- L7 ]- K$ L
(5)、我們通常說任務(wù)是一個不帶返回值的無限循環(huán)的 C函數(shù),但是因為初始任務(wù)的特殊性,它不能是無限循環(huán)的,只執(zhí)行一次后就關(guān)閉。在初始任務(wù)里面我們創(chuàng)建我們需要的各種任務(wù)。; Q# l+ ]: Z5 c- z
(6)、創(chuàng)建任務(wù)。每創(chuàng)建一個任務(wù)后它都將進入就緒態(tài),系統(tǒng)會進行一次調(diào)度,如果新創(chuàng)建的任務(wù)的優(yōu)先級比初始任務(wù)的優(yōu)先級高的話,那將去執(zhí)行新創(chuàng)建的任務(wù),當(dāng)新的任務(wù)阻塞時再回到初始任務(wù)被打斷的地方繼續(xù)執(zhí)行。反之,則繼續(xù)往下創(chuàng)建新的任務(wù),直到所有任務(wù)創(chuàng)建完成。: v# D) A' c( l" d3 V3 u6 `
(7)、各種應(yīng)用任務(wù)創(chuàng)建完成后,初始任務(wù)自己關(guān)閉自己,使命完成。' N7 e7 A: T$ m& a- P
(8)(9)、任務(wù)實體通常是一個不帶返回值的無限循環(huán)的 C 函數(shù),函數(shù)體必須有阻塞的情況出現(xiàn),不然任務(wù)(如果優(yōu)先權(quán)恰好是最高)會一直在 while 循環(huán)里面執(zhí)行,其它任務(wù)沒有執(zhí)行的機會。
# ]1 r4 J/ m" T) g* f4 e
) Z2 B/ |! f% e0 k' J2 ^7 [那有關(guān)這兩種方法孰優(yōu)孰劣?我暫時沒發(fā)現(xiàn)。LiteOS 和 ucos 第1種和第2種都可以使用,由用戶選擇,RT-Thread 和 FreeRTOS 則默認(rèn)使用第二種。+ m3 B" b8 m' [$ p7 A
0 t0 G7 d! j" w' s% w* b5 M. A

0 i4 s% {6 [4 G3 a) A往期推薦詳解FreeRTOS:嵌入式軟件系統(tǒng)架構(gòu)
, V# D4 r3 v- w4 Z! P詳解FreeRTOS:嵌入式多任務(wù)系統(tǒng)的多任務(wù)機制( V  T8 _2 |5 m6 U
一種高速ADC和DAC轉(zhuǎn)換電路分享
, I# ]  Z# a- |% {. q+ J) g5 CCAN FD網(wǎng)絡(luò)中每秒最多可以發(fā)送多少幀報文?' N3 Y3 [# s' x8 Q
+ ?) K7 a1 K& [* \: ?, n

$ ]6 L0 S# Q- b, G' ]& t3 r& M
4 s" c% Z' v( F! r, k點擊閱讀原文,更精彩~
回復(fù)

使用道具 舉報

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表