解决MDK5.27 ARM Compiler v6 编译STM32CUBE生成的FreeRTOS工程失败的问题

1. 选择v6编译器

在这里插入图片描述

2. 修改c/cpp编译方式

执行完上一步的时候,你的 C/C++标签 就会变成 C/C++(AC6) ,然后修改红框中的选项:
在这里插入图片描述

3. FreeRTOS汇编迁移:换文件就好了

很多RTOS都有一个或多个与汇编有关的源代码文件,所以,很多有RTOS的工程,编译后都会存在许多错误。
cubeMX的FreeRTOS也是如此,它生成的port.c、portmacro.h不支持GNU,内部有大量的内联汇编,需更换为GCC版本。

即:将工程目录中的 RVDS/ARM_CM4F 内的文件全部替换成GCC/ARM_CM4F里的文件。

然而这有一个问题,如果只是替换掉工程里的文件,下一次用cube生成工程的时候就会覆盖掉我们替换的文件,我们又得重新替换,搞得很沙雕,这该怎么办呢?

哈哈,我们都知道cube生成的工程里的文件都是从一个地方拷过来的(固件库),所以我们虽然不知道如何修改cube选择哪一个文件,但是可以修改cube选择的那个文件呀!

直接把固件库里的 RVDS/ARM_CM4F文件夹 替换成 GCC/ARM_CM4F 就可以了,固件库里两个文件夹都有,他们放在一起的

欧克,那么如何替换固件库的文件呢?

首先找到固件库,下图红框中路径的就是cube的固件库
在这里插入图片描述
然后,找到固件库里RVDS/ARM_CM4F文件夹,怎么找呢,只要根据你自己的工程里 RVDS/ARM_CM4F 路径找就可以了。固件库跟工程的文件结构是一样的,只是多了些东西

RVDS/ARM_CM4F在你自己工程里的目录:
在这里插入图片描述
RVDS/ARM_CM4F在固件库里的目录:
在这里插入图片描述
GCC/ARM_CM4F在固件库里的目录:
在这里插入图片描述

最后,只要把固件库里GCC/ARM_CM4F的两个文件复制到RVDS/ARM_CM4F里就好了

再用cube重新生成一下工程,你工程里RVDS/ARM_CM4F文件夹下的文件就被替换成GCC/ARM_CM4F里面的了

4. 修改V5和V6的不兼容指令

这个可以先不急着改,因为这个只会给警告,不会报错,可以先把error弄完了,再回头改这个。
不兼容的指令也没多少,基本都在图里了
在这里插入图片描述
例如:

1//原版本: 2typedef __packed struct 3{ 4 int16_t a; 5 fp32 b; 6} rx_buff; 7 8//根据上表把__packed 修改为 attribute((packed)) : 9typedef struct attribute((packed)) 10{ 11 int16_t a; 12 fp32 b; 13} rx_buff; 14 15

5. 把 C/C++ 里面 __CC_ARM 的宏定义去掉

我也不清楚为啥,我没删的时候一直有几百个error,删掉__CC_ARM 就好了,也上板子试了一下,没有问题。
在这里插入图片描述

6. 最后就可以用v6编译啦!

代码交流 2021