当前位置: 首页 > 科技观察

谈谈单片机可以用C++开发吗?

时间:2023-03-21 12:46:35 科技观察

本文转载自微信公众号“strongerHuang”,作者strongerHuang。转载本文请联系强黄公众号。一般来说,在单片机上编程要么是汇编,要么是C语言,用C++开发的很少。那么我们可以用C++来开发MCU吗?答案是肯定的。下面以Keil和STM32为基础,使用C++编程点亮LED,为初学者提供一些思路。为什么很少用C++开发单片机?不知道大家对面向过程和面向对象了解多少?C语言是面向过程的语言,C++是面向对象的编程语言。结合本文,面向过程编程比面向对象编程生成的代码量(bin文件)更小,运行效率更高。因此,C语言比C++具有更小的代码量(bin文件)和更快的运行速度。当然,这里是C相对于C++而言。事实上,与C相比,汇编具有更小的代码量和更快的运行速度。(可以参考文章:汇编和C语言灯光程序有什么区别?)因为单片机的RAM和Flash资源比较小,运行速度比较低,所以你会发现很少有人在单片机上使用C++。开发项目。事实上,随着单片机存储资源和运行速度的提高,一些工程师已经开始使用C++来开发单片机项目。准备工作在KeilMDK开发环境中,用C语言开发STM32是很常见的。本文不介绍开发环境安装、项目创建等步骤。请参考我的文章:Keil系列教程01_Keil介绍、下载、安装与注册Keil教程系列02_软件工程新基础这是Keil的基础教程。不懂的可以在我的公众号后台回复关键字“Keil系列教程”,阅读更多Keil的使用方法。然后你需要了解一些C++的基本语法。本文介绍的内容比较基础,使用的是非常基础的C++知识。例如:类、对象等基础内容。没学过C++也没关系,只要会C语言,在线学习C++基础并不难。使用说明在KeilMDK环境下,使用ARM编译器(ArmCompiler)。网上很多教程都是用V6编译的。事实上,V5和V6版本都支持C++编程语言。在使用V5和V6的工程中添加C++源代码(例如:main.cpp),工程配置选项有些不同:ST的开发库已经支持了,你会看到这样一段代码:#ifdef__cplusplusextern"C"{#endif//这里是C源代码#ifdef__cplusplus}#endif是什么意思?这是预处理的一段,从预处理代码可以看出。大概意思是:支持C和C++的混合编程。定义LED类这篇文章大家已经默认掌握了用C语言开发STM32行车灯的知识,直接描述C++代码的内容。本文介绍了一个非常基本的示例“LED照明”。用C++编程实现它的方法有很多种,这里介绍一种基本方法。首先创建一个main.cpp源码文件,定义一个LED类:classLED_Class{}然后定义private成员(当然public也可以):classLED_Class{private:GPIO_TypeDef*GPIOx;uint16_tGPIO_Pin;uint32_tRCC_APB2Periph;}再次是使用的功能:初始化GPIO、打开、关闭LED等。类LED_Class{private:GPIO_TypeDef*GPIOx;uint16_tGPIO_Pin;uint32_tRCC_APB2Periph;公共:LED_Class(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,uint32_tRCC_APB2Periph){LED_Class::GPIOx=GPIOx;LED_Class::GPIO_Pin=GPIO_Pin;LED_Class::RCC_APB2Periph=RCC_APB2Periph;}voidInit(void){GPIO_InitTypeDefGPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph,ENABLE);GPIO_InitStruct.GPIO_Pin=GPIO_Pin;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOx,&GPIO_InitStruct);}voidOpen(void){GPIO_SetBits(GPIOx,GPIO_Pin);}voidClose(void){GPIO_ResetBits(GPIOx,GPIO_Pin);}};这段代码是不是很简单,就算你不会C++,相信只要会C语言也能看得懂。水灯(main函数)的实现思路和C++中的C语言类似,先初始化,再执行:intmain(void){LED_ClassLED1(GPIOF,GPIO_Pin_7,RCC_APB2Periph_GPIOF);LED_ClassLED2(GPIOF,GPIO_Pin_8,RCC_APB2Periph_GPIOF);LED1.初始化();LED2.初始化();while(1){LED1.Open();LED2.打开();延迟(10);LED1.关闭();LED2.关闭();延迟(10);}}还有一个初始化:intmain(void){LED_Class*LED1=newLED_Class(GPIOF,GPIO_Pin_7,RCC_APB2Periph_GPIOF);LED_Class*LED2=newLED_Class(GPIOF,GPIO_Pin_8,RCC_APB2Periph_GPIOF);LED1->初始化();LED2->初始化();while(1){LED1->打开();LED2->打开();延迟(50);LED1->关闭();LED2->关闭();延迟(50);}}编译代码量比较大:然后,如果你有开发板,可以直接下载运行LED闪烁现象。说明:用C++编写单片机流水灯程序,有多种实现方式。例如,还可以引入一些更高级的用法,如继承、多态等。以上只是指导初学者学习C++编程的一个思路。是不是很简单,看到这里,你学会了吗?