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

FREERTOS移植笔记 精华  

[复制链接]
netlhx 发布时间:2015-7-2 21:37
本帖最后由 netlhx 于 2015-7-3 07:37 编辑 % {9 V1 f* H. [! x8 M
/ ~7 q5 i" z6 J$ F9 O2 e* t
FREERTOS很不错,短小精悍。$ d7 a1 ^9 H5 u/ \2 w9 R- x8 t
: w9 ~2 k' l9 N7 y
移植之前,先来扯下蛋:STM32CUBEMX不是已经支持直接使用FREERTOS了么,随便圈圈叉叉几下,就能使用,为何还要探讨移植问题呢?+ M. ?8 ]" H( {  x& L; S
2 }: A& ]6 G$ K' x1 }# n
这里有几个原因:
$ O( P, n+ u+ {. w" W# o
% {; O* O: |4 s+ K) o/ z1 R5 W首先,自己移植一遍会对FREERTOS原理理解更深刻; 其次呢,如果碰到其它的MCU呢,没有了STM32CUBEMX的支持,怎么办?还得自己移植!再者,STM自己移植的FREERTOS,还是个阉货,并不完整,很多特性不支持; 还有……
& O1 B& O, X1 s' }/ [' R( J% {, W9 m% i
基于上述原因,还是有必要研究一下移植问题的。. ^' @5 W/ k  D% b: t& L

" K' [/ w* q7 a% r要移植,首先得从网上下载源码,地址在这里:http://www.freertos.org/a00104.html?1
  P9 ~2 o: j* H( h: q最新版的是V8.2.1,下载后解压,得到如下目录结构
) P' ^4 @' w1 n8 {3 a
8 R2 Q$ d. R  h: J4 f QQ截图20150702215155.png - J* u7 n6 [, c# k+ a1 h6 @0 k
  U8 V$ a3 ^. F3 ?% K/ S  u
其中DEMO是一些演示程序,对常见的MCU都有支持,你也可以把它们看作是模板,在此基础上对自己的MCU做移植。
0 q& |- j8 y3 U: M% _) u1 p$ h# t2 w) S% _' u
SOURCE文件夹就是FREERTOS的核心代码了。
- e0 ~0 c5 J% F& }: P
) U6 g0 h; E" v, y下面一张图显示了要移植的相关文件0 i, O$ a6 v( j

, v+ O+ B! B9 h0 I QQ截图20150702215509.png ! y# M8 L9 F* S$ q5 z: z

3 @1 z& D; i# |3 B* S未完待续……
# J9 j$ U1 @7 \7 j  [; H; M2 b' H6 Z3 g7 B7 e$ \2 r. @
本文只介绍移植方法,并不打算详细挖掘FREERTOS原理,所以上面的这些文件,你暂时只要知道一点:它们的位置,免得需要去找其中一个文件的时候,却发现不知道文件在哪里!1 C* d9 I: G" }( t& X+ `/ l  s

) \( @* U2 ^# ]/ L5 {2 v源代码下载下来了,目录结构也粗粗看了一遍,现在让我们来建立一个新的工程,然后将FREERTOS添加到已有的工程,成为工程的一部分。创建工程的步骤就不赘述了。
- Z- ]" J, o0 h; y( u5 B1 K5 A/ \+ @1 d8 C
本次试验使用的是硬件是F4 DISC,建立新工程文件是使用STM32CUBEMX来完成,下面给出两个图,可以看下大概配置,因为后面的移植需要使用到其中的一些参数。编译环境用的是MDK,如果是IAR的话会有所不同。新建的工程文件名为rtosdemo。2 _, \  q/ Z0 K3 h

+ V1 p: w# c7 B; E2 b( B QQ截图20150703062946.png
. t( p, R- O9 u5 d' V- s- p3 P) J. l3 F* n& ~
QQ截图20150703063008.png . W6 k! N% m2 v( y1 U8 z+ x& G
( O4 p7 e( _' D
注意SYSCLK的频率配置为168MHZ,后面会用到,至于其中的4个GPIO口则用来点亮板上的4个LED。) ^/ ?9 y8 O! S/ Q0 V

0 Q4 a+ E, l1 w& }$ A下面正式开始移植。
2 q0 u- V. h3 v
! n( n- G; `; S  I. _在刚刚新建立的工程文件下面建立一个新的目录FreeRTOS,将下载下来的FREERTOS源代码目录下的SOURCE文件夹里的所有内容统统复制到该目录下,如图  c3 v& g+ G) }

- P) c0 m, v" M; X QQ截图20150703064230.png
8 q) z; n3 q! |5 E- A9 M
  |$ Z) V4 C! w7 U. w( r/ h下面将需要的文件添加到工程之中,见下图
1 b' r4 P; L/ A* J
$ {/ O3 m- m3 I$ g* A' a! f1 ]7 d6 f QQ截图20150703064555.png
- B1 o* F4 h4 M! G2 _7 t* D, a
& l' U' q3 H% @$ E. n如果有疑问,请参考上面移植相关文件那张图片。
. F6 {7 B" W. b. J4 G" }2 ]# w# e- _
在这里再啰嗦一句,不同的MCU,配置不尽相同,FREERTOS被设计为通用的RTOS,所以我们必须在硬件层做适当的适配,以适应不同的MCU。
2 A! U0 g. Y& F/ Z7 v: _3 ~9 }' H9 a2 T8 H* _
下面在下载的源文件目录下找到这个文件,将这个文件复制到工程的Inc目录下。
- H, v9 m) `6 B, x' R1 e' _) p
: e  {3 ~& ~* t/ d8 O' } QQ截图20150703065130.png
  e2 K6 N) l( Y1 m& O
1 z  x5 m+ M6 I; Z4 J6 _3 o( b; S QQ截图20150703065521.png
% m' F9 y& C( t0 u+ i6 N7 c& R, c9 ^( h6 i8 ~% Z3 M# o* c
注意选对路径,这是专门为STM32及MDK配置的RTOS配置文件,这个文件里面包含硬件相关的配置信息,如SYSCLK的配置等,因为FREERTOS需要使用到SYSTICK来作为心跳时钟。
1 l5 V8 o" a3 [# @, a4 r/ a# W4 b" J+ S0 L* D1 M  r
下面打开这个文件来看看
. f; R) y+ ?7 x& H8 g: Y) a% M, E) f
QQ截图20150703065855.png
/ g5 ?5 j+ ^0 v  [+ }/ o6 a5 c- p6 y4 \7 v9 c* y3 D4 s* ]7 @7 b
注意168000000处,这里就是前面配置好的硬件SYSCLK,如果这个参数不对,会导致混乱!  g* X/ K$ V: T. |' h+ j
5 m+ M" i* m( a9 R& r( m! f
好了,现在可以编译一下,看一下,有错误?肯定,你还没有添加FREERTOS相关的包含路径配置,所以趁现在赶紧修改一下. Y  a3 U5 I6 L4 O6 ?: M

8 f0 S+ N: P) G3 K& A如果没有错误,接下来可以添加两个任务试一试了,添加的任务如下:8 d" m7 o( e# {$ w% J' z: j
) w& V3 r( z; `
QQ截图20150703071928.png 2 x0 A" P4 e& m

, k: O! y/ r) Y- ~ QQ截图20150703071950.png
) N# U: A6 n; ]4 ~+ F! r& y5 K. M/ D
QQ截图20150703072019.png
" B' D* M6 F/ O% v  b6 ~3 @2 a% y+ n

% M6 s; k' U" j4 Y; y再编译,排除错误后,下载到开发板,期待LED开始闪烁吧!
* z' c8 |5 f* O1 u& ~0 u. f0 v  B. e4 I7 I8 c
不过让人郁闷的是,灯并不会闪,还有个小问题要解决。
4 K9 ]; ]  ?" ?/ y. B5 n) d
4 I; O. b: @( h打开启动配置文件startup_stm32f407xx.s,按下面的修改6 W& j+ I3 q$ k/ g; [
* s4 m4 ?$ _9 B) O5 ?' T6 q: f
QQ截图20150703072416.png ! `1 e4 V1 M1 y$ H) G" C& J: i# ?
( n* k# }# |& \
/ ?: _. f# S1 s% k! V/ U! X
为什么要这样修改?因为FREERTOS接管了SYSTICK及SVC等操作,所以不修改FREERTOS就不会工作。% p2 v! a) h( \' A; R4 A
' u1 h& c1 u5 v
再下载到开发板,红灯以1S的频率闪烁,蓝灯以4S的频率闪烁!0 Q$ v$ J0 v2 O  v
, l2 U2 a# B; |! f3 b
呼呼,大功告成!
2 U% f! d+ w, |- e8 Q
8 S7 _' M7 J% T7 t" D( C) 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 ; b* [, s2 J' ^9 j7 A0 s  U8 Y" P" D
楼主你好,我按照你的改动启动文件后,出现了如上的错误信息,在不改动启动文件的情况下,编译无错误,但是进入PendSVHandler后,仍然是在启动文件里面定义的PendSVHandler里面死循环,没有进入port.c里面定义的xPortPendSVHandler,可能是什么原因呢6 ]3 L- v; g5 i9 M; N$ {/ Q5 r/ p
Asce 回答时间:2016-3-13 14:45:20
学习了,用的FreeRTOSV8.2.3移植成功了,不过还有些疑问:
/ ~' s: v9 t2 u5 Q* IxPortSysTickHandler在向量表里申明了以后不需要在SysTick_Handler函数中调用吗?
# b7 m" W; ?+ t7 d我看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是个很好的工具
$ S" ^5 d3 I  ?6 ^; V: U+ e
沐紫 回答时间: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:538 p% ~; ~2 Q" G! J
好贴,不过这freertos还要重新学习库函数么?创建任务貌似还比较复杂呀

4 H3 z/ Z2 j( R2 o+ _2 H8 h2 {+ g这样熟悉一下,以后不管哪种类型的MCU,用起来都游刃有余
netlhx 回答时间:2015-7-3 08:57:51
沐紫 发表于 2015-7-3 08:42# d0 U; T& w6 ]% Z6 I
好贴,

3 p8 w+ l6 s& k1 r6 n! X7 N
netlhx 回答时间:2015-7-3 08:58:12
戏如人生 发表于 2015-7-3 08:15
- }  E3 ]6 O' ^6 t8 g& h7 S5 R写的不错,CUBE是个很好的工具
) [+ x& ?# k6 p: d- a7 D
这个跟CUBE真没有关系
netlhx 回答时间:2015-7-3 08:58:32
moyanming2013 发表于 2015-7-3 00:025 p2 X3 u2 O( F" i- h( D
等更新看看

6 U; @6 `1 _# k$ |) O+ A3 `& P已更新
netlhx 回答时间:2015-7-3 08:58:46
moyanming2013 发表于 2015-7-3 00:02' J% N/ |- n& c" L
等更新看看

4 \! Y% c# D) W) _. D& R0 }已更新
1234下一页

所属标签

相似分享

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