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

FREERTOS移植笔记 精华  

[复制链接]
netlhx 发布时间:2015-7-2 21:37
本帖最后由 netlhx 于 2015-7-3 07:37 编辑 3 ~2 a  ~7 @. L/ s* R

$ O7 _. N" P) Y4 HFREERTOS很不错,短小精悍。
: Z) Q. _! n) G6 x+ ~6 a  W4 K
移植之前,先来扯下蛋:STM32CUBEMX不是已经支持直接使用FREERTOS了么,随便圈圈叉叉几下,就能使用,为何还要探讨移植问题呢?) @, e$ T' w8 ]* P1 B! i) @

6 U: v8 [$ N! P" A0 z6 ?" x这里有几个原因:
; W4 x  f' y' v
; Y. i. w! @2 C* ?3 W/ r& v首先,自己移植一遍会对FREERTOS原理理解更深刻; 其次呢,如果碰到其它的MCU呢,没有了STM32CUBEMX的支持,怎么办?还得自己移植!再者,STM自己移植的FREERTOS,还是个阉货,并不完整,很多特性不支持; 还有……
7 Y) w( Z5 ?0 I: j( U( Z+ V$ D; u( t# @) V" Q. R$ o! [+ ?7 H
基于上述原因,还是有必要研究一下移植问题的。4 z* ?4 N* v! V  k
+ q3 m8 `! h. Q4 x
要移植,首先得从网上下载源码,地址在这里:http://www.freertos.org/a00104.html?1
+ B/ C) p; l# O& |. L" O3 F$ N最新版的是V8.2.1,下载后解压,得到如下目录结构* q8 o  w& e! o
5 x- A  I2 i# z. ^
QQ截图20150702215155.png
7 q$ G+ D  j& d4 j( ~, c- ?) J: e. O1 ^# k. M2 T) L: Y. R' v! }
其中DEMO是一些演示程序,对常见的MCU都有支持,你也可以把它们看作是模板,在此基础上对自己的MCU做移植。4 i) i4 H7 j$ ]3 K9 E- B. o
) H) m  M  c3 p- a* L/ s. {
SOURCE文件夹就是FREERTOS的核心代码了。& ~) ~: i: ?6 C7 R; d: X9 f" R3 w- k( _
8 y3 Z# {, ^0 ^* H# P! m9 U; f6 L. U
下面一张图显示了要移植的相关文件3 L2 J* u5 g* ^4 m; N
( i, [: {. G) e- x: h" i5 m# ^2 g
QQ截图20150702215509.png
1 Z, F: R, p) ^5 \  _4 D. s$ b4 j; v5 R
未完待续……0 l, U, s5 G+ e# h- f. W
; i1 a1 N- P  a5 P) _+ q
本文只介绍移植方法,并不打算详细挖掘FREERTOS原理,所以上面的这些文件,你暂时只要知道一点:它们的位置,免得需要去找其中一个文件的时候,却发现不知道文件在哪里!
; }( u( g  @$ Y' v
( }" N8 f  w3 `* w6 }% j源代码下载下来了,目录结构也粗粗看了一遍,现在让我们来建立一个新的工程,然后将FREERTOS添加到已有的工程,成为工程的一部分。创建工程的步骤就不赘述了。/ L2 F0 C, F3 }) Q

2 m' r5 p! b1 B& A6 ~8 Z本次试验使用的是硬件是F4 DISC,建立新工程文件是使用STM32CUBEMX来完成,下面给出两个图,可以看下大概配置,因为后面的移植需要使用到其中的一些参数。编译环境用的是MDK,如果是IAR的话会有所不同。新建的工程文件名为rtosdemo。
5 @3 g- f  A: K5 m+ h0 j3 I4 A6 z7 w  x  }0 b# e! V
QQ截图20150703062946.png 8 f) r6 L7 V! A2 o& A5 ]. I6 t
* t, |) K2 W) e- {3 s, P/ K7 r
QQ截图20150703063008.png   p! _+ @* J) w4 M) M' U) u1 M
0 M4 r3 B+ X* T7 f6 R' H
注意SYSCLK的频率配置为168MHZ,后面会用到,至于其中的4个GPIO口则用来点亮板上的4个LED。, Y" t$ u  w6 l0 \; l! ?0 ~
3 d- j& m* i' a" I  k/ t& @$ h* _
下面正式开始移植。% G' u8 k( u9 w! O& x! T+ a; O
% e; Q! d2 j0 }9 n8 z- a
在刚刚新建立的工程文件下面建立一个新的目录FreeRTOS,将下载下来的FREERTOS源代码目录下的SOURCE文件夹里的所有内容统统复制到该目录下,如图
! P8 [/ g% W' Z  h0 @% L
8 f1 D' ]  j1 w# Z' @ QQ截图20150703064230.png ! G9 j3 n; a" u/ ?/ E; f

+ U" M. C8 A" ]5 o' u! R/ {1 j6 T( J下面将需要的文件添加到工程之中,见下图
9 C, k" t- u3 G( o2 [9 b9 ^; K! B$ N7 T! B% v; F
QQ截图20150703064555.png % N0 m% ?  l, h

