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

FREERTOS移植笔记 精华  

[复制链接]
netlhx 发布时间:2015-7-2 21:37
本帖最后由 netlhx 于 2015-7-3 07:37 编辑
1 W5 [! m" {! f3 P0 X9 r2 e7 @. K  X1 o2 F6 Y3 }+ K
FREERTOS很不错,短小精悍。1 G. s  j" z* e# }

; x' P# k% b/ Z+ ?6 o/ {9 V移植之前,先来扯下蛋:STM32CUBEMX不是已经支持直接使用FREERTOS了么,随便圈圈叉叉几下,就能使用,为何还要探讨移植问题呢?6 y1 j4 ~2 b( M+ [) q6 l9 Y3 ~

  @# G9 Q/ Q( n" V3 V% B; V这里有几个原因:) a+ A# x$ ~, [3 W
  E3 ~1 ?: ]) ~( Z8 I, F) |
首先,自己移植一遍会对FREERTOS原理理解更深刻; 其次呢,如果碰到其它的MCU呢,没有了STM32CUBEMX的支持,怎么办?还得自己移植!再者,STM自己移植的FREERTOS,还是个阉货,并不完整,很多特性不支持; 还有……
  Q6 X% R3 e: L- R: D' ~! x7 O8 Q5 r
基于上述原因,还是有必要研究一下移植问题的。
5 H2 F; o) D7 v% a# J3 \
; \8 N. L. h5 Y1 G) A5 b) p0 n1 }要移植,首先得从网上下载源码,地址在这里:http://www.freertos.org/a00104.html?1* {$ _4 D$ v& Y: P  V
最新版的是V8.2.1,下载后解压,得到如下目录结构, J3 z3 V5 g4 E/ u# |

/ b- c; c3 k; X" @# X QQ截图20150702215155.png ) N1 ]) {! [) c+ d

; G. j8 z  h% f其中DEMO是一些演示程序,对常见的MCU都有支持,你也可以把它们看作是模板,在此基础上对自己的MCU做移植。
4 f) o7 v0 A! k- ]1 H2 I7 x! g2 V" v5 |+ V' i
SOURCE文件夹就是FREERTOS的核心代码了。
! E6 T6 s/ i/ H) E* f
! r2 X- U8 r' X# }下面一张图显示了要移植的相关文件
5 D' I6 X' k9 E) a& A9 ~. z
; ^6 n+ q7 y/ y, I% k QQ截图20150702215509.png + U& G2 n0 f- ^8 K$ Q2 U3 W

; h4 e+ L! C% \% a未完待续……  O. h6 u; u: n8 y- j. n1 z" ]

" Z' W% G/ E- _! e7 v6 J本文只介绍移植方法,并不打算详细挖掘FREERTOS原理,所以上面的这些文件,你暂时只要知道一点:它们的位置,免得需要去找其中一个文件的时候,却发现不知道文件在哪里!
' V+ s' Q+ u/ N6 z) ]& \  b% A1 Q5 |
源代码下载下来了,目录结构也粗粗看了一遍,现在让我们来建立一个新的工程,然后将FREERTOS添加到已有的工程,成为工程的一部分。创建工程的步骤就不赘述了。& {  D' E2 F$ t: s

" Q- {) b/ `% K8 V' Y* n本次试验使用的是硬件是F4 DISC,建立新工程文件是使用STM32CUBEMX来完成,下面给出两个图,可以看下大概配置,因为后面的移植需要使用到其中的一些参数。编译环境用的是MDK,如果是IAR的话会有所不同。新建的工程文件名为rtosdemo。0 J5 S* _! F) G9 @& T. e
0 f  `; W& Z5 g  K) t/ ?
QQ截图20150703062946.png $ B) V3 V# ?  ]* H& T% o
' Q: t1 D! K3 F
QQ截图20150703063008.png
( A( o. O# D' }. Z; |- h5 H+ r5 }2 S5 V$ ?( @
注意SYSCLK的频率配置为168MHZ,后面会用到,至于其中的4个GPIO口则用来点亮板上的4个LED。0 Z) P& ?" v3 b. Z" @. A& x
. q& t# ^! K+ d
下面正式开始移植。
. q+ ?2 K) ]1 c) X$ Q
! [$ r7 K" z6 h  w在刚刚新建立的工程文件下面建立一个新的目录FreeRTOS,将下载下来的FREERTOS源代码目录下的SOURCE文件夹里的所有内容统统复制到该目录下,如图
2 Z" g/ h! i3 H/ r$ [7 F  e5 k, o- |+ ]1 {/ w% O
QQ截图20150703064230.png / i+ i6 T. e) n7 N2 R- N

% Y+ B, X9 K1 U7 @; i下面将需要的文件添加到工程之中,见下图
7 y7 u/ n- g4 R4 A- g* y
; @7 N5 y% v8 l9 x& U4 ^ QQ截图20150703064555.png 1 K- M6 i/ M; p7 w( e

8 C2 g3 P' a, e  P" e如果有疑问,请参考上面移植相关文件那张图片。; n! G% h- O5 }% M1 t6 @
) d  o2 q% D, @0 {1 f
在这里再啰嗦一句,不同的MCU,配置不尽相同,FREERTOS被设计为通用的RTOS,所以我们必须在硬件层做适当的适配,以适应不同的MCU。
, K# W1 V3 k; i) i9 N) Q
- Z& J* K9 g- y: h, O" F% T下面在下载的源文件目录下找到这个文件,将这个文件复制到工程的Inc目录下。
# |- u6 U; c4 Z2 T6 |) t* W1 j. ^( v! i
QQ截图20150703065130.png
0 S1 _1 S/ g% U
" l- U$ ~, N9 L6 I) t QQ截图20150703065521.png
# d' K9 C5 D$ o! j- O+ H: @: D& e/ \  a- O0 r1 m0 f7 W$ g6 ~
注意选对路径,这是专门为STM32及MDK配置的RTOS配置文件,这个文件里面包含硬件相关的配置信息,如SYSCLK的配置等,因为FREERTOS需要使用到SYSTICK来作为心跳时钟。
% S4 W  G' k4 X4 B9 y' G, D9 S  I6 I" p* ^3 D1 @
下面打开这个文件来看看
: l2 p9 L( g" E9 F
/ E9 ]: D5 ?; j QQ截图20150703065855.png
, h  }7 l1 X) T1 w: ^4 H% v
% b2 `' k* c/ f) j& q. O! F注意168000000处,这里就是前面配置好的硬件SYSCLK,如果这个参数不对,会导致混乱!- h( i# L+ l& T5 z. K

) o0 H9 ^; {9 z, }) ~7 l好了,现在可以编译一下,看一下,有错误?肯定,你还没有添加FREERTOS相关的包含路径配置,所以趁现在赶紧修改一下& F, d1 U- N5 b0 W3 _

