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

FREERTOS移植笔记 精华  

[复制链接]
netlhx 发布时间:2015-7-2 21:37
本帖最后由 netlhx 于 2015-7-3 07:37 编辑
" o# q1 p0 K. }) I: S4 `2 @* `9 z. Z3 ?3 S
FREERTOS很不错,短小精悍。* H- ^% Y1 `# A, T. v
, o* [" ~# G+ E  H/ ^9 ]3 g
移植之前,先来扯下蛋:STM32CUBEMX不是已经支持直接使用FREERTOS了么,随便圈圈叉叉几下,就能使用,为何还要探讨移植问题呢?8 T" [$ `( g  U! G

$ t5 U% M3 B8 Z' T, g/ T0 e* K这里有几个原因:' z5 _$ V, Z2 g6 l0 l1 K' |# y; G& {
$ D& f  U0 l' M
首先,自己移植一遍会对FREERTOS原理理解更深刻; 其次呢,如果碰到其它的MCU呢,没有了STM32CUBEMX的支持,怎么办?还得自己移植!再者,STM自己移植的FREERTOS,还是个阉货,并不完整,很多特性不支持; 还有……6 K5 R9 ]2 |& o
2 y4 T- V" i! L# H
基于上述原因,还是有必要研究一下移植问题的。
. e( m: _& ~' F( T3 b4 m0 A6 p% i. P& j9 d9 v: S" \. Z2 B
要移植,首先得从网上下载源码,地址在这里:http://www.freertos.org/a00104.html?10 t8 Q7 C3 g3 [
最新版的是V8.2.1,下载后解压,得到如下目录结构; n+ I- G7 Y) {/ U" u4 A/ m0 u8 w
7 K, u; N2 n, x2 k* q6 Y- j% q
QQ截图20150702215155.png . T! p/ b* _" W" L" S

7 a+ v9 n- `% j! B( ^其中DEMO是一些演示程序,对常见的MCU都有支持,你也可以把它们看作是模板,在此基础上对自己的MCU做移植。
2 \1 p3 C, m/ b5 Z3 T
- E6 C+ [- I2 w3 T7 @SOURCE文件夹就是FREERTOS的核心代码了。/ }3 {& j4 U) V6 ?: @4 _+ t; y

, f9 J% _# X0 W5 s: n- _4 t3 h下面一张图显示了要移植的相关文件
( D0 V8 Y5 ?! b6 D# d
& R! C- o, K) e8 v. E QQ截图20150702215509.png 4 ?" ]. E, z3 g: h# t5 V) h* r
) L* k* |& {( T; m* K- k8 v! G
未完待续……
" j# J7 c* \  k! [  H" h$ |6 q% Q. F7 M0 D* S
本文只介绍移植方法,并不打算详细挖掘FREERTOS原理,所以上面的这些文件,你暂时只要知道一点:它们的位置,免得需要去找其中一个文件的时候,却发现不知道文件在哪里!2 F6 ~7 y% {2 x) |
. w' F& ~5 |/ M) [/ p
源代码下载下来了,目录结构也粗粗看了一遍,现在让我们来建立一个新的工程,然后将FREERTOS添加到已有的工程,成为工程的一部分。创建工程的步骤就不赘述了。) P5 n7 S, \* v# B$ O# m6 M

& R$ ]* c5 r6 n9 [本次试验使用的是硬件是F4 DISC,建立新工程文件是使用STM32CUBEMX来完成,下面给出两个图,可以看下大概配置,因为后面的移植需要使用到其中的一些参数。编译环境用的是MDK,如果是IAR的话会有所不同。新建的工程文件名为rtosdemo。8 v' h8 j# e1 m$ A- `" a6 I

7 n2 \* `! \/ r4 N0 k QQ截图20150703062946.png . k' h5 f& ~! T4 w% E9 Q  J

/ _+ p4 K: s* q QQ截图20150703063008.png # R3 G7 B7 G) F. L2 n
4 x9 e5 M* ?; a$ a3 K
注意SYSCLK的频率配置为168MHZ,后面会用到,至于其中的4个GPIO口则用来点亮板上的4个LED。
. m$ B  S& ^& Q. w. r* r
3 }/ U& ^; s3 |  ?& U8 i* s  Z下面正式开始移植。
( R( v: `- p5 L  B
" [% G8 R+ m6 T* O0 c在刚刚新建立的工程文件下面建立一个新的目录FreeRTOS,将下载下来的FREERTOS源代码目录下的SOURCE文件夹里的所有内容统统复制到该目录下,如图$ p$ N! p; T4 |6 Z0 d0 z
+ J2 J! r' Y( U5 t2 }
QQ截图20150703064230.png
# T+ j/ u6 L$ l4 [5 k$ O6 r: e4 ~5 [$ x  `( m2 G+ A% k0 x+ }
下面将需要的文件添加到工程之中,见下图! B6 Z) G" `! ^: T$ `) D

