STM32
直播中

艾玛

11年用户 770经验值
擅长:模拟技术 EDA/IC设计 RF/无线
私信 关注
[问答]

基于STM32cubeMX生成工程添加C++代码该如何去实现呢

基于STM32cubeMX生成工程添加C++代码该如何去实现呢?



回帖(1)

王志宏

2021-12-17 10:12:51
首先说明一下,本文的开发环境是linux,基于STM32cubeMX生成工程添加C++部分代码和选项。写给单片机开发windows转linux新手,高手略过。
STM32cubeMX生成Makefile工程步骤,以及Linux环境搭建,本文着重讲解添加C++代码的过程。
cubeMX生成工程默认是C语言,还有一部分汇编。
首先加入file.cpp到工程,在Middlewares下新建cxxsource文件夹,当然也可以在你喜欢的位置添加。将C++代码拷贝到cxxsource/。
在Makefile  C_SOURCES后面增加,参与编译
   # CPP sources
   CXX_SOURCES =   
   Middlewares/cxxsource/ringbuffer.cpp   
   Middlewares/cxxsource/line.cpp   
   Middlewares/cxxsource/uart_process.cpp


在编译工具链选项添加g++编译选项

   #######################################
   # binaries
   #######################################
   BINPATH =  
   PREFIX = arm-none-eabi-
   CC =   $(  BINPATH  )$(  PREFIX  )gcc
   CXX =   $(  BINPATH  )$(  PREFIX  )g++   #add g++
   AS =   $(  BINPATH  )$(  PREFIX  )gcc -x assembler-with-cpp
   CP =   $(  BINPATH  )$(  PREFIX  )objcopy
   AR =   $(  BINPATH  )$(  PREFIX  )ar
   SZ =   $(  BINPATH  )$(  PREFIX  )size
   HEX =   $(  CP  ) -O ihex
   BIN =   $(  CP  ) -O binary -S



增加C++头文件目录,将引用到的C头文件目录也包含进来
   CXX_INCLUDES =   
   -IMiddlewares/cxxsource   
   -IMiddlewares/HARDWARE/include



CFLAGS后面增加CXXFLAGS

   CXXFLAGS = -lstdc++   $(  CFLAGS  )   $(  CXX_DEFS  )   $(  CXX_INCLUDES  ) -g -ggdb3 -fno-rtti -fno-exceptions   
   -fverbose-asm -fdata-sections -ffunction-sections -fpermissive -Wa,-ahlms=  $(  BUILD_DIR  )/  $(  notdir   $(  <:.cpp=.lst  ))



编译选项中增加C++编译选项
   # list of c++ objects
   OBJECTS +=   $(  addprefix   $(  BUILD_DIR  )/,$(  notdir   $(  CXX_SOURCES:.cpp=.o  )))
   vpath %.cpp   $(  sort   $(  dir   $(  CXX_SOURCES  )))

以及
   $(  BUILD_DIR  )/%.o: %.cpp Makefile |   $(  BUILD_DIR  )  
         $(  CXX  ) -c   $(  CXXFLAGS  )   $< -o   $@



在此大功告成,你的工程已经可以编译C++代码了。
然而还要注意一下,提供给C调用的接口一定要符合C标准,并且在头文件声明
   #ifdef     __cplusplus
   extern   "C" {
   #endif

   void   Uart_RecvBuffTask(  void   const * argument);

   #ifdef     __cplusplus
   }
   #endif

给C调用,C不能直接使用C++对象。


引用到的C头文件,也要做好声明,这是一个C头文件

   extern   "C"
   {
   #include     "dma.h"
   #include     "led.h"
   #include     "timer.h"
   #include     "24l01.h"
   #include     "mpu6050.h"
   #include     "stmflash.h"
   }
1 举报

更多回帖

发帖
×
20
完善资料,
赚取积分