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

FREERTOS移植笔记 精华  

[复制链接]
netlhx 发布时间:2015-7-2 21:37
本帖最后由 netlhx 于 2015-7-3 07:37 编辑
8 b- V  |4 [' u4 \- L  Z$ ?' @8 Q3 R, r1 ?+ R
FREERTOS很不错,短小精悍。
; H$ o2 F9 d4 d+ H
" x* R1 ]! X# d移植之前,先来扯下蛋:STM32CUBEMX不是已经支持直接使用FREERTOS了么,随便圈圈叉叉几下,就能使用,为何还要探讨移植问题呢?& m$ j! x/ z# F6 x3 Z3 y, f9 }
% b3 ]5 [: a' ?* k0 J/ |4 M# a
这里有几个原因:
( \4 I0 H% m* P# r' P3 z8 V# S; F; W* r3 I- e8 r
首先,自己移植一遍会对FREERTOS原理理解更深刻; 其次呢,如果碰到其它的MCU呢,没有了STM32CUBEMX的支持,怎么办?还得自己移植!再者,STM自己移植的FREERTOS,还是个阉货,并不完整,很多特性不支持; 还有……+ W) K$ V) @, J3 @8 @" `# h, u
; T6 n( b; j2 c6 E) Q
基于上述原因,还是有必要研究一下移植问题的。
! d! a* D7 y  r# d  _
5 _1 A* c: c, O8 _+ k# Z: y- s2 D要移植,首先得从网上下载源码,地址在这里:http://www.freertos.org/a00104.html?1
8 X7 n% v! s3 B4 a最新版的是V8.2.1,下载后解压,得到如下目录结构: D9 a# C9 {  O3 Y
' N9 O  Y: M& l+ Y5 ^
QQ截图20150702215155.png - `/ Q2 l) V9 i7 ]9 C

8 G% E  B- ]0 ^其中DEMO是一些演示程序,对常见的MCU都有支持,你也可以把它们看作是模板,在此基础上对自己的MCU做移植。8 s! m) G; |9 O: {6 \# ^$ L
( g" Q; V; u4 z
SOURCE文件夹就是FREERTOS的核心代码了。
  q* s8 R" I% r0 s
! v/ U5 J0 Y2 M. c  B6 ^5 x下面一张图显示了要移植的相关文件! N! Q) D7 N3 A
2 [: \- l/ P) c+ z6 P( y! |
QQ截图20150702215509.png
1 D" {, Z4 ^0 E. k. _% ]# l; m
$ R* D7 w/ v4 r  ]4 Q5 D4 R' c未完待续……
, W( D) h" G: k9 K5 H6 p; l! P
; S" W) n5 Q+ w4 @本文只介绍移植方法,并不打算详细挖掘FREERTOS原理,所以上面的这些文件,你暂时只要知道一点:它们的位置,免得需要去找其中一个文件的时候,却发现不知道文件在哪里!5 }/ c1 F7 H  z( r

: Y& P% L, N$ b$ o$ B源代码下载下来了,目录结构也粗粗看了一遍,现在让我们来建立一个新的工程,然后将FREERTOS添加到已有的工程,成为工程的一部分。创建工程的步骤就不赘述了。
- @0 l* h. R; E" t! a3 W+ B- R
# y6 S. c$ k& K6 @本次试验使用的是硬件是F4 DISC,建立新工程文件是使用STM32CUBEMX来完成,下面给出两个图,可以看下大概配置,因为后面的移植需要使用到其中的一些参数。编译环境用的是MDK,如果是IAR的话会有所不同。新建的工程文件名为rtosdemo。
* q# M, ]) q1 `; j7 n; u, w& i+ B6 H; a/ a% H) i$ T1 A4 t! S) D
QQ截图20150703062946.png 3 O  V. J% @9 ~
# k# m$ v$ P# j8 r- _
QQ截图20150703063008.png ' I. S% J+ k1 M

