本帖最后由 netlhx 于 2015-7-3 07:37 编辑 3 ~2 a ~7 @. L/ s* R FREERTOS很不错,短小精悍。 6 x+ ~6 a W4 K 移植之前,先来扯下蛋:STM32CUBEMX不是已经支持直接使用FREERTOS了么,随便圈圈叉叉几下,就能使用,为何还要探讨移植问题呢?) @, e$ T' w8 ]* P1 B! i) @ 这里有几个原因: 首先,自己移植一遍会对FREERTOS原理理解更深刻; 其次呢,如果碰到其它的MCU呢,没有了STM32CUBEMX的支持,怎么办?还得自己移植!再者,STM自己移植的FREERTOS,还是个阉货,并不完整,很多特性不支持; 还有…… $ 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 最新版的是V8.2.1,下载后解压,得到如下目录结构* q8 o w& e! o 5 x- A I2 i# z. ^ , 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 4 D. s$ b4 j; v5 R 未完待续……0 l, U, s5 G+ e# h- f. W ; i1 a1 N- P a5 P) _+ q 本文只介绍移植方法,并不打算详细挖掘FREERTOS原理,所以上面的这些文件,你暂时只要知道一点:它们的位置,免得需要去找其中一个文件的时候,却发现不知道文件在哪里! 源代码下载下来了,目录结构也粗粗看了一遍,现在让我们来建立一个新的工程,然后将FREERTOS添加到已有的工程,成为工程的一部分。创建工程的步骤就不赘述了。/ L2 F0 C, F3 }) Q 本次试验使用的是硬件是F4 DISC,建立新工程文件是使用STM32CUBEMX来完成,下面给出两个图,可以看下大概配置,因为后面的移植需要使用到其中的一些参数。编译环境用的是MDK,如果是IAR的话会有所不同。新建的工程文件名为rtosdemo。 5 m+ h0 j3 I4 A6 z7 w x }0 b# e! V * t, |) K2 W) e- {3 s, P/ K7 r 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文件夹里的所有内容统统复制到该目录下,如图 下面将需要的文件添加到工程之中,见下图 $ N7 T! B% v; F 如果有疑问,请参考上面移植相关文件那张图片。" 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目录下。 ; y0 q5 n9 c- h+ M9 G : p& F3 D Q4 ]# z+ I% g 注意选对路径,这是专门为STM32及MDK配置的RTOS配置文件,这个文件里面包含硬件相关的配置信息,如SYSCLK的配置等,因为FREERTOS需要使用到SYSTICK来作为心跳时钟。 下面打开这个文件来看看' w* X. I( R% k: @ 注意168000000处,这里就是前面配置好的硬件SYSCLK,如果这个参数不对,会导致混乱!# c+ C6 H1 v& V# A8 ~- t' U8 x 好了,现在可以编译一下,看一下,有错误?肯定,你还没有添加FREERTOS相关的包含路径配置,所以趁现在赶紧修改一下4 K. j1 w' m' O/ D3 i4 ]1 o $ |9 M* r3 B+ H8 @7 A 如果没有错误,接下来可以添加两个任务试一试了,添加的任务如下: : { A7 W- a$ {4 ~) R2 I) h 9 y: @# Y& {9 E0 l, l: ^ ( |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 不过让人郁闷的是,灯并不会闪,还有个小问题要解决。# 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 7 Z$ @; x3 ]1 }1 n4 H 为什么要这样修改?因为FREERTOS接管了SYSTICK及SVC等操作,所以不修改FREERTOS就不会工作。 3 p; ^+ ]" c @ 再下载到开发板,红灯以1S的频率闪烁,蓝灯以4S的频率闪烁! ( x) y. R4 h3 X+ R 呼呼,大功告成!- R# ~/ i F( P3 N: P3 m 3 u( {' x1 |2 `8 t7 T' d2 K0 G 完整的工程文件: |
楼主你好,我按照你的改动启动文件后,出现了如上的错误信息,在不改动启动文件的情况下,编译无错误,但是进入PendSVHandler后,仍然是在启动文件里面定义的PendSVHandler里面死循环,没有进入port.c里面定义的xPortPendSVHandler,可能是什么原因呢
xPortSysTickHandler在向量表里申明了以后不需要在SysTick_Handler函数中调用吗?
我看CubeMX生成的文件里需要变相调用这个中断函数的,但是在这里没调用好像也能run起来,有些奇怪。
这样熟悉一下,以后不管哪种类型的MCU,用起来都游刃有余
这个跟CUBE真没有关系
已更新
已更新