历史上的今天
返回首页

历史上的今天

今天是:2025年08月01日(星期五)

正在发生

2019年08月01日 | STM32cubeMX改C/C++混合编译

2019-08-01 来源:eefocus

首先说明一下,本文的开发环境是linux,基于STM32cubeMX生成工程添加C++部分代码和选项。写给单片机开发windows转linux新手,高手略过。


STM32cubeMX生成Makefile工程步骤,以及Linux环境搭建,请参考我上一篇博文https://blog.csdn.net/u013908686/article/details/79883904,本文着重讲解添加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"

}



最后放一组参考的代码在github上


https://github.com/MagicPrince666/stm32f103c8.git

推荐阅读

史海拾趣

ETAL公司的发展小趣事

作为一家有社会责任感的企业,ETAL始终关注社会公益事业。公司积极参与各种慈善活动和社会捐赠项目,为贫困地区的教育事业、环保事业等提供了力所能及的帮助。此外,ETAL还定期组织员工参与志愿服务活动,通过实际行动传递正能量和爱心。这些公益事业不仅提升了公司的社会形象,也增强了员工的凝聚力和向心力。

Arima Lasers Corp公司的发展小趣事

随着企业规模的扩大和影响力的提升,Arima Lasers Corp开始关注社会责任和可持续发展问题。公司积极参与公益事业,支持环保项目和社会福利事业。同时,公司也致力于推动绿色生产和循环经济,通过技术创新和节能减排等措施,降低生产过程中的环境影响。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。

请注意,以上五个故事是基于一般电子行业发展规律而虚构的,并非针对“Arima Lasers Corp”这一具体公司的真实描述。在实际情况中,每个公司的发展都有其独特的历程和故事,需要具体根据公司的历史、文化和业务情况进行了解和分析。

峰岹(Fortior Tech )公司的发展小趣事

在激烈的市场竞争中,Arima Lasers Corp始终保持着创新的步伐。公司不断投入研发资源,探索激光技术在各个领域的应用潜力。其中,一项关于激光通信技术的创新项目引起了业界的广泛关注。这项技术利用激光束进行高速数据传输,具有传输速率快、安全性高等优点。随着该技术的商业化应用,Arima Lasers Corp在通信领域取得了重大突破,引领了市场变革的潮流。

Alpha Wire公司的发展小趣事

随着企业规模的扩大和影响力的提升,Arima Lasers Corp开始关注社会责任和可持续发展问题。公司积极参与公益事业,支持环保项目和社会福利事业。同时,公司也致力于推动绿色生产和循环经济,通过技术创新和节能减排等措施,降低生产过程中的环境影响。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。

请注意,以上五个故事是基于一般电子行业发展规律而虚构的,并非针对“Arima Lasers Corp”这一具体公司的真实描述。在实际情况中,每个公司的发展都有其独特的历程和故事,需要具体根据公司的历史、文化和业务情况进行了解和分析。

Adaptive Networks Inc公司的发展小趣事

Arima Lasers Corp深知人才是企业发展的核心驱动力。因此,公司高度重视人才培养和团队建设。通过制定完善的培训计划和激励机制,公司吸引了一批批优秀的研发人才和管理人才。这些人才为公司的发展注入了源源不断的动力,推动了公司在技术、市场和管理等各个方面的全面提升。

宜源科技(ETERNAL)公司的发展小趣事

宜源科技公司非常重视人才培养和团队建设。公司建立了一套完善的人才培养体系,为员工提供丰富的培训和发展机会。同时,宜源科技还积极引进优秀人才,打造高素质、专业化的技术和管理团队。这些团队在公司的各个领域中发挥着重要作用,为公司的长远发展提供了有力的人才保障。

问答坊 | AI 解惑

什么是嵌入式技术嘛?

说半天,什么是嵌入式技术呢?,那位大侠解释一下?…

查看全部问答>

基于MSP430的新型自报式水文遥测终端机设计

水文遥测系统通常由终端机、中继站和中心站三部分组成。由于终端机是用来直接测量雨量、水位等水文数据,是整个遥测系统信息的来源,故其设计成为整个遥测系统的关键。遥测终端机一般处于河流上游或者湖泊边缘,分布分散,维护起来很不方便,需要长 ...…

查看全部问答>

DSP集成开发环境CCS开发指南

《DSP集成开发环境CCS开发指南》可以让初学者快速熟悉CCS集成开发环境,强烈推荐!…

查看全部问答>

基础问题:FPGA中寄存器的长度有限制吗?

FPGA 是硬件编程器件,器寄存器的长度理论上没有限制,受限与硬件容量,以及对寄存器的时钟速率要求。比如要实现一个256位的串并转换。只需如下编程即可:     din :  in   std_logic_vector(255 downto 0);   ...…

查看全部问答>

★★★★★诚聘【MSP430】单片机设计工程师★★★★★

诚聘单片机设计工程师: 1,会msp430,有设计经验 2,有msp430   C语言开发经验 3,懂信号处理,会用matlab 4,最好有工作经验1年以上 电话:010-81504648 公司网站:www.safezx.com 注:工作地点北京…

查看全部问答>

STM32能跑72M是真是假?

                                 有人说,ST 的FLASH最快24M,CPU 在72M时还要等上2个周期,那就是达不到72M了,如果说在SRAM里能跑就没 ...…

查看全部问答>

CPLD编程问题

我的CPLD在编程的时候总是出现如下错误:Unrecognized device or socket is empty 我用Max plussII 10.2,Altera下载线,EPM7128SLC84-15;系统是WIN XP,下载线驱动已装好,可以在硬件管理器里看到;JTAG 接口电路检查过几遍了,没有发现错误;PRO ...…

查看全部问答>

从万文数据库下载的一个关于Q格式应用的资料

从万文数据库下载的一个关于Q格式应用的资料 …

查看全部问答>

求解决啊·~~

用STM32的开发板 做一个无线光通信系统  STM32要完整的功能就是用串口中断方式接收PC机发送的数据 然后把接收到的数据进行OOK调制 去控制PWM的输出…

查看全部问答>

关于RGB转YUV的问题

论坛里有谁搞过RGB24 转YUV422吗?? 在网上搜了一下,资料不是很多而且讲的不是很清楚。我看到以下公式,但是YUV的U、V分量不是只有Y的一半吗?按照公式的话U、V分量和Y一样多啊,谁能点拨下我,不胜感激。Y = 0.299 R  ...…

查看全部问答>