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

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

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

詳解FreeRTOS:FreeRTOS編程方法

[復(fù)制鏈接]

394

主題

394

帖子

2197

積分

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

Rank: 3Rank: 3

積分
2197
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2023-7-26 12:00:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
3 d0 p: F4 q- N6 n8 v" U* y, W
點(diǎn)擊上方藍(lán)色字體,關(guān)注我們! F! S- X/ W  q6 b
, b" I* Z' O4 D; I, c9 X
程序說(shuō)明如下:! s' [, ^+ N! Z" r
(1)、硬件初始化。硬件初始化這一步還屬于裸機(jī)的范疇,我們可以把需要使用到的硬件都初始化好而且測(cè)試好,確保無(wú)誤。' ?; s2 w9 ^/ r, O4 i; {
(2)、RTOS 系統(tǒng)初始化。比如 RTOS 里面的全局變量的初始化,空閑任務(wù)的創(chuàng)建等。不同的 RTOS,它們的初始化有細(xì)微的差別。
8 c8 q1 y1 d$ S9 L( F$ a' D* X(3)、創(chuàng)建各種任務(wù)。這里把所有要用到的任務(wù)都創(chuàng)建好,但還不會(huì)進(jìn)入調(diào)度,因?yàn)檫@個(gè)時(shí)候 RTOS 的調(diào)度器還沒(méi)有開(kāi)啟。- m! c7 R( |: g( I
(4)、啟動(dòng) RTOS 調(diào)度器,開(kāi)始任務(wù)調(diào)度。這個(gè)時(shí)候調(diào)度器就從剛剛創(chuàng)建好的任務(wù)中選擇一個(gè)優(yōu)先級(jí)最高的任務(wù)開(kāi)始運(yùn)行。+ L/ L' t9 Z$ j5 F2 D
(5)(6)、任務(wù)實(shí)體通常是一個(gè)不帶返回值的無(wú)限循環(huán)的 C 函數(shù),函數(shù)體必須有阻塞的情況出現(xiàn),不然任務(wù)(如果優(yōu)先權(quán)恰好是最高)會(huì)一直在 while 循環(huán)里面執(zhí)行,導(dǎo)致其它任務(wù)沒(méi)有執(zhí)行的機(jī)會(huì)。; {/ b, s8 @2 s+ _; _
2
; c; F: o0 t9 v/ K' x2 Y5 |! smain函數(shù)中初始化硬件和RTOS,創(chuàng)建啟動(dòng)任務(wù)
. r; v6 m* X% b$ Z這種方法是在 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ù)把自己刪除。; t6 N# S( _; H  Z) L. X

; f8 _: W4 `& `, o; K( h偽代碼如下所示:
- a4 `" W$ x& X/ d# i* h
9 @- c! e3 ?0 o+ G 6 z$ a& S, m" [/ d
4 }. W0 s, Y8 E: @# Q( J& r  ?5 H! ?$ b
程序說(shuō)明如下:
8 Q0 o$ {/ t1 C3 v+ ^; ]7 b8 q(1)、硬件初始化。來(lái)到硬件初始化這一步還屬于裸機(jī)的范疇,我們可以把需要使用到的硬件都初始化好而且測(cè)試好,確保無(wú)誤。
% r$ F3 y. j, W! g(2)、RTOS 系統(tǒng)初始化。比如 RTOS 里面的全局變量的初始化,空閑任務(wù)的創(chuàng)建等。不同的 RTOS,它們的初始化有細(xì)微的差別。& b# d  F- ?0 w' O' t; q
(3)、創(chuàng)建一個(gè)開(kāi)始任務(wù)。然后在這個(gè)初始任務(wù)里面創(chuàng)建各種應(yīng)用任務(wù)。
5 c7 e: g& Y9 T3 l, ](4)、啟動(dòng) RTOS 調(diào)度器,開(kāi)始任務(wù)調(diào)度。這個(gè)時(shí)候調(diào)度器就去執(zhí)行剛剛創(chuàng)建好的初始任務(wù)。/ P- W; w+ h, b$ p: v9 y
(5)、我們通常說(shuō)任務(wù)是一個(gè)不帶返回值的無(wú)限循環(huán)的 C函數(shù),但是因?yàn)槌跏既蝿?wù)的特殊性,它不能是無(wú)限循環(huán)的,只執(zhí)行一次后就關(guān)閉。在初始任務(wù)里面我們創(chuàng)建我們需要的各種任務(wù)。
9 M2 G1 G7 e+ c0 D(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)建完成。) k9 S1 J0 C4 k- F  F
(7)、各種應(yīng)用任務(wù)創(chuàng)建完成后,初始任務(wù)自己關(guān)閉自己,使命完成。3 L# n0 ~) R7 n2 N' g6 b$ c0 k# G
(8)(9)、任務(wù)實(shí)體通常是一個(gè)不帶返回值的無(wú)限循環(huán)的 C 函數(shù),函數(shù)體必須有阻塞的情況出現(xiàn),不然任務(wù)(如果優(yōu)先權(quán)恰好是最高)會(huì)一直在 while 循環(huán)里面執(zhí)行,其它任務(wù)沒(méi)有執(zhí)行的機(jī)會(huì)。- x/ c& ~( T8 Q: U& }5 m

. _7 s* {! W  w1 \! m6 A% v那有關(guān)這兩種方法孰優(yōu)孰劣?我暫時(shí)沒(méi)發(fā)現(xiàn)。LiteOS 和 ucos 第1種和第2種都可以使用,由用戶選擇,RT-Thread 和 FreeRTOS 則默認(rèn)使用第二種。
. Q, x# z! U4 U% h! L0 w0 R* c$ }: E8 K) T. L8 R
# M6 o5 z* f0 Y/ z9 c: F  s; B+ }
往期推薦詳解FreeRTOS:嵌入式軟件系統(tǒng)架構(gòu)4 t) a$ r. g! ]. j0 k
詳解FreeRTOS:嵌入式多任務(wù)系統(tǒng)的多任務(wù)機(jī)制# `9 x* ~2 }, r8 v2 W8 i
一種高速ADC和DAC轉(zhuǎn)換電路分享
5 a$ x7 z: f2 L4 i; [2 ?! N; vCAN FD網(wǎng)絡(luò)中每秒最多可以發(fā)送多少幀報(bào)文?8 N3 V6 B+ q* V. ]2 @% M/ R2 j
& P. M3 b; B+ a9 a- L- U! T1 i1 [/ j

' v& a' Y% r1 I: k 8 b1 E% g9 m( n( d$ [# t9 r
點(diǎn)擊閱讀原文,更精彩~

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

本版積分規(guī)則


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