3 c& j' \8 m1 V  l4 y注意SYSCLK的频率配置为168MHZ,后面会用到,至于其中的4个GPIO口则用来点亮板上的4个LED。* U5 G1 `/ t; e8 K1 |. c- K/ |
5 H4 R3 o% t+ b7 ^$ q7 V( f
下面正式开始移植。
9 G" n; T0 N, u0 A& N4 q2 K5 z$ N* }1 m' Q3 K/ b) N! J
在刚刚新建立的工程文件下面建立一个新的目录FreeRTOS,将下载下来的FREERTOS源代码目录下的SOURCE文件夹里的所有内容统统复制到该目录下,如图- \" S+ g3 z% W

6 f" z) N( t3 }8 F+ r1 ~6 H QQ截图20150703064230.png
" c& l# U$ a$ f) V2 ~9 C
/ D' d0 i( @7 n/ w; c% C- ~下面将需要的文件添加到工程之中,见下图2 R6 A& j/ F# Y( |

0 y9 o2 A* a" ~5 F QQ截图20150703064555.png
( Q" s! |9 N) T" F1 G: ], \; q
, z2 K9 L4 h) m- B2 E: K如果有疑问,请参考上面移植相关文件那张图片。' a; F* \% Z9 Z  j- i: {
" J2 \" x& g( p' J9 J
在这里再啰嗦一句,不同的MCU,配置不尽相同,FREERTOS被设计为通用的RTOS,所以我们必须在硬件层做适当的适配,以适应不同的MCU。
( @: ?* d0 w. N' O$ Y0 W
$ u8 J" N- K  }+ a下面在下载的源文件目录下找到这个文件,将这个文件复制到工程的Inc目录下。  i+ v9 |& X3 \; @
" |) o0 g; U; I. {( ^
QQ截图20150703065130.png
9 j. U& ~. e5 E! N* A% d/ K: n! |5 p
& f  @: E$ }9 p5 p1 r; J) w QQ截图20150703065521.png 2 {, ?, d; p) M

0 M% _) l0 `5 d8 A6 S7 G  ?注意选对路径,这是专门为STM32及MDK配置的RTOS配置文件,这个文件里面包含硬件相关的配置信息,如SYSCLK的配置等,因为FREERTOS需要使用到SYSTICK来作为心跳时钟。7 j+ J3 ]9 [, g' J3 e' L0 _

; Y1 _5 I" F" h1 |1 C5 D/ r- y下面打开这个文件来看看7 O3 [  u9 l- L; P6 _6 c; k" o
% J" N, Z+ ^" b* |6 |. J$ T
QQ截图20150703065855.png ) g' n, w. r1 I2 H
8 Z' |3 t  k0 d7 u. K: c& R
注意168000000处,这里就是前面配置好的硬件SYSCLK,如果这个参数不对,会导致混乱!2 y; n1 y+ m9 |6 s1 o2 a4 `

& m4 L  M* n* n: G$ B好了,现在可以编译一下,看一下,有错误?肯定,你还没有添加FREERTOS相关的包含路径配置,所以趁现在赶紧修改一下
; }* ~+ S1 [: D0 X- o
/ C% F7 T0 R* V0 H, g如果没有错误,接下来可以添加两个任务试一试了,添加的任务如下:
0 k9 `1 ~( o4 i9 U9 `0 L) F, Z. N8 K5 }& p8 c* r& u' @
QQ截图20150703071928.png ) W( M2 {0 r' t) E' L

$ k! f! h1 N4 h& f3 p; d QQ截图20150703071950.png / [+ u9 r) s4 X' n
) P# h  ?' b' ]3 K( o* u9 F5 {
QQ截图20150703072019.png
/ S# \& i6 `4 R! B' }  B, ~: r& ]

! _" ]1 v5 r6 M: A- Y# C1 V! c再编译,排除错误后,下载到开发板,期待LED开始闪烁吧!; }) h9 v- ~, o' B

! ]5 {& @1 K2 @3 Q不过让人郁闷的是,灯并不会闪,还有个小问题要解决。
: x/ A5 H4 }+ h: K1 G4 |, y
! h! l5 V& I2 n" y& z打开启动配置文件startup_stm32f407xx.s,按下面的修改
  B1 d: p: t: P: Z' j2 |! Z
