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

FREERTOS移植笔记 精华  

[复制链接]
netlhx 发布时间:2015-7-2 21:37
本帖最后由 netlhx 于 2015-7-3 07:37 编辑   X3 C  X" f6 a3 _6 \! N/ |: j

" h* f9 d4 y$ `1 s( ]5 g! ZFREERTOS很不错,短小精悍。  ?5 L5 \& J. j* ?( Z
6 X- D& L0 t3 M9 m7 z  M: n' n
移植之前,先来扯下蛋:STM32CUBEMX不是已经支持直接使用FREERTOS了么,随便圈圈叉叉几下,就能使用,为何还要探讨移植问题呢?9 U. V, _- o* J9 J: {; ?
9 B' U+ H3 c: A
这里有几个原因:
+ l! I3 h# y$ e2 [
$ ~0 Y! H  V* _首先,自己移植一遍会对FREERTOS原理理解更深刻; 其次呢,如果碰到其它的MCU呢,没有了STM32CUBEMX的支持,怎么办?还得自己移植!再者,STM自己移植的FREERTOS,还是个阉货,并不完整,很多特性不支持; 还有……" |/ E6 ^" n3 w/ O7 A
' L# ?4 D9 {7 z* K7 \" W, L+ h3 R
基于上述原因,还是有必要研究一下移植问题的。
' O4 b3 U& X! V% [# ]1 N
8 m' E: p3 M1 ?+ d* B) P要移植,首先得从网上下载源码,地址在这里:http://www.freertos.org/a00104.html?1! ~/ w7 b! F8 i; [
最新版的是V8.2.1,下载后解压,得到如下目录结构
2 P( N1 x3 ~. F1 l) ]( v5 j3 D
( T6 Z& F6 b4 ] QQ截图20150702215155.png
# |3 m. U; k( o9 z" x
* Z1 e+ S6 @  G! K# i: b* j" s其中DEMO是一些演示程序,对常见的MCU都有支持,你也可以把它们看作是模板,在此基础上对自己的MCU做移植。
5 E; L. F" u* Z) ^6 @& i  d! e7 f1 M/ _. i/ F
SOURCE文件夹就是FREERTOS的核心代码了。# c4 O2 ~6 l- B4 j' h" x: ~+ O. t  _
: j2 T+ n: f6 n; Z. {7 i' N& V
下面一张图显示了要移植的相关文件
; v' a. A6 v6 h, R, ?
# p1 a( ?. M6 t QQ截图20150702215509.png ( ]+ Q9 w4 S) ^( B$ K; n' h
8 Z* o$ W2 l" r1 s" A3 o4 j+ B" h; S
未完待续……0 f; h: X0 B, N. x1 r0 k  G

# d! f: J+ ^  t2 w7 e) J本文只介绍移植方法,并不打算详细挖掘FREERTOS原理,所以上面的这些文件,你暂时只要知道一点:它们的位置,免得需要去找其中一个文件的时候,却发现不知道文件在哪里!
* j) h4 Y- z. Z5 l2 [& [, s5 m- z& W; e5 I4 a# a/ u1 K
源代码下载下来了,目录结构也粗粗看了一遍,现在让我们来建立一个新的工程,然后将FREERTOS添加到已有的工程,成为工程的一部分。创建工程的步骤就不赘述了。
9 h, M2 U# [  B! `) i2 n9 w! [( F& Z5 N0 F# i# j$ e, M
本次试验使用的是硬件是F4 DISC,建立新工程文件是使用STM32CUBEMX来完成,下面给出两个图,可以看下大概配置,因为后面的移植需要使用到其中的一些参数。编译环境用的是MDK,如果是IAR的话会有所不同。新建的工程文件名为rtosdemo。5 E  K! U) f& q
- l1 f" ~! l" n" G
QQ截图20150703062946.png
5 t7 U% @* v# R  V1 W; @
, Z' o8 g' C3 O QQ截图20150703063008.png * h8 a$ \/ ]$ S$ j; b( Q4 [

3 D# r8 }5 n& p1 X, @% ~注意SYSCLK的频率配置为168MHZ,后面会用到,至于其中的4个GPIO口则用来点亮板上的4个LED。4 P  ^2 w4 j( M$ Z9 \

& x, e' m8 W# i, C3 n下面正式开始移植。
+ y: J- N' Z5 x& Y; ?
9 A% N" {1 j' y在刚刚新建立的工程文件下面建立一个新的目录FreeRTOS,将下载下来的FREERTOS源代码目录下的SOURCE文件夹里的所有内容统统复制到该目录下,如图
5 J3 y* O8 a/ _. u5 {! L3 _: z, u# h# s$ p0 f" Z
QQ截图20150703064230.png , R* k6 r" d- |% d

' W7 N3 P: A5 r, b6 H下面将需要的文件添加到工程之中,见下图
+ d$ `' s, x: ^8 X
/ d2 o, V! U8 ]7 q/ H. K# \: t QQ截图20150703064555.png ' Y  X) Z( W5 A6 L" z' w% a

' ^7 s9 m6 G; X+ `/ K, q如果有疑问,请参考上面移植相关文件那张图片。
& ]7 H. f9 E4 C& m1 n  r3 S9 {  x, P
$ o5 U% H  L. a+ ~8 [' @( v' }1 x在这里再啰嗦一句,不同的MCU,配置不尽相同,FREERTOS被设计为通用的RTOS,所以我们必须在硬件层做适当的适配,以适应不同的MCU。
6 N: E3 a# {" ]- u% }" f' @- F: d( o7 z9 b; a* c
下面在下载的源文件目录下找到这个文件,将这个文件复制到工程的Inc目录下。" @) U9 }& x1 Y/ k. B

" T2 V1 }/ O! ^% T QQ截图20150703065130.png
. m# }' z& D2 Y% i- ^1 R/ {9 D' a% r6 J( x! b" R& ~! X& P
QQ截图20150703065521.png
  k, H* H4 E8 R8 K" H2 _: |7 w) |% t9 n8 y  P& k
注意选对路径,这是专门为STM32及MDK配置的RTOS配置文件,这个文件里面包含硬件相关的配置信息,如SYSCLK的配置等,因为FREERTOS需要使用到SYSTICK来作为心跳时钟。
, P# c6 ^# n1 F5 y' b
& {3 c: m  Q! O下面打开这个文件来看看
- N4 l, ?0 @1 Y( J" t/ n# R1 L7 p6 w/ Q+ L* T
QQ截图20150703065855.png 2 r* n+ {& ]3 _
' I" E0 Q- p) K1 t. `: X) t2 ?) y
注意168000000处,这里就是前面配置好的硬件SYSCLK,如果这个参数不对,会导致混乱!0 h9 K7 H6 Q+ }! H5 U0 K) L% \

+ x( U" v% T7 S1 V: I' `+ Q好了,现在可以编译一下,看一下,有错误?肯定,你还没有添加FREERTOS相关的包含路径配置,所以趁现在赶紧修改一下
2 N! [& [; ?$ t. p' W1 B
% m8 f, p2 r. t) I- b: P/ R2 W如果没有错误,接下来可以添加两个任务试一试了,添加的任务如下:
$ \; {1 w* ~% ~6 ]5 c+ x2 I# R/ c1 o! Z9 I. O+ ]6 E
QQ截图20150703071928.png
4 b( e8 ^: Q0 B; G  x- ^. f# I& B
QQ截图20150703071950.png
# h' d* r$ l* U  `% P. _; N6 R1 Z, G1 }
QQ截图20150703072019.png ; M/ m; a& O1 q3 q
* ^1 J, _0 l5 J$ Z5 @7 ^

8 ?# o7 ^# @3 E6 t) N- \+ e再编译,排除错误后,下载到开发板,期待LED开始闪烁吧!
! ]  }9 y2 ?" ^. l" f5 v( A! V' I8 V$ D' e% n; f
不过让人郁闷的是,灯并不会闪,还有个小问题要解决。
/ v; T% y& X. Z, J; F7 c9 v* M: R  ~
打开启动配置文件startup_stm32f407xx.s,按下面的修改
0 m, n4 i* j+ [3 h8 v
& j5 h, c8 |. G9 v QQ截图20150703072416.png / o5 L1 Q) v; s: F

3 s$ C( F0 P* X
0 P" V. K; t. i! ?. p为什么要这样修改?因为FREERTOS接管了SYSTICK及SVC等操作,所以不修改FREERTOS就不会工作。
/ |& t& q: u1 @# \( ]$ ]- `/ ~7 A& M8 y
再下载到开发板,红灯以1S的频率闪烁,蓝灯以4S的频率闪烁!
4 @# o0 w7 \- Y7 D5 s% B1 z0 [" _
) P, L7 ?2 t  n: q) d呼呼,大功告成!/ n# i% C+ V4 Q8 \2 F  d6 W

8 V; F$ H4 W/ j) z完整的工程文件: 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 - v. j0 o. u; M1 ?: K% B- a7 W
楼主你好,我按照你的改动启动文件后,出现了如上的错误信息,在不改动启动文件的情况下,编译无错误,但是进入PendSVHandler后,仍然是在启动文件里面定义的PendSVHandler里面死循环,没有进入port.c里面定义的xPortPendSVHandler,可能是什么原因呢
% [# p4 O8 F9 E! j& e
Asce 回答时间:2016-3-13 14:45:20
学习了,用的FreeRTOSV8.2.3移植成功了,不过还有些疑问:
! u" r5 _; t4 Z' E0 OxPortSysTickHandler在向量表里申明了以后不需要在SysTick_Handler函数中调用吗?& n; V" o, T9 V- P
我看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是个很好的工具
' h1 ?# l) v; _" w! ^) z. W
沐紫 回答时间: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& Q7 w' i7 Y0 s4 U- K
好贴,不过这freertos还要重新学习库函数么?创建任务貌似还比较复杂呀

/ m) M/ B5 z. G1 G这样熟悉一下,以后不管哪种类型的MCU,用起来都游刃有余
netlhx 回答时间:2015-7-3 08:57:51
沐紫 发表于 2015-7-3 08:42  `# A6 o1 B) L- @1 o
好贴,
% q/ B3 M/ c: z+ m
netlhx 回答时间:2015-7-3 08:58:12
戏如人生 发表于 2015-7-3 08:15" l- f. z- G2 o2 K  W
写的不错,CUBE是个很好的工具

! L, g- C" V& m4 V这个跟CUBE真没有关系
netlhx 回答时间:2015-7-3 08:58:32
moyanming2013 发表于 2015-7-3 00:02" R/ X# l  u  [  ^# ^' [
等更新看看

( V8 G. N+ C# H9 z已更新
netlhx 回答时间:2015-7-3 08:58:46
moyanming2013 发表于 2015-7-3 00:02: m* U$ O- L$ Z& i6 c, M3 {- Z# j; b
等更新看看

1 X4 {: k3 A$ ^2 K/ B已更新
1234下一页

所属标签

相似分享

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