Why C++ is Not Recommended for Microcontroller Programming

Generally speaking, when programming on microcontrollers, it is either assembly or C language, and it is rare to develop with C++, so why is it not recommended to develop microcontrollers with C++?

Below, I will combine Keil and STM32 to explain the content of writing a running light program in C++, to see why C++ is not recommended.

Why is C++ rarely used for microcontroller development?

I wonder how much everyone understands about procedural programming and object-oriented programming?

C language is a procedural language, while C++ is an object-oriented programming language. In this context, procedural programming generates a smaller code size (bin file) and has higher running efficiency compared to object-oriented programming.

Therefore, C language has a smaller code size (bin file) and faster running speed compared to C++.

Of course, this is relative to C++. In fact, assembly language has an even smaller code size and faster running speed compared to C. You can refer to the article: What is the difference between writing a running light program in Assembly and C?

Since the RAM and Flash resources of microcontrollers are relatively small, and the running speed is also relatively low, you will find that very few people use C++ to develop projects on microcontrollers.

Actually, with the increase in storage resources and running speed of microcontrollers, some engineers have started to use C++ for microcontroller projects.

Preparation Work

In the Keil MDK development environment, developing STM32 in C language is quite common. The steps such as installing the development environment and creating a project will not be discussed here. Please refer to the articles:

Keil Series Tutorial 01_Introduction, Download, Installation and Registration

Keil Series Tutorial 02_Creating a Basic Software Project

This is a basic tutorial for Keil. If there are any students who do not understand, you can reply with the keyword “Keil Series Tutorial” in the background of my public account to read more usage methods of Keil.

Then, you need to understand some basic syntax of C++. The content discussed in this article is quite basic, using very basic knowledge of C++. For example: classes, objects, and other foundational content.

If you have not learned C++, it doesn’t matter. As long as you understand C language, learning basic C++ knowledge online is not difficult.

Explanation

In the Keil MDK environment, the ARM compiler (Arm Compiler) is used. Many online tutorials use V6 compiler, but both V5 and V6 versions support C++ programming language.

Add C++ source code to the project (for example: main.cpp)

Why C++ is Not Recommended for Microcontroller Programming

There are some differences in project configuration options between V5 and V6:

Why C++ is Not Recommended for Microcontroller Programming

The development library provided by ST has already supported this, and you will see a piece of code:

#ifdef __cplusplus extern "C" {#endif
// C source code here
#ifdef __cplusplus}#endif
What does this mean?
This is a piece of preprocessing. From the preprocessing code, you can see that it roughly means: support for mixed programming in C and C++.

Defining the LED Class

This article assumes that everyone has mastered the knowledge of developing STM32 running lights using C language, and will directly describe the C++ code content.

This article discusses a very basic example “LED Lighting”, and there are many methods to implement it using C++. Here is one of the basic methods.

First, create a main.cpp source code file and define an LED class:

class LED_Class{}

Then define private members (public can also be used):

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

Next, the functions used: initialize GPIO, turn on, turn off LED, etc.

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);  }};

This code is quite simple. Even if you do not know C++, as long as you understand C language, you will be able to comprehend it.

Implementing the Running Light (main function)

The thought process using C++ is similar to C language: first initialize, then implement:

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);  }}

There is also another way to initialize:

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);  }}
You will find that the compiled code size is actually larger:

Why C++ is Not Recommended for Microcontroller Programming

The larger code size is one reason, but the more important reason is the development of microcontrollers. Historically, they have used C language, and many existing software and mature solutions are based on C language. You can understand that the ecosystem of microcontrollers still belongs to C language rather than C++.

Why C++ is Not Recommended for Microcontroller Programming

END

Author: strongerHuang

Source: Embedded Column

Copyright belongs to the original author. If there is any infringement, please contact for deletion.
Recommended Reading
Share an embedded data visualization tool
The eight realms of programmers, which level are you on?
I used this technology to eliminate thousands of lines of if-else!

→ Follow for more updates ←

Leave a Comment

×