目录
1.下载源码
2.创建FRERTOS工程
新建keil工程(选择文件夹PROJECT):
3.准备工作做好了:接下来正式开始移植
b.裁剪不用的删除
c.设置头文件路径(点击上边小锤子 然后c/c++ 底下有include payh):
d.添加主函数
e.尝试第一次编译
d:一定要主要这个错误很难找
e:因为宏定义一开始没有开启,需要我们去修改开启
f:修改没有定义的钩子函数的宏定义1改成0
同样的FreeRTOS在stm32F407还会出现一个错误:
FreeRTOS官网:https://freertos.org/
下载FreeRTOS最新版:(直接下载relese版就可以了)
https://freertos.org/a0013.04.html
新建工程文件夹:
建立3个文件夹
FreeRTOS:存放内核
PROJECT:工程文件
USER:main.c文件
选择内核和启动文件(普通创建keil工程一样)
点击上边的新建文件,就是三个红绿白正方形的图案
a:简单介绍下载的FreeRTOS
首先看到的解压完成的FreeRTOS
FreeRTOS就是存放FreeRTOS移植的
FreeRTOS-Plus是扩展功能的文件夹
将Source下的所有文件拷贝到刚才新建的FreeRTOS文件夹中
E:\EnglishPath\FreeRTOS2021\FreeRTOSv202107.00\FreeRTOS\Source
然后将portable下的文件裁剪只剩下:
keil:keil所需要的文件
MemMang:内存管理
RVDS:选择这个ARM_CM4F文件夹下的,因为我们是M4芯片
添加以下文件(具体如何添加文件,没那么小白吧):
E:\EnglishPath\FreeRTOS_test\FreeRTOS\portable\RVDS\ARM_CM4F
E:\EnglishPath\FreeRTOS_test\FreeRTOS\portable\MemMang
E:\EnglishPath\FreeRTOS_test\FreeRTOS
......\FreeRTOS_test\FreeRTOS\include
.......\FreeRTOS\portable\RVDS\ARM_CM4F
然后在USER添加主main.c(因为必须有主函数才能运行):
int main()
{
return 0;
}
点击运行编译:然后都是 缺少FreeRTOSConfig.h 这个文件是去下载的内核文件demo区找
注意:不同的芯片找不同的FreeRTOSConfig.h
E:\EnglishPath\FreeRTOS2021\FreeRTOSv202107.00\FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK
然后将该文件添加到自己include中,然后继续编译
注意警惕::::突然报了83个错误
../FreeRTOS/portable/RVDS/ARM_CM4F\portmacro.h(173): error: expected 'volatile', 'inline', 'goto', or '('
../FreeRTOS/portable/RVDS/ARM_CM4F\portmacro.h(203): error: expected 'volatile', 'inline', 'goto', or '('
../FreeRTOS/portable/RVDS/ARM_CM4F\portmacro.h(93): note: expanded from macro 'portYIELD'
这是因为编译版本代,不知道为什么这个版本6编译器都不支持,改成5之后就只有四个错误了
首先看到的是:
..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c(734): error: #20: identifier "SystemCoreClock" is undefined
这是因为FreeRTOSConfig.h里边这个预处理不对,
将#ifdef __ICCARM__ 替换成#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
#ifdef __ICCARM__
#include
extern uint32_t SystemCoreClock;
#endif
剩下的错误:都是HOOK结尾的钩子函数因为声明了,没有进行实现,
将FreeRTOSConfig.h,下的宏定义改成0,0代表不使用
.\Objects\FREERTOS.axf: Error: L6218E: Undefined symbol vApplicationIdleHook (referred from tasks.o).
.\Objects\FREERTOS.axf: Error: L6218E: Undefined symbol vApplicationStackOverflowHook (referred from tasks.o).
.\Objects\FREERTOS.axf: Error: L6218E: Undefined symbol vApplicationTickHook (referred from tasks.o).
全都改成0
#define configUSE_IDLE_HOOK 1
#define configUSE_TICK_HOOK 1
#define configCHECK_FOR_STACK_OVERFLOW 1
.\Objects\TEST.axf: Error: L6200E: Symbol SVC_Handler multiply defined (by port.o and stm32f4xx_it.o).
.\Objects\TEST.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by port.o and stm32f4xx_it.o).
.\Objects\TEST.axf: Error: L6200E: Symbol SysTick_Handler multiply defined (by port.o and stm32f4xx_it.o).
因为中断和FreeeRTOS重复定义了,这里我们将这三个函数在stm32f4xx_it.c中屏蔽掉
都注释掉就好了
这个时候也就是完成的时候了,没有错误了。有什么错误希望订正我改正