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

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

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

詳解FreeRTOS:FreeRTOS編程方法

[復(fù)制鏈接]

601

主題

601

帖子

4762

積分

四級(jí)會(huì)員

Rank: 4

積分
4762
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2023-7-26 12:00:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
9 B" A4 ?9 C3 `! ~
點(diǎn)擊上方藍(lán)色字體,關(guān)注我們! b3 o: `% f3 ~5 w$ _: M

2 e% Q6 D. ?) P2 w4 H程序說明如下:% v: z4 a0 v* C* z. I% [
(1)、硬件初始化。硬件初始化這一步還屬于裸機(jī)的范疇,我們可以把需要使用到的硬件都初始化好而且測試好,確保無誤。% D" z/ Y3 O; k* O4 `- U# O
(2)、RTOS 系統(tǒng)初始化。比如 RTOS 里面的全局變量的初始化,空閑任務(wù)的創(chuàng)建等。不同的 RTOS,它們的初始化有細(xì)微的差別。$ i, v! v( }8 o( s  V
(3)、創(chuàng)建各種任務(wù)。這里把所有要用到的任務(wù)都創(chuàng)建好,但還不會(huì)進(jìn)入調(diào)度,因?yàn)檫@個(gè)時(shí)候 RTOS 的調(diào)度器還沒有開啟。
: M! u2 S5 O3 J6 |8 e5 i8 v(4)、啟動(dòng) RTOS 調(diào)度器,開始任務(wù)調(diào)度。這個(gè)時(shí)候調(diào)度器就從剛剛創(chuàng)建好的任務(wù)中選擇一個(gè)優(yōu)先級(jí)最高的任務(wù)開始運(yùn)行。4 B4 w# \, [( a  q( j. f0 s
(5)(6)、任務(wù)實(shí)體通常是一個(gè)不帶返回值的無限循環(huán)的 C 函數(shù),函數(shù)體必須有阻塞的情況出現(xiàn),不然任務(wù)(如果優(yōu)先權(quán)恰好是最高)會(huì)一直在 while 循環(huán)里面執(zhí)行,導(dǎo)致其它任務(wù)沒有執(zhí)行的機(jī)會(huì)。
0 P5 T' c) G1 C4 L+ g2
8 S( P0 d0 L. F& t# E$ Q2 s  qmain函數(shù)中初始化硬件和RTOS,創(chuàng)建啟動(dòng)任務(wù)
; ]. F: n6 N# R8 U這種方法是在 main 函數(shù)中將硬件和 RTOS 系統(tǒng)先初始化好,然后創(chuàng)建一個(gè)啟動(dòng)任務(wù)后就啟動(dòng)任務(wù)調(diào)度器,然后在啟動(dòng)任務(wù)里面創(chuàng)建各種應(yīng)用任務(wù),當(dāng)所有任務(wù)都創(chuàng)建成功后,啟動(dòng)任務(wù)把自己刪除。% f* [/ P3 y4 l6 ]
$ g5 s0 ?: J/ w! h/ j' L9 `
偽代碼如下所示:4 C# D9 p+ d& X. m; |
  k  ~7 |! A' |2 d' q

* e8 j$ W5 X. o6 {& v' Y1 W1 D$ B& T/ E) z4 V; {
程序說明如下:6 v& T8 P5 \. R( M. w
(1)、硬件初始化。來到硬件初始化這一步還屬于裸機(jī)的范疇,我們可以把需要使用到的硬件都初始化好而且測試好,確保無誤。
3 p) x% `+ J! t, D3 l0 x; P$ I- l(2)、RTOS 系統(tǒng)初始化。比如 RTOS 里面的全局變量的初始化,空閑任務(wù)的創(chuàng)建等。不同的 RTOS,它們的初始化有細(xì)微的差別。
5 G5 W( r9 A% a; e. {5 Z(3)、創(chuàng)建一個(gè)開始任務(wù)。然后在這個(gè)初始任務(wù)里面創(chuàng)建各種應(yīng)用任務(wù)。
6 t4 {* [" M6 a. Y(4)、啟動(dòng) RTOS 調(diào)度器,開始任務(wù)調(diào)度。這個(gè)時(shí)候調(diào)度器就去執(zhí)行剛剛創(chuàng)建好的初始任務(wù)。
- e% m. r- }. }(5)、我們通常說任務(wù)是一個(gè)不帶返回值的無限循環(huán)的 C函數(shù),但是因?yàn)槌跏既蝿?wù)的特殊性,它不能是無限循環(huán)的,只執(zhí)行一次后就關(guān)閉。在初始任務(wù)里面我們創(chuàng)建我們需要的各種任務(wù)。" G' y2 }$ G; \& H# C7 Z
(6)、創(chuàng)建任務(wù)。每創(chuàng)建一個(gè)任務(wù)后它都將進(jìn)入就緒態(tài),系統(tǒng)會(huì)進(jìn)行一次調(diào)度,如果新創(chuàng)建的任務(wù)的優(yōu)先級(jí)比初始任務(wù)的優(yōu)先級(jí)高的話,那將去執(zhí)行新創(chuàng)建的任務(wù),當(dāng)新的任務(wù)阻塞時(shí)再回到初始任務(wù)被打斷的地方繼續(xù)執(zhí)行。反之,則繼續(xù)往下創(chuàng)建新的任務(wù),直到所有任務(wù)創(chuàng)建完成。% Y* n+ V; z5 `: J2 a
(7)、各種應(yīng)用任務(wù)創(chuàng)建完成后,初始任務(wù)自己關(guān)閉自己,使命完成。  {; p0 a2 w3 W3 x% A
(8)(9)、任務(wù)實(shí)體通常是一個(gè)不帶返回值的無限循環(huán)的 C 函數(shù),函數(shù)體必須有阻塞的情況出現(xiàn),不然任務(wù)(如果優(yōu)先權(quán)恰好是最高)會(huì)一直在 while 循環(huán)里面執(zhí)行,其它任務(wù)沒有執(zhí)行的機(jī)會(huì)。' ?  t0 h+ S% n6 X% v
/ r/ y- w7 P4 M
那有關(guān)這兩種方法孰優(yōu)孰劣?我暫時(shí)沒發(fā)現(xiàn)。LiteOS 和 ucos 第1種和第2種都可以使用,由用戶選擇,RT-Thread 和 FreeRTOS 則默認(rèn)使用第二種。
; }, C& g2 @. @" L: m6 k$ p5 a
& j$ U" v! H) g, K7 N
" E/ O' v: L1 ?2 Q4 X# Z- {! f往期推薦詳解FreeRTOS:嵌入式軟件系統(tǒng)架構(gòu)0 b+ Y+ c: C: W1 O: v: M' `$ M
詳解FreeRTOS:嵌入式多任務(wù)系統(tǒng)的多任務(wù)機(jī)制8 L5 ~5 G6 O( d& p
一種高速ADC和DAC轉(zhuǎn)換電路分享. U1 v' V! \+ ?3 L( L
CAN FD網(wǎng)絡(luò)中每秒最多可以發(fā)送多少幀報(bào)文?
4 l' D( c0 Z  O% U* O5 j; Y  p
1 v# ~3 _5 q, M# f
9 h2 G1 M+ _* f7 y, d. [. Y

5 @! ~2 j9 k7 ?, N3 G點(diǎn)擊閱讀原文,更精彩~

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

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

本版積分規(guī)則


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