关于MCU M4内核移植FreeRTOS的笔记

本次使用华大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文件夹下可以看到有以下文件。

关于MCU M4内核移植FreeRTOS的笔记_第1张图片 

我们重点关注Source文件夹,我们需要移植的东西都在里面。 

关于MCU M4内核移植FreeRTOS的笔记_第2张图片

 

include文件夹是要全部移植的,包含了需要的头文件,protable文件夹只需移植对应部分文件,croutine.c,event_groups.c,list.c,queue.c,tasks.c,timers.c,全部需要移植。

我们来重点看看protable需要移植那些文件。

关于MCU M4内核移植FreeRTOS的笔记_第3张图片 

我们使用的是IAR平台,所以选择IAR文件夹,MenMang文件夹是内存管理相关,只需要这两个文件夹即可。接下来对这两个文件夹进一步裁剪,先看IAR文件夹。 

 关于MCU M4内核移植FreeRTOS的笔记_第4张图片

很多人在移植的时候都会有个疑问,它是怎么实现FreeRTOS跟硬件和平台联系在一起的?portable文件下就是桥接平台,如IAR、KEIL,等等。我们使用的平台是IAR当然选择IAR文件夹了,在IAR的文件就是桥接硬件相关的,我们使用的是华大HC32F460,内核是M4,带有FPUI浮点运算单元,所以选择ARM_CM4F 文件夹。

再来看看MemMang文件夹。

 关于MCU M4内核移植FreeRTOS的笔记_第5张图片

 里面有5个实现内存管理的方法,对应五个文件,数字越高,管理方法越好,推荐使用heap_4.c,

可以百度一下,大部分的人都是使用heap_4.c。

好了,我们需要的文件已经介绍完毕,接下来看看移植后的文件夹到底长什么样。

在你的工程下建立一个文件夹用来保存这些移植的文件,我这里建立 一个FreeRTOS文件夹,移植后如下。

 FreeRTOS目录下关于MCU M4内核移植FreeRTOS的笔记_第6张图片

 

 protable目录下关于MCU M4内核移植FreeRTOS的笔记_第7张图片

 IAR目录下

关于MCU M4内核移植FreeRTOS的笔记_第8张图片

 关于MCU M4内核移植FreeRTOS的笔记_第9张图片

 MemMang目录下

关于MCU M4内核移植FreeRTOS的笔记_第10张图片  

好了,所有相关文件移植完毕,开始在工程里面添加文件夹,再把所有FreeRTOS源码文件croutine.c,event_groups.c,list.c,queue.c,tasks.c,timers.c全部添加进来,再把heap_4.c、port.c、portasm.s文件添加进来。添加完毕如下所示。关于MCU M4内核移植FreeRTOS的笔记_第11张图片

 2.编译和裁剪

开始编译试试。会出现一堆错误,不要着急,往下看。

关于MCU M4内核移植FreeRTOS的笔记_第12张图片

 

出错提示是因为没有找到 FreeRTOSConfig.h头文件,添加了这个头文件就可以解决大部分的错误了。我们去FreeRTOS源码目录找,在Demo目录下是可以找到的,我们用的是M4内核,所以选择Demo\CORTEX_M4F_STM32F407ZG-SK目录下的FreeRTOSConfig.h文件,如下。

 关于MCU M4内核移植FreeRTOS的笔记_第13张图片

 

 把 FreeRTOSConfig.h复制到我们工程FreeRTOS\include目录下,再IAR包含几个头文件目录,

FreeRTOS\include目录、FreeRTOS\portable\IAR\ARM_CM4F目录。

 

关于MCU M4内核移植FreeRTOS的笔记_第14张图片

 再编译看看。

 关于MCU M4内核移植FreeRTOS的笔记_第15张图片

 现在有两个错误,我们把点开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头文件。

关于MCU M4内核移植FreeRTOS的笔记_第16张图片

 找到FreeRTOSConfig.h存放的FreeRTOS\include目录下,点击OK即可,再进行编译看看,肯定还有错.

关于MCU M4内核移植FreeRTOS的笔记_第17张图片

因为portasm.s运用到了FPU浮点单元运算,M4内核是带有FPU单元的,但是要开启才行。开启如下。

关于MCU M4内核移植FreeRTOS的笔记_第18张图片

 接下来进行编译也还会有错,显示错误如下。

关于MCU M4内核移植FreeRTOS的笔记_第19张图片

 是因为FreeRTOSConfig.h文件里面开启了4个钩子函数定义,把它们关闭,定义为0即可,分别是configUSE_IDLE_HOOK、configUSE_TICK_HOOK、configCHECK_FOR_STACK_OVERFLOW、configUSE_MALLOC_FAILED_HOOK。

接着编译,还是出错,这么难的吗,别急,这是最后的错误啦!!!。

关于MCU M4内核移植FreeRTOS的笔记_第20张图片

 这是因为重复定义函数了,我们只需要去把hc32f46x_interrupts.c文件下的PendSV_Handler函数、SysTick_Handler函数、SVC_Handler函数注释掉就好了。

 关于MCU M4内核移植FreeRTOS的笔记_第21张图片

编译,OK没问题。

裁剪配置:

关于MCU M4内核移植FreeRTOS的笔记_第22张图片

关键是这两个配置,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所在头文件路径。

关于MCU M4内核移植FreeRTOS的笔记_第23张图片关于MCU M4内核移植FreeRTOS的笔记_第24张图片

 2、This instruction is not available in the selected cpu/core 

关于MCU M4内核移植FreeRTOS的笔记_第25张图片

解释:此指令在选定的 CPU/内核中不可用,因为没有开启FPU浮点运算单元.

解决办法:开启FPU

关于MCU M4内核移植FreeRTOS的笔记_第26张图片

 

 

你可能感兴趣的:(嵌入式,单片机,mcu,c语言)