【FreeRTOS】系统移植:资料下载(一)https://developer.aliyun.com/article/1472584
移植FreeRTOS
在工程目录下新建一个FreeRTOS的文件夹再在这个文件夹下面建立三个文件夹分别是include、src和port;
将FreeRTOSv9.0.0\FreeRTOS\Source文件夹下面的所有.c文件拷贝到src目录
将FreeRTOSv9.0.0\FreeRTOS\Source\include下面所有文件拷贝到include目录
将FreeRTOSv9.0.0\FreeRTOS\Source\portable目录下的MemMang文件夹和RVDS文件夹拷贝到port目录
将FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK\FreeRTOSConfig.h文件复制到工程的core/Inc目录中,这个文件是该实时操作系统的配置文件,这就有点像Linux的.config配置文件一样对应的芯片又对应的配置文件,在这个demo里面涵盖了大部分的芯片支持,如果没有的话选择自己芯片的架构随意复制一个然后进行更改配置即可;
其实在stm32CUBEMX中我们可以直接添加FreeRTOS的包,而且建立工程更加方便,但是自动生成的工程很难让我们了解这个工程的组成这里只是走一遍流程,后续如果在项目中使用到FreeRTOS可以选择利于自己开发的方式创建即可;
然后我们打开keil添加我们的freertos源码文件进来
新建FreeRTOS/port和FreeRTOS/src组,添加文件需要注意我们的配置文件时.h文件所以要选择All files否则找不到
FreeRTOS/src目录全部添加进来
FreeRTOS/port 用于存放 port\MemMang 文件夹 与 port\RVDS\ARM_CM?文件夹的内容,“?”表示 3、4 或者 7,具体选择哪个得看你 使用的是哪个型号的 STM32 开发板,如果是F4系列就拷贝port\RVDS\ARM_CM4F,然后我们将工程文件中 FreeRTOS 的内容添加到工程中去,按照已经新建的分组添加 我们的 FreeRTOS 工程源码。 在 FreeRTOS/port 分组中添加 MemMang 文件夹中的文件只需选择其中一个即可,我 们选择“heap_4.c”,这是 FreeRTOS 的一个内存管理源码文件。
heap_1.c:适合一些不会删除任务,队列以及信号量的任务,特别是一些比较简单的系统和一些对安全性要求比较高的系统。事实上,很多系统中只要创建了任务之后就会一直执行,不会删除任务。所以这个文件适用环境还是比较多的。
heap_2.c:能分配,能回收,但是回收时不考虑内存碎片的场所。适合一些申请和释放操作不是特别频繁,而且不会申请大数组的场所。(申请和释放会造成内存碎片,过多操作内存中可能没有大的连续区域)
heap_3.c:这种方法实际使用的还是c语言的malloc和free函数。与平台没有太大关系。
heap_4.c:内存分配和释放操作比较频繁的系统。例如要重复创建删除任务,队列,信号量等。
heap_5.c:系统需要管理不连续的内存空间,例如接入外部ram的场合
包含文件路径
添加头文件包含
配置串口重定向
#include <stdio.h> int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); return ch; }
然后我们开始编译:
错误1:…\FreeRTOS\port\RVDS\ARM_CM4F\port.c(483): error: A1586E: Bad operand types (UnDefOT, Constant) for operator
解决办法:全局搜索__NVIC_PRIO_BITS将4U改成4
错误2:中断函数的重复定义
因为FreeRTOS已经帮我们实现了这几个函数所以我们需要在stm32f4xx_it.h文件中将这三个中断函数注释掉即可;
错误3:STM32F407ZG_FreeRTOS\STM32F407ZG_FreeRTOS.axf: Error: L6218E: Undefined symbol vApplicationIdleHook (referred from tasks.o).等四个函数未定义
解决办法就是先不实现这几个钩子函数让他等于空
再次编译就成功了,到这里工程移植就完成了,下面进行简单的测试
【FreeRTOS】系统移植:资料下载(三)https://developer.aliyun.com/article/1472586