; L1 l) \( h& D; I+ A如果没有错误,接下来可以添加两个任务试一试了,添加的任务如下:3 q* T0 n0 _" k* i& [# v

/ O. @$ R5 I) b; {6 f- E, W QQ截图20150703071928.png
' M7 p$ N, ]! @+ w- Z  h
4 f1 i5 L! ?: l% I1 U0 _6 w8 \ QQ截图20150703071950.png . y" s: P9 J6 j* w4 n
; e) v0 B. M. D3 f' e+ `0 z
QQ截图20150703072019.png
5 A5 g/ D. R  _, [  \1 t1 I
+ ^* x% o' @) f; L) }# i# {) d# n- N
- w& ]) d( a/ o: t& q! s3 K! V- H再编译,排除错误后,下载到开发板,期待LED开始闪烁吧!
2 j: q4 G' ]* D- L. }
3 j0 [3 v4 |- C, H, r不过让人郁闷的是,灯并不会闪,还有个小问题要解决。6 D7 Q9 D' j) a5 D

+ S' n3 v+ p. D/ c) I; K: }打开启动配置文件startup_stm32f407xx.s,按下面的修改& l# n. C, d  D$ ^& Y) X; H

! d3 Q/ D1 M7 w7 I. W QQ截图20150703072416.png 1 e. l/ C2 t4 U

. v/ Q) w- g4 ]- z" c- x1 X9 m& y  y3 M4 P$ l
为什么要这样修改?因为FREERTOS接管了SYSTICK及SVC等操作,所以不修改FREERTOS就不会工作。$ ~) `' t5 |& f* Q; z1 Q/ ~( B
, x* m9 X, J0 g9 m$ {$ ^% P
再下载到开发板,红灯以1S的频率闪烁,蓝灯以4S的频率闪烁!
/ p1 ^, o2 a# u& {9 Q6 B/ G# ~* c/ P: D8 L
呼呼,大功告成!4 T! v9 d9 n3 G, Z( _0 w8 j5 Y
3 t. D3 c3 _7 u% w' t0 d
完整的工程文件: 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 , [0 r( a" D: i5 ?. f# P) v- m
楼主你好,我按照你的改动启动文件后,出现了如上的错误信息,在不改动启动文件的情况下,编译无错误,但是进入PendSVHandler后,仍然是在启动文件里面定义的PendSVHandler里面死循环,没有进入port.c里面定义的xPortPendSVHandler,可能是什么原因呢
8 u9 y" z* m- \4 l$ W7 Y
Asce 回答时间:2016-3-13 14:45:20
学习了,用的FreeRTOSV8.2.3移植成功了,不过还有些疑问:# `" q* _! m7 W8 o+ B
xPortSysTickHandler在向量表里申明了以后不需要在SysTick_Handler函数中调用吗?
& m; q! t; h" C" b" d, L我看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是个很好的工具3 e* g1 B5 n4 z8 n0 s1 y
沐紫 回答时间: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) d1 b8 }( u6 X* @
好贴,不过这freertos还要重新学习库函数么?创建任务貌似还比较复杂呀
% B8 u. v( {( l. l3 q4 v0 k9 k4 j
这样熟悉一下,以后不管哪种类型的MCU,用起来都游刃有余
netlhx 回答时间:2015-7-3 08:57:51
沐紫 发表于 2015-7-3 08:42! ^1 f+ |6 I6 ^0 s$ B8 q5 j
好贴,
* x7 E6 A. W' J
netlhx 回答时间:2015-7-3 08:58:12
戏如人生 发表于 2015-7-3 08:15
) ~& N4 D/ L3 ^4 `5 m9 p写的不错,CUBE是个很好的工具

: B: Q! o" ~1 g4 r; I" O, m& V这个跟CUBE真没有关系
netlhx 回答时间:2015-7-3 08:58:32
moyanming2013 发表于 2015-7-3 00:02' w4 g9 R) r0 M9 W' {
等更新看看
! b, l# \8 X2 b$ r  f
已更新
netlhx 回答时间:2015-7-3 08:58:46
moyanming2013 发表于 2015-7-3 00:022 |. P  ], n) P7 D5 B/ E4 z
等更新看看
  Y; |2 ~1 l% a; A/ |
已更新
1234下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版