嵌入式开发 | 单片机能用C++开发吗?

发布时间:2023-04-06  

通常来说,在单片机上编程,要么汇编,要么C语言,而用C++进行开发的很少。


那么究竟能不能用C++开发单片机呢?答案肯定是可以的。


下面基于Keil、STM32,用C++编程点亮LED,给初学者提供一下思路。


为什么很少用C++开发单片机

不知道大家对面向过程和面向对象的理解有多少?


C语言是面向过程的语言,C++是面向对象的编程语言。结合本文来说,面向过程相比面向对象的编程,生成代码量(bin文件)更小,运行效率更高。


所以,C语言相比C++具有更小代码量(bin文件)、更快的运行速度。


当然,这里是C相对C++而言。其实,汇编相对C而言,具有更小代码量和更快的运行速度。(可以参看文章:用 汇编 和 C语言 点灯程序有什么不一样?)


因为单片机的RAM和Flash资源相比较小,运行速度也相对较低,所以,你会发现:很少有人在单片机上面用C++开发项目。


其实,随着单片机的存储资源以及运行速度的增加,目前有些工程师开始用C++开发单片机项目了。


准备工作

在Keil MDK开发环境下,用C语言开发STM32比较常见了,什么开发环境安装、创建工程等这些步骤,本文不讲述,请参看我文章:Keil系列教程01_Keil介绍、下载、安装与注册Keil系列教程02_新建基础软件工程


这是Keil的基础教程,有不懂的同学,可以在我公众号后台回复关键字“Keil系列教程”阅读Keil更多的使用方法。


然后就是需要懂一些C++的基础语法,本文讲述的内容比较基础,用到C++很基础的知识。比如:类、对象这些基础内容。


没学过C++也没关系,只要懂C语言,在网上现学C++基础知识,难度都不大。


使用说明

在Keil MDK环境下,使用的是ARM编译器(Arm Compiler),很多网上教程使用V6编译,其实V5和V6版本都是支持C++编程语言的。


在工程中添加C++源代码(比如:main.cpp)


使用V5和V6,工程配置的选项有些差异

ST的开发库都已经做了支持,你会看到这么一段代码:

#ifdef __cplusplus extern "C" {#endif

//这里C源代码

#ifdef __cplusplus}#endif


这是一段预处理,从预处理代码可以看得出来,大概意思就是:支持C和C++混合编程。


定义LED类

在本文默认大家掌握了用C语言开发STM32流水灯的知识,直接描述C++代码内容。


本文讲述一个很基础的例子"LED点灯",用C++编程实现的方法很多,这里将其中一个基础的方法。


首先,创建一个main.cpp源代码文件,定义一个LED类:


class LED_Class{

然后定义私有成员(当然,public也可以):


class LED_Class{private:  GPIO_TypeDef *GPIOx;  uint16_t GPIO_Pin;  uint32_t RCC_APB2Periph;}

再次就是用到的函数:初始化GPIO、打开、关闭LED等。


class LED_Class{private:  GPIO_TypeDef *GPIOx;  uint16_t GPIO_Pin;  uint32_t RCC_APB2Periph;

public:  LED_Class(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin, uint32_t RCC_APB2Periph){    LED_Class::GPIOx = GPIOx;    LED_Class::GPIO_Pin = GPIO_Pin;    LED_Class::RCC_APB2Periph = RCC_APB2Periph;  }

  void Init(void){      GPIO_InitTypeDef GPIO_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);  }

  void Open(void){    GPIO_SetBits(GPIOx, GPIO_Pin);  }

  void Close(void){    GPIO_ResetBits(GPIOx, GPIO_Pin);  }};

这个代码是不是很简单,即使你不会C++,只要懂C语言,相信都能看懂。


流水灯实现(main函数)

用C++的思路和C语言类似,先初始化,然后再实现:


int main(void){  LED_Class LED1(GPIOF, GPIO_Pin_7, RCC_APB2Periph_GPIOF);  LED_Class LED2(GPIOF, GPIO_Pin_8, RCC_APB2Periph_GPIOF);

  LED1.Init();  LED2.Init();

  while(1)  {    LED1.Open();    LED2.Open();    Delay(10);

    LED1.Close();    LED2.Close();    Delay(10);  }}

还有一种初始化:


int main(void){  LED_Class *LED1 = new LED_Class(GPIOF, GPIO_Pin_7, RCC_APB2Periph_GPIOF);  LED_Class *LED2 = new LED_Class(GPIOF, GPIO_Pin_8, RCC_APB2Periph_GPIOF);

  LED1->Init();  LED2->Init();

  while(1)  {    LED1->Open();    LED2->Open();    Delay(50);

    LED1->Close();    LED2->Close();    Delay(50);  }}


编译出来的代码量相对更大:


然后,如果有开发板,直接下载即可运行LED闪烁的现象。

说明:

使用C++写单片机流水灯程序,实现的方法有很多,比如还有一些更高级的继承、多态等用法,也可以引入进来。以上只是提供一种思路,引导初学者学习C++编程。

是不是很简单,看到这里,你学废了吗?


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    单片机属于嵌入式系统吗?嵌入式开发要学哪些课程?;我们在做产品开发的时候,基本很少去了解这些概念性的东西。 后面我特意去了解了一下,今天就把这些概念分享给有同样问题的朋友。 嵌入式一般叫嵌入式......
    我们在刚开始接触单片机的时候都会有这么一个错觉,觉得单片机产品设计和电路相关,就需要深入的了解这些基础,其实这个想法是有问题的。 单片机开发学习的基础是C语言,除了C语言之外就是单片机外设资源的驱动,其他相关的知识不是单片机工程师必须要学......
    系统设计,不知道怎么学习,您可以指点下需要学习什么东西,怎样学吗? 答:先学单片机,再学嵌入式系统。需要C 语言基础。 1k 是什么? 答:1K=1024=2 的 10 次方。 关于......
    嵌入式入门应该学什么?先从学习单片机开始!;可能很多人不知道嵌入式,不知道单片机。 但是我说最近几年的流行的应用大家就了解了。 1. 无人机 2. 共享单车 3. 丰巢快递柜 4. 充电桩 5......
    丰富的外设资源,可以满足很多应用场景,例如:PWM模块、ADC模块、USART模块等等。而CH32的外设资源相对来说要简单一些,但是可以满足很多基本的应用需求。二、ch32可以用keil?keil是嵌入式......
    编程,需要学习的小破站上搜索无际单片机编程直接观看。 与市面上那些c语言教程不同的是,市面上很多都是偏向纯软方向的教学,我们是偏向单片机的,它们的开发编译环境都不一样,有些细节的语法也不一样。 建议......
    不断的积累单片机程序开发的经验,我们的资历越老,薪水越高。 3.在单片机程序开发工程师,有硬件知识的要求吗? 嵌入式单片机程序工程师,一般不需要很扎实的硬件基础,电子产品的设计一般是有硬件工程师和软件工程师配合完成的。 硬件......
    有望冲击16%的使用率。 嵌入式,该用C++? 都说C++太难了,那么,在嵌入式界,C++到底好用不好用,实际情况如何? 在嵌入式Linux领域,C++非常好用。就比如说,5千行......
    化竞争十分的不明显。 做嵌入式学习的理论就多了,一个大的分支,你可以以专家模式学习,你也可以以工程师模式学习。 软件方面学习的量不亚于做Java,C++编程的,甚至和底层打交道还要学......
    向。如果你想学好嵌入式和单片机,只懂数字电路和微机接口这样的硬件知识是不够的,你更需要学习的,是汇编、C/C++语言、数据结构和算法知识。拥有软硬结合的能力,远远......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>