1、要移植FREERTOS,首先要去下个,我是去直接下了个最新版的FREERTOS( w, C+ A" i& G2 `! e% N 下完包里有source源文件与demo工程 文件,如果有符合的型号,可以直接移植工程,也省了建立工程;当然就算型号不同也可以直接移植,我这里是自己建立,走一遍,加深印象;7 I4 a1 A! ]8 b; S4 ^ 7 M( V& H; x( H 需要的文件:: W( f+ q) a. t7 _ FreeRTOS的文件结构非常简单,移植或者版本升级替换也非常方便。 1)与FreeRTOS内核有关的文件数量仅为3个,分别是list.c queue.c tasks.c2 m9 S9 {5 v) z: C 该文件位于FreeRTOS\Source$ @* L# m* ^- o M8 F1 E1 \ 2)与内存分配有关的文件共有4个,分别是 heap_1.c,heap_2.c,heap_3.c,heap_4.c。4个文件只需选择其中的1个,STM32选择heap_2.c。/ p9 n+ h- C& X4 s. @! m 该文件位于 FreeRTOS\Source\portable\MemMang 3)与移植相关的代码包括 port.c,portasm.s,portmacro.h。这些代码不但和编译器有关还和平台(MCU)有关。FreeRTOS先以编译器为大类,然后再以平台(MCU)为小类。在这里选择IAR编译器,平台为ARM_CM3。 该文件位于 FreeRTOS\Source\portable\IAR\ARM_CM3; g; C+ k9 b9 A R 4)除了上述内容之外,还包括FreeRTOS内核相关的头文件。 该文件 FreeRTOS\Source\include 4 x' Z3 M2 Q( [6 i 当然我这里把所有的.C都包含进来了。- g$ m8 Y( {6 c. D6 N* s2 K( t % v0 M1 d7 Z9 A/ \, a 3 b$ g& _2 v* m& m( ?2 o$ {/ o 2、接下来修改启动代码 % ?' _, M- h+ M! K' J2 E 由于SVC_Handle,PendSV_Handle和SysTick_Handle在portasm.s中被重定义,所以需要在启动代码中修改这些中断向量的名称,并声明这些中断向量为外部函数。这也是初次使用FreeRTOS容易范的错误。 PendSV_Handler、SysTick_Handler、SVC_Handler这3个函数在startup_stm32f2xx.s启动文件中,启动中需要 使用到这3个,而8 f/ j, \% E d! U j; y" V # B, k8 r4 A) _1 ~$ y0 E7 @2 F xPortPendSVHandler、xPortSysTickHandler、vPortSVCHandler在portasm.s中,2者名称不一样,一般操作是在FREERTOSCONFIG.H里增加宏定义,如下 :5 r$ c- g* P- V2 S7 y9 ^ O + {! l( O/ n' N5 X3 v #define xPortPendSVHandler PendSV_Handler4 b! f/ h2 C- A/ {* J #define xPortSysTickHandler SysTick_Handler- m2 J0 y; n& M5 ]& |% ^' u5 z , R; p- }9 R/ f- k #define vPortSVCHandler SVC_Handler * i( U- q- j" z6 { 当然在stm32f2xx.c中需要注释掉原来PendSV_Handler,xPortSysTickHandler; 3、设置IAR配置$ a* c! k. O5 W/ t( v2 Q, N6 s 常规的我就不讲了,最主要的就是选择好型号,配置路径如下 常规不用设置汇编,但此处需要对汇编进行路径定义,要不然编译会出错0 W0 \2 Q$ o# p' f X. P; F 4 C1 J( P# ^; |0 R- v 3 i0 }+ m! N/ Y; w$ Y 其它按常规的来就行了。( a2 V$ r; c4 }: g3 B1 _ 4、配置freertosconfig.h9 i2 O, I) S2 H% x E 0 U3 b E0 Z( M: Y3 V5 o 对于用户来讲,Freertos已经提供了一个窗口给用户配置文件,即freertosconfig.h' v: i! S2 [3 f2 d3 E. i 5 p6 f! p) s, s" ]' A 对于里面各项定义,自己可以查询百度下,其中: % y' D1 a4 A9 u# J) h* ~ #define configCPU_CLOCK_HZ ( ( unsigned long ) SystemCoreClock )编译时需要声明,不然会出错; freertosV10.0.1此版本很多宏定义已经没有放置在freertosconfig.h,当用户需要用到哪个模块时,需要自己将宏定义放进来,如要用到系统软定时器组,需要自己添加 :
5、建立完整工程,调试' V! e; }* X( |4 u ) m3 n+ h+ l7 \$ @ 上面配置完毕后,添加自己的工程调试; 我自己添加工程如下:4 t; H0 c4 l* b& @. {, p6 n 接下来设置硬件初始化,添加任务,启动任务; x/ @& r2 ] H" h7 M/ w 特别需要注意的是,任务建立时,给任务分配的空间一定要足,刚开始尽量多分配一点,以免内存不足时,出现莫名其妙的问题,还不好找问题;我调试过程中,就出现了几次这样的问题,后来才发现 是空间不足;7 ?. M2 c8 C% j9 v4 } A8 x+ j0 _" f( t- \+ g% L+ V |
stm32f207/stm32f407擦除内部flash讲解
【经验分享】STM32F2 中 DMA 的 FIFO 模式
STM32F2x7 通过以太网实现在应用中编程 (IAP)
STM32F2xx 微控制器中的 EEPROM 模拟
在 STM32 F0、 F2、 F3、 F4 和 L1 系列MCU 中使用硬件实时时钟 (RTC)
STM32F1xx、STM32F2xx、STM32F4xx、STM32L1xx、STM32F30/31/37/38x 定时器概览
使用 STM32F2xx 和 STM32F4xx 微控制器时如何提高 ADC 测量精度
使用 STM32F2 和 STM32F4 DMA 控制器
STM32F2x7 通过以太网实现在应用中编程 (IAP)
STM32F2xx 微控制器中的 EEPROM 模拟