电子产业一站式赋能平台

PCB联盟网

搜索
查看: 254|回复: 0
收起左侧

详解FreeRTOS:FreeRTOS编程方法

[复制链接]

854

主题

854

帖子

8396

积分

高级会员

Rank: 5Rank: 5

积分
8396
发表于 2023-7-26 12:00:00 | 显示全部楼层 |阅读模式

c3wojuyoqbr64023069616.gif

c3wojuyoqbr64023069616.gif
3 p3 I2 M+ t/ g( X) E
点击上方蓝色字体,关注我们
, o! K& p2 e& I9 I$ A
6 o/ d+ D2 }4 V$ t1 r% y$ ~! S' s/ G) @程序说明如下:9 E5 d1 v; ^. T: Z* i4 l
(1)、硬件初始化。硬件初始化这一步还属于裸机的范畴,我们可以把需要使用到的硬件都初始化好而且测试好,确保无误。
8 E( T! L9 D) l9 Y" L& ^(2)、RTOS 系统初始化。比如 RTOS 里面的全局变量的初始化,空闲任务的创建等。不同的 RTOS,它们的初始化有细微的差别。9 G! f2 r  g6 Q  `3 ]- C3 a
(3)、创建各种任务。这里把所有要用到的任务都创建好,但还不会进入调度,因为这个时候 RTOS 的调度器还没有开启。4 U5 h+ d. N" G; S2 d
(4)、启动 RTOS 调度器,开始任务调度。这个时候调度器就从刚刚创建好的任务中选择一个优先级最高的任务开始运行。
( f/ _- H+ j- p- U5 C; X(5)(6)、任务实体通常是一个不带返回值的无限循环的 C 函数,函数体必须有阻塞的情况出现,不然任务(如果优先权恰好是最高)会一直在 while 循环里面执行,导致其它任务没有执行的机会。
7 D  T4 w1 _+ D7 ^; M: B2
$ ~3 y% R3 [, G  l3 z, E4 J- |; L7 Smain函数中初始化硬件和RTOS,创建启动任务4 _+ B+ L, F6 V4 B# x
这种方法是在 main 函数中将硬件和 RTOS 系统先初始化好,然后创建一个启动任务后就启动任务调度器,然后在启动任务里面创建各种应用任务,当所有任务都创建成功后,启动任务把自己删除。( P- D% m' i* W, b* ^. u3 u) M7 @

6 I+ `5 u& ^* {5 C' A' I$ w伪代码如下所示:
, Y) }+ J* v' J
; J" J; K/ R: G. `3 F8 z$ P

gmc0oezr0di64023069716.png

gmc0oezr0di64023069716.png
+ T! M7 \( y( u7 z, b
, f0 o0 |: Z& ?7 D/ D: y& ^
程序说明如下:& Y' Q% c7 S  p) Y9 S
(1)、硬件初始化。来到硬件初始化这一步还属于裸机的范畴,我们可以把需要使用到的硬件都初始化好而且测试好,确保无误。+ o- F/ Y- b3 E
(2)、RTOS 系统初始化。比如 RTOS 里面的全局变量的初始化,空闲任务的创建等。不同的 RTOS,它们的初始化有细微的差别。
* x  t+ k4 E' L(3)、创建一个开始任务。然后在这个初始任务里面创建各种应用任务。
6 x0 [+ u/ A# e; r) h' t(4)、启动 RTOS 调度器,开始任务调度。这个时候调度器就去执行刚刚创建好的初始任务。: W9 o% m' b8 \' J7 D
(5)、我们通常说任务是一个不带返回值的无限循环的 C函数,但是因为初始任务的特殊性,它不能是无限循环的,只执行一次后就关闭。在初始任务里面我们创建我们需要的各种任务。! c: D1 Z6 x# T6 @6 c7 S+ r& y, e- {: f- Z
(6)、创建任务。每创建一个任务后它都将进入就绪态,系统会进行一次调度,如果新创建的任务的优先级比初始任务的优先级高的话,那将去执行新创建的任务,当新的任务阻塞时再回到初始任务被打断的地方继续执行。反之,则继续往下创建新的任务,直到所有任务创建完成。
- |: t0 H# A/ {1 N(7)、各种应用任务创建完成后,初始任务自己关闭自己,使命完成。% E4 t0 U# J1 U5 R! D3 h
(8)(9)、任务实体通常是一个不带返回值的无限循环的 C 函数,函数体必须有阻塞的情况出现,不然任务(如果优先权恰好是最高)会一直在 while 循环里面执行,其它任务没有执行的机会。
" R0 M1 U. b6 P+ u! Z, ^
, X+ E, h2 r$ N那有关这两种方法孰优孰劣?我暂时没发现。LiteOS 和 ucos 第1种和第2种都可以使用,由用户选择,RT-Thread 和 FreeRTOS 则默认使用第二种。
) V# A+ _) u; R1 S' x0 @/ j7 t; B! o% b  V& {  b( t" a: n

hab1xqdmv5o64023069816.png

hab1xqdmv5o64023069816.png
/ }, E' r/ ^0 d6 f4 U( }! x
往期推荐详解FreeRTOS:嵌入式软件系统架构- R0 {9 p% |' T5 }- K
详解FreeRTOS:嵌入式多任务系统的多任务机制
0 e* K$ T5 c4 B, l) E一种高速ADC和DAC转换电路分享
# ~% K0 z8 i: v, g& M5 Y2 |, WCAN FD网络中每秒最多可以发送多少帧报文?
! B# U" k  ?: S6 a) v3 a0 {
. r& m7 q* \! f9 M4 [

rj0c0z0pkd564023069916.jpg

rj0c0z0pkd564023069916.jpg
4 O2 A( G% {. K! D

dc1s0qpyb1e64023070016.gif

dc1s0qpyb1e64023070016.gif

; I: r( E/ K/ X0 T- X: m" q! z. V点击阅读原文,更精彩~
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表