请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32的UCOSII操作系统经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-21 22:36
前言! T( L3 e2 l# x( g# @" V( Y0 v( o
这是我将UCOSII操作系统移植在STM32单片机上后进行UCOSII操作系统学习的一些笔记与理解,此文最后会附上我自己在UCOSII操作系统下使用STM32写的ESP8266+onenet+http协议的程序链接,可以作为参考,如果文中有不当的地方,还请各位大佬加以中指正,我一定会虚心求教。
6 I% T: x: q5 ~1 p

' ~- A0 |3 N+ V, [3 Y' i" t* s( |1.UCOSII操作系统的简介: J& B; |" L  N! P! I0 V% X4 L8 I
前台后台系统
" D5 F( \  U/ b" `# Z" b$ Q0 i: j. @
8 Y) A6 A  Y; ~. A- I
相信大家都使用过单片机,比如51,STM32,但是我们在使用的时候呢,我们都是在裸机下面写程序(也就是裸奔),也就是说,我们写的程序无非就是在主函数里面加一个死循环,然后再加上中断服务程序。应用程序以无限循环的方式在主函数被调用,调用相应的函数来完成所需要的功能,这个大的循环就叫做后台系统。而中断服务程序就是来处理我们的异常,异常结束后跳出中断服务程序,回到原来进入中断的地方继续执行我们的程序,中断处理的事件就是前台系统。
+ D. k! Z+ R0 g7 E: h/ N7 W1 H3 i) U7 l4 R
关于操作系统有很多,我这里选择的是UCOSII来进行一个讲解
8 \+ j  C9 ~0 {+ g( K( }, J0 {

. P, O& u& x! J1 |) ^; H7 VUCOSII是一个可以基于RAM运行的、可裁剪(这里不是太理解)、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器的实时操作系统(讲求实时性,实时性自己去了解)( F' d+ p, K7 n

) J7 w; G* y3 }4 n- E; ~
3 d9 B9 h1 x+ _( v$ Y8 h
1.1任务7 m( z& d1 b% B6 C0 Y6 t. G
在操作系统下呢,任务其实就是一个死循环函数,在循环里面调用相关函数,实现一定滴功能,当然了,在操作系统下,一个工程可以有多个任务,我们的UCOSII操作系统呢就对这些任务进行任务调度管理,让这些任务可以并发工作。
7 W0 U$ N, _$ V1 n% H2 y% `; O5 }9 G* t
任务格式如下:* W3 m) o# z3 G3 T3 }0 u. }
; W% }6 x9 b8 U' ^( v
7d21b3d21b2f4dc493cbfb614eb405cf.png
/ [0 k- J  ~2 z' V+ k- A- @3 `$ b5 g- J7 l# A; h

( v9 g& h$ @( e9 x1.2设置任务优先级9 a# n! q+ Y; Z% d
在操作系统下呢,每个任务都有唯一确定的优先级。优先级高的任务优先获得CPU的使用权,只有当优先级高的任务执行完毕之后呢,我们的高优先级任务才会让出CPU的使用权,从而呢次优先级的任务才能获得CPU的使用权,等所有的任务执行完毕,又重复这一步骤。注意:每个任务都有唯一确定的优先级,不同的任务不能拥有一样的优先级。
5 ~0 f' t0 r6 \/ c9 n1 A9 X& S. l. d/ M' l6 A$ [, Z
在程序中我是这样宏定义的
7 R5 c- j( ^- j0 x/ C  N) L3 o9 R" ^
88cfe948115a4e7eaed248173f2995d6.png & C7 y/ r- M& z: i( G7 ?4 R+ c

  l; ?3 F2 U) C; f
数字代表的是优先级,数字越小代表优先级越高。( X+ H) ?# H$ r$ R, Z7 S! B

$ `/ G' o  i1 X9 `( T
* _1 j6 N: B- w7 X5 Y2 d
1.3设置任务堆栈大小
% ^+ r' d3 y4 I# F- r# j- ^
& m1 T- K- F& c  o" B5 Q
f38b1563087f4af3ad04c35de77af8a4.png
: g9 P8 \6 X8 F* m
. D7 e4 c9 s/ ^% V
后面的数字代表的是堆栈大小,如果任务函数的局部变量多,嵌套的层数多,那么相应的我们的堆栈就要设置得大一些。! {' [/ ~4 e9 V
( |# O/ i/ y8 U: a: f  W

# p' |8 d3 p* P1.4设置任务堆栈! `3 G; Q- g8 |& C. `0 S$ j4 Z, I, s( J2 M
  _0 v% R1 j! ~+ I
0e90525533bb48fd841805528ddcb50c.png * W) f4 r- e! X8 i! \5 T; {

2 ~+ w7 e" {" K0 R+ ^. P
这里注意堆栈字节对齐的问题(特别是使用到串口的printf函数打印时)* h) M. p! \* r
. c% }- B! e$ w) F$ z
1 V" p9 _6 k( z8 w
1.5初始化UCOSII、创建任务、启动UCOSII! f  ^; v, ]1 o4 _3 C  I3 p( T

- V0 r: z) p; J$ I
4442e8dec10b4b5baad6506cc18b0828.png " l5 ^( `, E" G$ Q
) o+ u( X+ H3 c) Y$ p, e& `
调用函数OSInit初始化、调用OSTaskCreate来创建任务、调用函数OSStart,启动OS。# y7 k7 {$ T+ @. y5 V

' o0 A" L) h  y$ _. y
到这里呢,一个任务基本的实现步骤就完成了,至于任务里面的功能函数,我就不展示了,你们就自己去移植相应的功能函数过来并加以修改就可以了。4 O5 u. ?9 Y4 w/ @* K

( [. j4 l" D3 b# @
对UCOSII更详细的说明请移步顶楼相应的链接。接下来我对STM32的学习呢,所有的工程都是基于UCOSII操作系统的。此篇文章第一次发布好,文中有不当的地方还请大佬们加以指正,我会及时修改。
* b) p+ y! i: }8 F9 X3 }) l————————————————
. g- j1 o  q* @4 A3 ~0 X  D0 t  q版权声明:田同学在深漂" J* k- W. Z+ J5 V) f6 ~
如有侵权请联系删除5 S# b  H9 C! K/ s  v

- Y4 m& @' Y5 z6 p
$ d2 C- }+ ^2 P* R( q! k) o6 M
收藏 评论0 发布时间:2023-3-21 22:36

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版