5 b3 @: T1 t: U QQ截图20150703064555.png
) q7 _1 P+ t2 I" b( N0 T8 [  N' b+ N
如果有疑问,请参考上面移植相关文件那张图片。
- ?* Q) |, [4 l" X) i. h, s
1 k/ ~% N0 O- O, W( @2 K在这里再啰嗦一句,不同的MCU,配置不尽相同,FREERTOS被设计为通用的RTOS,所以我们必须在硬件层做适当的适配,以适应不同的MCU。
# U9 j+ G. Y' q# _) s4 A! a# y; W
0 n, F/ L  O  P7 }# K8 W$ I2 ~8 b下面在下载的源文件目录下找到这个文件,将这个文件复制到工程的Inc目录下。" ~  ^0 R2 R4 Y

  d1 t; }- \0 `# T7 O  Q, V: m3 H QQ截图20150703065130.png
, z3 k9 H+ w. N( H# v
* h6 Y4 P5 H7 M1 W9 n QQ截图20150703065521.png
+ i" @& L* ]. A
2 |" S1 m+ p# f; {0 f注意选对路径,这是专门为STM32及MDK配置的RTOS配置文件,这个文件里面包含硬件相关的配置信息,如SYSCLK的配置等,因为FREERTOS需要使用到SYSTICK来作为心跳时钟。/ K+ j. o8 `  @, f( D- }( R

7 E$ o. h* l1 k, k下面打开这个文件来看看6 ]+ t, _* F- O8 t
8 R: c$ P. X, p
QQ截图20150703065855.png
1 p2 @% i- O% _2 L7 W, J- {5 q
3 k  v' n: Y5 e, I# p( ?注意168000000处,这里就是前面配置好的硬件SYSCLK,如果这个参数不对,会导致混乱!
" g3 ^& ]0 m' x1 [. c+ h" F" u
" R2 ~; p; k+ H9 s0 _* Y" v- {好了,现在可以编译一下,看一下,有错误?肯定,你还没有添加FREERTOS相关的包含路径配置,所以趁现在赶紧修改一下
) R+ v' h( ~* q! y$ L1 O8 \. E+ c. |
如果没有错误,接下来可以添加两个任务试一试了,添加的任务如下:9 l1 h. G6 G7 A( C
6 {5 |, O) z2 Z& a8 _! B' K9 n
QQ截图20150703071928.png
, k) K) E8 O7 @7 M+ g$ R
" c7 C  c, v% ], A- X1 G) G$ B$ w, v# D QQ截图20150703071950.png ! P/ Q1 z2 a  U! z

# h# H: d6 c8 w% [$ S QQ截图20150703072019.png
4 A5 R6 i4 o% X) @* m; P& L. s) w& N. {9 N% w% D; \" K
/ [* M9 h2 Y! I2 y
再编译,排除错误后,下载到开发板,期待LED开始闪烁吧!
' K: _. v1 R( C1 }2 H7 ?: Z5 G& ~! ^9 `8 a; ?  b
不过让人郁闷的是,灯并不会闪,还有个小问题要解决。
' l% H) C4 x0 e" \& A. q+ S3 \
  ?; Z" D6 t( T7 Z/ a打开启动配置文件startup_stm32f407xx.s,按下面的修改5 d- v8 g- T5 x1 X: `: U
$ K* N2 @; a+ E. P1 _: s8 ]! p( Y
QQ截图20150703072416.png 8 t' U% z# `3 ?; A: |

. o: a' w& Z5 c. a0 `8 Q5 }
4 R8 z" m( i5 z- V" ~, ?( H% b为什么要这样修改?因为FREERTOS接管了SYSTICK及SVC等操作,所以不修改FREERTOS就不会工作。
- L2 E* c2 X  r& _4 n( Q) C% A
( r% i4 f( G1 n4 x* ?) W/ Z  l再下载到开发板,红灯以1S的频率闪烁,蓝灯以4S的频率闪烁!" R! d; R( z% v9 |
8 e' f' T& Y4 I: `& w3 s
呼呼,大功告成!
: c* J; p( d9 `+ o; z
6 U# @, X7 t3 `完整的工程文件: 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
# t2 E, P: ^, m+ g8 _( l8 o楼主你好,我按照你的改动启动文件后,出现了如上的错误信息,在不改动启动文件的情况下,编译无错误,但是进入PendSVHandler后,仍然是在启动文件里面定义的PendSVHandler里面死循环,没有进入port.c里面定义的xPortPendSVHandler,可能是什么原因呢) V; _, I) U1 `" p, M3 ~
Asce 回答时间:2016-3-13 14:45:20
学习了,用的FreeRTOSV8.2.3移植成功了,不过还有些疑问:) h# w7 c1 u4 k  R- G! W
xPortSysTickHandler在向量表里申明了以后不需要在SysTick_Handler函数中调用吗?
5 N) S+ E% D) |  M+ K: n我看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是个很好的工具
4 P' m- m( e8 x, [! S
沐紫 回答时间: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
0 ?) W9 i1 C( C) C好贴,不过这freertos还要重新学习库函数么?创建任务貌似还比较复杂呀
: ?; b& ?6 Q% x: N! M# d# j: k; q
这样熟悉一下,以后不管哪种类型的MCU,用起来都游刃有余
netlhx 回答时间:2015-7-3 08:57:51
沐紫 发表于 2015-7-3 08:426 K5 V3 L; Z) r
好贴,
( s  Z7 z- v* `
netlhx 回答时间:2015-7-3 08:58:12
戏如人生 发表于 2015-7-3 08:15
; N( t# |& Z3 b$ Q) }- g! C写的不错,CUBE是个很好的工具
6 [& A/ k" P( l9 }3 l2 l) R8 {( Z. P
这个跟CUBE真没有关系
netlhx 回答时间:2015-7-3 08:58:32
moyanming2013 发表于 2015-7-3 00:027 k/ ?6 R% a8 N- E0 d
等更新看看
* r$ L) w& y' W% x. k5 |6 Y# F  }
已更新
netlhx 回答时间:2015-7-3 08:58:46
moyanming2013 发表于 2015-7-3 00:02
$ Q5 f$ C" }1 ]" _( P( J5 L2 H等更新看看

4 n) i' n% T. w! j! g! G已更新
1234下一页

所属标签

相似分享

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