& [. ~9 g' p1 q& K+ |5 {% J QQ截图20150703072416.png
7 e5 g$ Q. I; S+ Z9 H/ }4 p
8 X& ~5 P' A7 J/ Q5 ~3 I
8 m& b! ?  O& f! I( S+ V( P为什么要这样修改?因为FREERTOS接管了SYSTICK及SVC等操作,所以不修改FREERTOS就不会工作。& f6 X1 R3 b5 e0 A

, P7 |2 N$ C8 j, T" |再下载到开发板,红灯以1S的频率闪烁,蓝灯以4S的频率闪烁!
& l. _$ W7 C& n9 {% S9 Y+ S) i
( W) C7 E. N# h, {呼呼,大功告成!
4 }: Q0 {9 ]5 k2 @3 |0 c& L4 ?5 z9 B; L. q+ w" a
完整的工程文件: rtosdemo.zip (5.94 MB, 下载次数: 178)
收藏 19 评论46 发布时间:2015-7-2 21:37

举报

46个回答
党国特派员 回答时间:2015-7-3 08:01:15
支持一下。 null.png null1.png null2.png null3.png null4.png null5.png null6.png null7.png null8.png null9.png
2602082487 回答时间:2016-1-27 16:40:47
捕获.PNG
6 F- i! t, g) z1 ^5 I/ a$ l! h楼主你好,我按照你的改动启动文件后,出现了如上的错误信息,在不改动启动文件的情况下,编译无错误,但是进入PendSVHandler后,仍然是在启动文件里面定义的PendSVHandler里面死循环,没有进入port.c里面定义的xPortPendSVHandler,可能是什么原因呢/ ], U8 ~3 R. g
Asce 回答时间:2016-3-13 14:45:20
学习了,用的FreeRTOSV8.2.3移植成功了,不过还有些疑问:9 u/ }. o5 I, s9 S; s; [9 J
xPortSysTickHandler在向量表里申明了以后不需要在SysTick_Handler函数中调用吗?3 {7 T5 x  g  z- G1 _7 A- S
我看CubeMX生成的文件里需要变相调用这个中断函数的,但是在这里没调用好像也能run起来,有些奇怪。
netlhx 回答时间:2015-7-2 21:37:54
一楼是自己的
netlhx 回答时间:2015-7-2 21:38:02
二楼是自己的
netlhx 回答时间:2015-7-2 21:38:11
三楼还是自己的
风子 回答时间:2015-7-2 23:23:17
坐等楼主更新
moyanming2013 回答时间:2015-7-3 00:02:58
等更新看看
戏如人生 回答时间:2015-7-3 08:15:20
写的不错,CUBE是个很好的工具) N" Y7 I+ x% X: Z
沐紫 回答时间:2015-7-3 08:42:40
好贴,
759611 回答时间:2015-7-3 08:53:47
好贴,不过这freertos还要重新学习库函数么?创建任务貌似还比较复杂呀
netlhx 回答时间:2015-7-3 08:57:32
759611 发表于 2015-7-3 08:53
9 J7 C! ?. p- }9 u/ d1 [& N  m好贴,不过这freertos还要重新学习库函数么?创建任务貌似还比较复杂呀
1 {6 E9 v2 N4 O
这样熟悉一下,以后不管哪种类型的MCU,用起来都游刃有余
netlhx 回答时间:2015-7-3 08:57:51
沐紫 发表于 2015-7-3 08:42
! \9 P! h7 h& m/ b% n2 x9 \+ l* s好贴,
7 x+ N3 d9 }. Q) a
netlhx 回答时间:2015-7-3 08:58:12
戏如人生 发表于 2015-7-3 08:15
$ @. @7 c# Q  H写的不错,CUBE是个很好的工具

+ X9 {1 J2 L# {  p1 }7 R6 b这个跟CUBE真没有关系
netlhx 回答时间:2015-7-3 08:58:32
moyanming2013 发表于 2015-7-3 00:02( ^" U3 b# Z9 B+ x# P
等更新看看
1 g) ^3 k# G7 Q. p. {- M6 a
已更新
netlhx 回答时间:2015-7-3 08:58:46
moyanming2013 发表于 2015-7-3 00:02
( M- z! I5 w$ o. W1 C等更新看看

4 N, g# i7 J6 V* n" |已更新
1234下一页

所属标签

相似分享

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