STM32CubeMX生成带FreeRTOS的工程 支持V6编译器 C++混编

打开STM32Cube创建一个工程

STM32CubeMX生成带FreeRTOS的工程 支持V6编译器 C++混编

按需求配置好,打开Middleware中间件中的FREERTOS,由于CubeMX5.3版本后,增加对F7芯片的CMSIS_V2接口支持,因此根据你的CubeMX版本选择合适版本的接口,这里我选择CMSIS_V2接口。CubeMX版本的不同,自带生成的Freertos版本也是不同的,这里我的Freertos版本是V10.0.1,如果使用较老的CubeMX版本,这里的Freertos版本应该是V9.0.0.

*内存管理算法默认heap_4

STM32CubeMX生成带FreeRTOS的工程 支持V6编译器 C++混编

接下来就根据实际使用需求,在Tasks and Queues窗口下配置任务,包括任务名称、堆栈大小、优先级、是否设为weak函数等等。

STM32CubeMX生成带FreeRTOS的工程 支持V6编译器 C++混编

打开正上方的Project Manager,勾选只复制必要的库文件,这样能减小整个项目的体积;分别生成.c/.h的外设文件,这样方便查看不同外设驱动代码。设定好之后,电机Generate Code,生成工程文件。

STM32CubeMX生成带FreeRTOS的工程 支持V6编译器 C++混编

打开生成的Keil工程,按F7或者编译按键,确认CubeMX生成的工程能正常编译。

STM32CubeMX生成带FreeRTOS的工程 支持V6编译器 C++混编

接下来打开工程配置,在Target窗口下,将ARM Compiler编译器改为V6.xx.x(由于Keil版本的不同,编译器版本可能有所区别)

如果需要使用printf函数串口调试,则勾选Use MicroLIB,否则即使编译成功,程序也不能正常运行。

STM32CubeMX生成带FreeRTOS的工程 支持V6编译器 C++混编

在C/C++(AC6)窗口下,调整Warning为AC5-like Warnings,如果不想让编译器出现警告,可以选为No warnings,这样编译器只会提醒错误,而不会显示警告。对于C代码,使用C99标准,对于C++代码,使用c++11标准。

STM32CubeMX生成带FreeRTOS的工程 支持V6编译器 C++混编

更改并保存后再次编译,不出意外会报很多错误。

STM32CubeMX生成带FreeRTOS的工程 支持V6编译器 C++混编

去Freertos官网下载CubeMX生成时相应的Freertos版本,并打开xxx/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1目录

STM32CubeMX生成带FreeRTOS的工程 支持V6编译器 C++混编

将该目录下的两个文件复制到CubeMX生成的工程下,覆盖Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM7/r0p1目录下的两个文件

STM32CubeMX生成带FreeRTOS的工程 支持V6编译器 C++混编

这时重新编译,应该显示没有错误。至此已经能使用CubeMX生成带Freertos的工程,并使用V6编译器。

STM32CubeMX生成带FreeRTOS的工程 支持V6编译器 C++混编

接下来讲解下如何支持C++文件。

打开工程文件,在左侧资源管理器右击freertos.c和main.c文件,点击Optitions for File ‘xxxx'

STM32CubeMX生成带FreeRTOS的工程 支持V6编译器 C++混编

将File Type改为C++ Source file即可。

STM32CubeMX生成带FreeRTOS的工程 支持V6编译器 C++混编

需要注意的是,每次在CubeMX里更改并重新生成工程文件后,需要按以上步骤重新覆盖FreeRTOS的相关文件。

而且main.c和freertos.c也需要重新改为c++ source file 类型。

或者你可以直接将main.c和freertos.c改为cpp文件并添加至工程,这样虽然不用每次生成后重新更改格式,但是CubeMX是不会自动识别这两个文件也不会更新他们。所以推荐在生成之后再更改格式以支持c++混编,既能保证CubeMX生成的main.c和freertos.c文件能及时更新,也不至于太繁琐。