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

FREERTOS移植笔记 精华  

[复制链接]
netlhx 发布时间:2015-7-2 21:37
本帖最后由 netlhx 于 2015-7-3 07:37 编辑
& J( ^! g! ~! S5 b( r0 S
# |: C# |7 C* ]FREERTOS很不错,短小精悍。8 k' f( ?" A/ ]& s7 ~% ?& s# D! _& {
" V6 y/ S; P% K  K: M
移植之前,先来扯下蛋:STM32CUBEMX不是已经支持直接使用FREERTOS了么,随便圈圈叉叉几下,就能使用,为何还要探讨移植问题呢?5 M; X2 r" g5 {, k' p# ^

) m* ~& k; z, U& e0 |" ?这里有几个原因:8 J4 @2 L! A7 z% {, b: Y% s
/ z& P4 [9 f  C+ \8 j
首先,自己移植一遍会对FREERTOS原理理解更深刻; 其次呢,如果碰到其它的MCU呢,没有了STM32CUBEMX的支持,怎么办?还得自己移植!再者,STM自己移植的FREERTOS,还是个阉货,并不完整,很多特性不支持; 还有……
8 K& a. f1 {2 S- E. Y- S2 M2 E, ?& ~) v
基于上述原因,还是有必要研究一下移植问题的。
1 y. U! n2 Q; J  Z" S$ B
7 u/ m( P7 @" K$ p7 Q. g3 b要移植,首先得从网上下载源码,地址在这里:http://www.freertos.org/a00104.html?1
3 [2 X9 y# K/ ^$ l1 Q最新版的是V8.2.1,下载后解压,得到如下目录结构# P; i) Q, t; f

: I' X0 C. }9 |' C( z7 ^7 r% d) f QQ截图20150702215155.png ' C) i1 O1 P0 ]

  |' g2 M% C, D" t) e其中DEMO是一些演示程序,对常见的MCU都有支持,你也可以把它们看作是模板,在此基础上对自己的MCU做移植。2 x4 S* B+ ^7 |+ C

: t/ J# i# E6 A# K. r' V3 _) v6 XSOURCE文件夹就是FREERTOS的核心代码了。
5 o) a& i/ D* R3 A* y/ u" ?5 X! h% T% Z
下面一张图显示了要移植的相关文件
8 e4 {' o2 h" u) ~  \- h0 n; F2 R
, ^1 j* F: U1 J1 f5 N, E1 h QQ截图20150702215509.png
$ [; h! @/ g6 E4 y# [2 `9 g; a( H) b5 x# [3 P9 G6 F& f
未完待续……
. m4 S) ~/ X( e/ I/ u
$ U4 ~. S- c5 O: M1 \# V, d6 `! [# g/ b本文只介绍移植方法,并不打算详细挖掘FREERTOS原理,所以上面的这些文件,你暂时只要知道一点:它们的位置,免得需要去找其中一个文件的时候,却发现不知道文件在哪里!+ M# z& J/ T/ I/ A& E7 N
- x; W5 w: ~) [  L! N0 l9 H
源代码下载下来了,目录结构也粗粗看了一遍,现在让我们来建立一个新的工程,然后将FREERTOS添加到已有的工程,成为工程的一部分。创建工程的步骤就不赘述了。
* q4 @+ k, r. h2 W, ~. ?* y; v7 N' P- P; S* d
本次试验使用的是硬件是F4 DISC,建立新工程文件是使用STM32CUBEMX来完成,下面给出两个图,可以看下大概配置,因为后面的移植需要使用到其中的一些参数。编译环境用的是MDK,如果是IAR的话会有所不同。新建的工程文件名为rtosdemo。% O  J* y5 K$ H' }' P! x
& H" b7 G/ d* M
QQ截图20150703062946.png - N' ~/ E4 d- P. z
5 ^& }6 F/ D3 }6 b
QQ截图20150703063008.png 1 Q1 a# w( m8 S; F" D
5 a2 O8 l6 ]$ s" u4 a6 B+ t
注意SYSCLK的频率配置为168MHZ,后面会用到,至于其中的4个GPIO口则用来点亮板上的4个LED。
" y% f+ c8 a$ T0 w4 G+ m1 _9 |! T: [1 g% b% x  O
下面正式开始移植。
2 O% U1 p* W0 m& f% X. }1 g5 @
7 r& O/ i  R, F0 [3 b* V在刚刚新建立的工程文件下面建立一个新的目录FreeRTOS,将下载下来的FREERTOS源代码目录下的SOURCE文件夹里的所有内容统统复制到该目录下,如图3 F" j. M2 u+ z9 N* A8 ^! v

- E# m2 t) }2 i QQ截图20150703064230.png
6 ]2 w* B, E- F1 P
) e+ i+ r& I4 ?, Z9 P# p6 q, p( e6 _下面将需要的文件添加到工程之中,见下图
" K6 Y! |. ~' y) l! Q1 H6 _  c! z# d% b
QQ截图20150703064555.png " }  r# _( q6 G

  z+ a3 C$ K/ L0 ~如果有疑问,请参考上面移植相关文件那张图片。4 n3 j! q( X, d! B8 c

" ^+ c; j4 X6 g9 N. A  G/ x0 W" w. r1 x! H在这里再啰嗦一句,不同的MCU,配置不尽相同,FREERTOS被设计为通用的RTOS,所以我们必须在硬件层做适当的适配,以适应不同的MCU。  p; [# V( \6 q3 c

% J* m3 P  E2 f+ I4 I( i+ V下面在下载的源文件目录下找到这个文件,将这个文件复制到工程的Inc目录下。
0 w' C% h2 ?/ ^2 u' P1 L% s0 H
; v& s3 ^0 \8 u2 f5 C$ w QQ截图20150703065130.png * M% }$ R8 M. D$ O3 }0 o( E

6 e: W4 t6 n8 V( i QQ截图20150703065521.png 4 O' }8 \7 r1 s; H' M
' v8 h- T1 F, {8 |$ @, B( i3 }2 o
注意选对路径,这是专门为STM32及MDK配置的RTOS配置文件,这个文件里面包含硬件相关的配置信息,如SYSCLK的配置等,因为FREERTOS需要使用到SYSTICK来作为心跳时钟。* f$ g' |8 a/ W% s! ~& _  j

0 D4 [$ R. J. v下面打开这个文件来看看
' `2 y/ Q  z% k' Q, N! |5 _, k. D. j. D* o1 ], j
QQ截图20150703065855.png " n9 y$ j4 V% b  V$ b. Q
9 ?  b3 f- L9 z+ h, g
注意168000000处,这里就是前面配置好的硬件SYSCLK,如果这个参数不对,会导致混乱!
% e* s3 c0 R3 o  q; f( e3 s0 p$ a' \
$ ^0 C1 B7 r: V; Z) Q1 U好了,现在可以编译一下,看一下,有错误?肯定,你还没有添加FREERTOS相关的包含路径配置,所以趁现在赶紧修改一下) |! w0 ?# [, D. f, r9 i, s

: ]2 T: ~+ ]5 U5 D# |" o* d如果没有错误,接下来可以添加两个任务试一试了,添加的任务如下:
/ C; x6 q% X) K' a4 k, c% s; m  }$ N" S- g
QQ截图20150703071928.png
, c+ \1 N; o; @' v3 @' r4 N' S7 {5 r2 |0 l, j5 E
QQ截图20150703071950.png ) @4 f- x- `8 e
3 c7 S, M7 k; s7 i1 R
QQ截图20150703072019.png $ Q  Y4 W- q$ L: D; J$ Z
% |$ t2 G- e! |, f/ j
, a, x! N5 _7 @( z* m
再编译,排除错误后,下载到开发板,期待LED开始闪烁吧!( O7 R1 K1 U% s) l6 H

8 y3 @" x+ B7 m5 W' e不过让人郁闷的是,灯并不会闪,还有个小问题要解决。
5 F6 C+ j$ u, {2 _6 Q$ j2 ^
  N# E5 S9 u7 c8 @打开启动配置文件startup_stm32f407xx.s,按下面的修改
  [+ }0 |* C6 s* v0 c
1 q  w6 m- ?+ w1 z  y* C% _' i QQ截图20150703072416.png 9 \! z4 M4 }: l7 f
# `1 Q8 Q3 H# y$ T7 q! x" f8 d
3 F* f1 b4 R9 e5 K: p5 e/ T- D
为什么要这样修改?因为FREERTOS接管了SYSTICK及SVC等操作,所以不修改FREERTOS就不会工作。# A' `( v. X; p; W

