|
本帖最后由 netlhx 于 2015-7-3 07:37 编辑 1 T) z3 ]/ o Z; B( s# E2 @ 5 V7 J. W F5 [) v3 | b FREERTOS很不错,短小精悍。 移植之前,先来扯下蛋:STM32CUBEMX不是已经支持直接使用FREERTOS了么,随便圈圈叉叉几下,就能使用,为何还要探讨移植问题呢?, z I* n, k6 l/ x8 D5 f% k- d 0 }# e* _: S1 U7 G; w 这里有几个原因:0 c: x4 @9 ^3 E4 K" J6 V4 ]9 e9 ? 首先,自己移植一遍会对FREERTOS原理理解更深刻; 其次呢,如果碰到其它的MCU呢,没有了STM32CUBEMX的支持,怎么办?还得自己移植!再者,STM自己移植的FREERTOS,还是个阉货,并不完整,很多特性不支持; 还有……% h1 k# s. ^8 _+ A$ S 2 o/ `0 O% F# L% o' }7 Y8 Q! r6 u& V 基于上述原因,还是有必要研究一下移植问题的。 要移植,首先得从网上下载源码,地址在这里:http://www.freertos.org/a00104.html?19 S0 c, [* l) u5 ~1 v 最新版的是V8.2.1,下载后解压,得到如下目录结构; e" P& P9 ^, D# R. Z" x) f/ A
' b9 k' S5 t3 f- P" S" g 其中DEMO是一些演示程序,对常见的MCU都有支持,你也可以把它们看作是模板,在此基础上对自己的MCU做移植。+ L" Y. e+ S! M, | + k' N2 A; B# H( D+ w6 F/ ]. B' M SOURCE文件夹就是FREERTOS的核心代码了。$ \* R3 W+ ~0 C! N . r( J4 T+ Q5 {1 y) c q! _ 下面一张图显示了要移植的相关文件3 ~+ x0 X5 e5 m# W; M; j ! j# b# ?2 q! C5 V1 V! K
8 K% [; M; Q( j [" }8 b 未完待续……, y+ A# d* s8 z0 J 本文只介绍移植方法,并不打算详细挖掘FREERTOS原理,所以上面的这些文件,你暂时只要知道一点:它们的位置,免得需要去找其中一个文件的时候,却发现不知道文件在哪里!$ W' J$ t% s9 g7 a& i: D ; g! F4 X3 g( r+ J0 ? 源代码下载下来了,目录结构也粗粗看了一遍,现在让我们来建立一个新的工程,然后将FREERTOS添加到已有的工程,成为工程的一部分。创建工程的步骤就不赘述了。 8 E9 v- {7 [, z( M) Z0 j( Z 本次试验使用的是硬件是F4 DISC,建立新工程文件是使用STM32CUBEMX来完成,下面给出两个图,可以看下大概配置,因为后面的移植需要使用到其中的一些参数。编译环境用的是MDK,如果是IAR的话会有所不同。新建的工程文件名为rtosdemo。+ i3 x3 \# v& L $ l# X; b; u5 U- F9 l
4 G ^) }; l1 E! t2 r4 ?$ Z
注意SYSCLK的频率配置为168MHZ,后面会用到,至于其中的4个GPIO口则用来点亮板上的4个LED。 4 g- _; T! Y; R 下面正式开始移植。 * B. I6 L! o2 K% C; P* ?6 t3 z 在刚刚新建立的工程文件下面建立一个新的目录FreeRTOS,将下载下来的FREERTOS源代码目录下的SOURCE文件夹里的所有内容统统复制到该目录下,如图' e2 n0 e A+ M, p; v3 z , ]: j! ~/ _% x6 q+ v; I+ f. L% h
% f; a/ o3 i% V' ~& T 下面将需要的文件添加到工程之中,见下图 4 F% h6 g5 [% S5 T' c2 a
( F8 h+ Z. @0 X5 Y 如果有疑问,请参考上面移植相关文件那张图片。 在这里再啰嗦一句,不同的MCU,配置不尽相同,FREERTOS被设计为通用的RTOS,所以我们必须在硬件层做适当的适配,以适应不同的MCU。 下面在下载的源文件目录下找到这个文件,将这个文件复制到工程的Inc目录下。
9 u4 y; b+ ]7 D0 Y8 k4 N' G 注意选对路径,这是专门为STM32及MDK配置的RTOS配置文件,这个文件里面包含硬件相关的配置信息,如SYSCLK的配置等,因为FREERTOS需要使用到SYSTICK来作为心跳时钟。 下面打开这个文件来看看
`1 [* [2 n0 I5 k6 x 注意168000000处,这里就是前面配置好的硬件SYSCLK,如果这个参数不对,会导致混乱! 好了,现在可以编译一下,看一下,有错误?肯定,你还没有添加FREERTOS相关的包含路径配置,所以趁现在赶紧修改一下 3 C o: q+ k! |4 k3 Z; R2 w 如果没有错误,接下来可以添加两个任务试一试了,添加的任务如下: 0 v! Z6 b. N0 u8 P k
' X9 X) M# @' r9 w' L) U4 w# U
! V9 a" t1 V; Q3 z 5 z+ I6 N1 c, g 再编译,排除错误后,下载到开发板,期待LED开始闪烁吧!" }9 D( m$ {/ R, W , j6 a! f- A- I( }- I 不过让人郁闷的是,灯并不会闪,还有个小问题要解决。: c3 C4 c) w# ~- { 打开启动配置文件startup_stm32f407xx.s,按下面的修改 % M+ F7 U, \/ i% a3 t& x z
3 y; w) V1 o' a; E0 G- t. g + ]6 B0 l3 j2 y2 Z; _) q 为什么要这样修改?因为FREERTOS接管了SYSTICK及SVC等操作,所以不修改FREERTOS就不会工作。8 ~$ g0 g: l3 _4 a/ [ 1 W% }! E* p7 d3 i- a$ P 再下载到开发板,红灯以1S的频率闪烁,蓝灯以4S的频率闪烁! 9 T! {) F! ^3 R6 b' a9 V( o 呼呼,大功告成! - c& y5 l M& e8 z$ Y 完整的工程文件:
rtosdemo.zip
(5.94 MB, 下载次数: 178)
|
微信公众号
手机版
楼主你好,我按照你的改动启动文件后,出现了如上的错误信息,在不改动启动文件的情况下,编译无错误,但是进入PendSVHandler后,仍然是在启动文件里面定义的PendSVHandler里面死循环,没有进入port.c里面定义的xPortPendSVHandler,可能是什么原因呢6 V7 C3 q4 C3 |& F, g* G
xPortSysTickHandler在向量表里申明了以后不需要在SysTick_Handler函数中调用吗?
我看CubeMX生成的文件里需要变相调用这个中断函数的,但是在这里没调用好像也能run起来,有些奇怪。
这样熟悉一下,以后不管哪种类型的MCU,用起来都游刃有余
这个跟CUBE真没有关系
已更新
已更新