& t) j5 C  M- p/ @如果有疑问,请参考上面移植相关文件那张图片。" y9 u4 e8 l# g5 [
, ^2 @2 b6 z$ I3 \- y" L
在这里再啰嗦一句,不同的MCU,配置不尽相同,FREERTOS被设计为通用的RTOS,所以我们必须在硬件层做适当的适配,以适应不同的MCU。# B) J! `1 O, z4 {, c- b
6 A1 O% ?. k: O
下面在下载的源文件目录下找到这个文件,将这个文件复制到工程的Inc目录下。
8 F- T# t, M0 d3 @% ?8 c; y0 q5 n9 c- h+ M9 G
QQ截图20150703065130.png
6 c4 K! S% p" x3 K; H3 @0 O: p& F3 D  Q4 ]# z+ I% g
QQ截图20150703065521.png
# d" ]% T& u' Z& q* V: ^4 U
! d0 T% E3 I1 X4 |6 c7 ~注意选对路径,这是专门为STM32及MDK配置的RTOS配置文件,这个文件里面包含硬件相关的配置信息,如SYSCLK的配置等,因为FREERTOS需要使用到SYSTICK来作为心跳时钟。
! {' s& ^) B+ r+ L% P: ^$ J! y
5 E$ h' U8 G* m7 V" t下面打开这个文件来看看' w* X. I( R% k: @

- W4 g: Q8 b3 ~/ b' w- t1 o QQ截图20150703065855.png + p6 \) J2 D% U6 q- ?! z

% G( j6 G) w& A6 h7 q注意168000000处,这里就是前面配置好的硬件SYSCLK,如果这个参数不对,会导致混乱!# c+ C6 H1 v& V# A8 ~- t' U8 x

# R% p# Z# v( {# b  C, l0 L好了,现在可以编译一下,看一下,有错误?肯定,你还没有添加FREERTOS相关的包含路径配置,所以趁现在赶紧修改一下4 K. j1 w' m' O/ D3 i4 ]1 o
$ |9 M* r3 B+ H8 @7 A
如果没有错误,接下来可以添加两个任务试一试了,添加的任务如下:
3 o+ @* _) W2 u' A# `: @
' m/ t) p, O& K, l$ ? QQ截图20150703071928.png & _/ \6 o6 s1 A: B' S9 t
: {  A7 W- a$ {4 ~) R2 I) h
QQ截图20150703071950.png
  p- g+ w; }: p% B9 y: @# Y& {9 E0 l, l: ^
QQ截图20150703072019.png 2 M2 d. F2 V. G0 b
( |6 _* ]8 s/ E6 y% I$ W6 _
8 s% N) J3 Z9 X6 t; F1 w
再编译,排除错误后,下载到开发板,期待LED开始闪烁吧!0 R3 J- k* d/ g9 ]/ M: F* j

7 t0 [; a/ C2 K0 y3 M1 F不过让人郁闷的是,灯并不会闪,还有个小问题要解决。# t8 U  _3 `  c4 e& X- L/ O+ ~
8 [, x- g. H3 N
打开启动配置文件startup_stm32f407xx.s,按下面的修改( u+ l. L0 X' N7 H/ C
0 ]3 ?( ~+ q" H" W3 r
QQ截图20150703072416.png / X; E9 |  D7 \6 d

. \) R6 u' x7 P) u- \7 Z$ @; x3 ]1 }1 n4 H
为什么要这样修改?因为FREERTOS接管了SYSTICK及SVC等操作,所以不修改FREERTOS就不会工作。
: m; k5 M# w5 b4 ~' h) D2 x3 p; ^+ ]" c  @
再下载到开发板,红灯以1S的频率闪烁,蓝灯以4S的频率闪烁!
% @* t" ?( d, d* b( x) y. R4 h3 X+ R
呼呼,大功告成!- R# ~/ i  F( P3 N: P3 m
3 u( {' x1 |2 `8 t7 T' d2 K0 G
完整的工程文件: 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 9 P: V- I" m# i+ ^( M6 e' Z
楼主你好,我按照你的改动启动文件后,出现了如上的错误信息,在不改动启动文件的情况下,编译无错误,但是进入PendSVHandler后,仍然是在启动文件里面定义的PendSVHandler里面死循环,没有进入port.c里面定义的xPortPendSVHandler,可能是什么原因呢
0 m) o  o, f( y- R: f* e
Asce 回答时间:2016-3-13 14:45:20
学习了,用的FreeRTOSV8.2.3移植成功了,不过还有些疑问:
# m# v0 c8 O. b/ H+ WxPortSysTickHandler在向量表里申明了以后不需要在SysTick_Handler函数中调用吗?
! b4 n0 y% B8 A# @' X! U" [我看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是个很好的工具
1 |& R3 H4 h: k8 ^+ e) f; F/ n: X  |& c
沐紫 回答时间: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:533 e5 `9 S% O% i! x4 R' c3 _
好贴,不过这freertos还要重新学习库函数么?创建任务貌似还比较复杂呀

* Q0 Y4 J7 z* s) n: [这样熟悉一下,以后不管哪种类型的MCU,用起来都游刃有余
netlhx 回答时间:2015-7-3 08:57:51
沐紫 发表于 2015-7-3 08:42
$ {, [0 h) @: {5 Y5 Q- r/ Y+ E9 C好贴,

4 @+ C5 w8 X. U9 P
netlhx 回答时间:2015-7-3 08:58:12
戏如人生 发表于 2015-7-3 08:15
1 H& `6 [. R6 {, Q% N写的不错,CUBE是个很好的工具

7 E8 H0 Q: N# ?. T. t这个跟CUBE真没有关系
netlhx 回答时间:2015-7-3 08:58:32
moyanming2013 发表于 2015-7-3 00:02
0 i& m9 d- Q. A6 V8 P等更新看看
! A+ ?1 m$ B- R4 n
已更新
netlhx 回答时间:2015-7-3 08:58:46
moyanming2013 发表于 2015-7-3 00:02! p5 N/ w  x  ~. o9 G6 G
等更新看看

- I9 [* s  w2 N+ S' g. L已更新
1234下一页

所属标签

相似分享

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