* M1 {9 O8 ~- J4 f* ?8 h再下载到开发板,红灯以1S的频率闪烁,蓝灯以4S的频率闪烁!8 o' d, [% e( m5 `: E. z
* `0 B5 |% V3 ]9 R4 Q0 O2 f, H& l
呼呼,大功告成!
" s* v  n5 g' ^  y% R
9 A4 o( x# t& u7 H) @# H# i2 @完整的工程文件: 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 G8 }4 _% O& O- v# a( F! l楼主你好,我按照你的改动启动文件后,出现了如上的错误信息,在不改动启动文件的情况下,编译无错误,但是进入PendSVHandler后,仍然是在启动文件里面定义的PendSVHandler里面死循环,没有进入port.c里面定义的xPortPendSVHandler,可能是什么原因呢
# H3 d& w  e- {& E* \
Asce 回答时间:2016-3-13 14:45:20
学习了,用的FreeRTOSV8.2.3移植成功了,不过还有些疑问:
$ Z  v; u1 _) X6 Y$ `9 CxPortSysTickHandler在向量表里申明了以后不需要在SysTick_Handler函数中调用吗?# y  d' B/ e: a
我看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是个很好的工具. ^+ Z2 ?' j" F+ ^9 \
沐紫 回答时间: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:534 W1 @9 o- }5 q
好贴,不过这freertos还要重新学习库函数么?创建任务貌似还比较复杂呀

# e7 I; U+ f. f" |这样熟悉一下,以后不管哪种类型的MCU,用起来都游刃有余
netlhx 回答时间:2015-7-3 08:57:51
沐紫 发表于 2015-7-3 08:420 U/ O! n! C1 s3 j( s- r
好贴,

% W0 ^, A3 y$ \) d& W& R
netlhx 回答时间:2015-7-3 08:58:12
戏如人生 发表于 2015-7-3 08:15. m8 R" L1 s/ L: h; @1 p6 H( t4 l
写的不错,CUBE是个很好的工具

9 C7 l! R+ v& t, D0 }这个跟CUBE真没有关系
netlhx 回答时间:2015-7-3 08:58:32
moyanming2013 发表于 2015-7-3 00:02
; r) t8 q& `; s7 j  q等更新看看

" L. h4 p; I  j已更新
netlhx 回答时间:2015-7-3 08:58:46
moyanming2013 发表于 2015-7-3 00:02% p6 w  Q/ d8 Y/ Y
等更新看看
  ^3 A$ z* K9 Z) G
已更新
1234下一页

所属标签

相似分享

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