STMCU小助手
发布时间:2021-12-2 15:03
|
1、要移植FREERTOS,首先要去下个,我是去直接下了个最新版的FREERTOS 下完包里有source源文件与demo工程 文件,如果有符合的型号,可以直接移植工程,也省了建立工程;当然就算型号不同也可以直接移植,我这里是自己建立,走一遍,加深印象; 需要的文件:( C5 q5 v% K! ~3 }9 p' K( v2 `* @ FreeRTOS的文件结构非常简单,移植或者版本升级替换也非常方便。 1)与FreeRTOS内核有关的文件数量仅为3个,分别是list.c queue.c tasks.c 该文件位于FreeRTOS\Source, J: t) v3 _; @8 h; \ 2)与内存分配有关的文件共有4个,分别是 heap_1.c,heap_2.c,heap_3.c,heap_4.c。4个文件只需选择其中的1个,STM32选择heap_2.c。7 Z/ d; X( K7 F. s' E p: p 该文件位于 FreeRTOS\Source\portable\MemMang 3)与移植相关的代码包括 port.c,portasm.s,portmacro.h。这些代码不但和编译器有关还和平台(MCU)有关。FreeRTOS先以编译器为大类,然后再以平台(MCU)为小类。在这里选择IAR编译器,平台为ARM_CM3。$ ?7 p- E2 o* \% v4 L( I1 P) R 该文件位于 FreeRTOS\Source\portable\IAR\ARM_CM3 4)除了上述内容之外,还包括FreeRTOS内核相关的头文件。 该文件 FreeRTOS\Source\include8 l, I9 ~, h0 R6 H- | 当然我这里把所有的.C都包含进来了。
2、接下来修改启动代码2 @; c; |* }9 z8 n# v 由于SVC_Handle,PendSV_Handle和SysTick_Handle在portasm.s中被重定义,所以需要在启动代码中修改这些中断向量的名称,并声明这些中断向量为外部函数。这也是初次使用FreeRTOS容易范的错误。 ; |0 z6 J0 ]8 Y0 \0 C( p PendSV_Handler、SysTick_Handler、SVC_Handler这3个函数在startup_stm32f2xx.s启动文件中,启动中需要 使用到这3个,而 . h& A& `5 Y$ ?" B xPortPendSVHandler、xPortSysTickHandler、vPortSVCHandler在portasm.s中,2者名称不一样,一般操作是在FREERTOSCONFIG.H里增加宏定义,如下 : #define xPortPendSVHandler PendSV_Handler0 G7 w6 L% Y6 R7 s7 K; D; Z% I #define xPortSysTickHandler SysTick_Handler #define vPortSVCHandler SVC_Handler 9 B4 ?4 G$ J1 ~5 R. h% W1 G 当然在stm32f2xx.c中需要注释掉原来PendSV_Handler,xPortSysTickHandler;% x( k) ~5 Z# @( y4 B0 m 3、设置IAR配置 常规的我就不讲了,最主要的就是选择好型号,配置路径如下
常规不用设置汇编,但此处需要对汇编进行路径定义,要不然编译会出错
' \; f5 K4 J% |; t 其它按常规的来就行了。$ V5 M. x- i6 c3 a K5 ^, p' R ! M. x7 l! v; v$ ] 4、配置freertosconfig.h ! f# h2 i; G% v# p% |3 U5 G# D 对于用户来讲,Freertos已经提供了一个窗口给用户配置文件,即freertosconfig.h 对于里面各项定义,自己可以查询百度下,其中: - f7 ~) t4 B6 [! Z. R4 Y* M* @ #define configCPU_CLOCK_HZ ( ( unsigned long ) SystemCoreClock )编译时需要声明,不然会出错;$ }' n: {7 y; B0 ~+ E freertosV10.0.1此版本很多宏定义已经没有放置在freertosconfig.h,当用户需要用到哪个模块时,需要自己将宏定义放进来,如要用到系统软定时器组,需要自己添加 :; b5 [% d w' ~% u! T. z
5、建立完整工程,调试; d5 T) i; n1 s @$ O ; J0 _$ o; K9 n' `' g 上面配置完毕后,添加自己的工程调试; 我自己添加工程如下:/ O' Y P, i, {
接下来设置硬件初始化,添加任务,启动任务; , U$ ] U+ y8 F# q" c$ F 特别需要注意的是,任务建立时,给任务分配的空间一定要足,刚开始尽量多分配一点,以免内存不足时,出现莫名其妙的问题,还不好找问题;我调试过程中,就出现了几次这样的问题,后来才发现 是空间不足;9 o7 o' ~2 Y/ [" h) o 8 r4 P& _) {+ L, Q8 ^8 O |
微信公众号
手机版