本次使用华大HC32F460的MCU移植了FreeRTOS,使用的平台是IAR。
废话不多说,先来看看移植 需要的资源。
1、开发平台EWARM-CD-8401-21539。
2、IAR注册机。
3、华大MCU HC32F460。
4、华大驱动库hc32f46x_ddl_Rev1.3.1。
5、FreeRTOS源码FreeRTOSv9.0.0,当然官方网站有最新的,不过9.0.0版本是别人移植最多的,资料也容易查找。
M4内核都是这样移植的哦,下面开始移植。
1.移植FreeRTOS源码
进入下载好的FreeRTOSv9.0.0文件夹,找到FreeRTOS文件夹,FreeRTOS-Plus是FreeRTOS的升级版本,只是多了一些功能,像ihpone有ihpone Plus一个道理。进入FreeRTOS文件夹下可以看到有以下文件。
我们重点关注Source文件夹,我们需要移植的东西都在里面。
include文件夹是要全部移植的,包含了需要的头文件,protable文件夹只需移植对应部分文件,croutine.c,event_groups.c,list.c,queue.c,tasks.c,timers.c,全部需要移植。
我们来重点看看protable需要移植那些文件。
我们使用的是IAR平台,所以选择IAR文件夹,MenMang文件夹是内存管理相关,只需要这两个文件夹即可。接下来对这两个文件夹进一步裁剪,先看IAR文件夹。
很多人在移植的时候都会有个疑问,它是怎么实现FreeRTOS跟硬件和平台联系在一起的?portable文件下就是桥接平台,如IAR、KEIL,等等。我们使用的平台是IAR当然选择IAR文件夹了,在IAR的文件就是桥接硬件相关的,我们使用的是华大HC32F460,内核是M4,带有FPUI浮点运算单元,所以选择ARM_CM4F 文件夹。
再来看看MemMang文件夹。
里面有5个实现内存管理的方法,对应五个文件,数字越高,管理方法越好,推荐使用heap_4.c,
可以百度一下,大部分的人都是使用heap_4.c。
好了,我们需要的文件已经介绍完毕,接下来看看移植后的文件夹到底长什么样。
在你的工程下建立一个文件夹用来保存这些移植的文件,我这里建立 一个FreeRTOS文件夹,移植后如下。
FreeRTOS目录下
protable目录下
IAR目录下
MemMang目录下
好了,所有相关文件移植完毕,开始在工程里面添加文件夹,再把所有FreeRTOS源码文件croutine.c,event_groups.c,list.c,queue.c,tasks.c,timers.c全部添加进来,再把heap_4.c、port.c、portasm.s文件添加进来。添加完毕如下所示。
2.编译和裁剪
开始编译试试。会出现一堆错误,不要着急,往下看。
出错提示是因为没有找到 FreeRTOSConfig.h头文件,添加了这个头文件就可以解决大部分的错误了。我们去FreeRTOS源码目录找,在Demo目录下是可以找到的,我们用的是M4内核,所以选择Demo\CORTEX_M4F_STM32F407ZG-SK目录下的FreeRTOSConfig.h文件,如下。
把 FreeRTOSConfig.h复制到我们工程FreeRTOS\include目录下,再IAR包含几个头文件目录,
FreeRTOS\include目录、FreeRTOS\portable\IAR\ARM_CM4F目录。
再编译看看。
现在有两个错误,我们把点开port.c,把下面这几行代码注释掉。
#ifndef __ARMVFP__
#error This port can only be used when the project options are configured to enable hardware floating point support.
#endif
然后发现还是提示 FreeRTOSConfig.h找不到,是因为portasm.s文件是汇编编写的,需要单独为它包含FreeRTOSConfig.h头文件。
找到FreeRTOSConfig.h存放的FreeRTOS\include目录下,点击OK即可,再进行编译看看,肯定还有错.
因为portasm.s运用到了FPU浮点单元运算,M4内核是带有FPU单元的,但是要开启才行。开启如下。
接下来进行编译也还会有错,显示错误如下。
是因为FreeRTOSConfig.h文件里面开启了4个钩子函数定义,把它们关闭,定义为0即可,分别是configUSE_IDLE_HOOK、configUSE_TICK_HOOK、configCHECK_FOR_STACK_OVERFLOW、configUSE_MALLOC_FAILED_HOOK。
接着编译,还是出错,这么难的吗,别急,这是最后的错误啦!!!。
这是因为重复定义函数了,我们只需要去把hc32f46x_interrupts.c文件下的PendSV_Handler函数、SysTick_Handler函数、SVC_Handler函数注释掉就好了。
编译,OK没问题。
裁剪配置:
关键是这两个配置,configCPU_CLOCK_HZ是系统频率,根据你的MCU时钟配置来进行填写;configTOTAL_HEAP_SIZE是系统所有总的堆大小,默认是75*1024(75K),太大了,我这里配置10K(10*1024),根据你的资源来配置就可以了。
OK,完毕!
总结:
1、移植FreeRTOS相关文件。
Source目录下:croutine.c,event_groups.c,list.c,queue.c,tasks.c,timers.c。
include整个文件夹。
portable目录下:heap_4.c、port.c、portasm.s、portmacro.h
Demo\CORTEX_M4F_STM32F407ZG-SK目录下:FreeRTOSConfig.h
2、添加文件到工程。
3、包含头文件路径。
C/C++ compiler:.\FreeRTOS\include
C/C++ compiler:.\FreeRTOS\portable\IAR\ARM_CM4F
Assembler:.\FreeRTOS\include
4、修改FreeRTOSConfig.h配置文件进行裁剪
关闭HOOK钩子相关宏定义:configUSE_IDLE_HOOK、configUSE_TICK_HOOK、configCHECK_FOR_STACK_OVERFLOW、configUSE_MALLOC_FAILED_HOOK。分别定义为0。
IAR移植FreeRTOS到M4内核常见错误
1、Failed to open #include file 'FreeRTOSConfig.h'
解决办法:添加FreeRTOSConfig.h所在头文件路径。
2、This instruction is not available in the selected cpu/core
解释:此指令在选定的 CPU/内核中不可用,因为没有开启FPU浮点运算单元.
解决办法:开启FPU