通常來說,在單片機上編程,要么匯編,要么C語言,而用C++進行開發(fā)的很少。
那么究竟能不能用C++開發(fā)單片機呢?答案肯定是可以的。
下面基于Keil、STM32,用C++編程點亮LED,給初學(xué)者提供一下思路。
為什么很少用C++開發(fā)單片機
不知道大家對面向過程和面向?qū)ο?/strong>的理解有多少?
C語言是面向過程的語言,C++是面向?qū)ο蟮木幊陶Z言。結(jié)合本文來說,面向過程相比面向?qū)ο蟮木幊?,生成代碼量(bin文件)更小,運行效率更高。 所以,C語言相比C++具有更小代碼量(bin文件)、更快的運行速度。 當然,這里是C相對C++而言。其實,匯編相對C而言,具有更小代碼量和更快的運行速度。(可以參看文章:用 匯編 和 C語言 點燈程序有什么不一樣?) 因為單片機的RAM和Flash資源相比較小,運行速度也相對較低,所以,你會發(fā)現(xiàn):很少有人在單片機上面用C++開發(fā)項目。 其實,隨著單片機的存儲資源以及運行速度的增加,目前有些工程師開始用C++開發(fā)單片機項目了。準備工作
在Keil MDK開發(fā)環(huán)境下,用C語言開發(fā)STM32比較常見了,什么開發(fā)環(huán)境安裝、創(chuàng)建工程等這些步驟,本文不講述,請參看我文章:Keil系列教程01_Keil介紹、下載、安裝與注冊Keil系列教程02_新建基礎(chǔ)軟件工程
這是Keil的基礎(chǔ)教程,有不懂的同學(xué),可以在我公眾號后臺回復(fù)關(guān)鍵字“Keil系列教程”閱讀Keil更多的使用方法。
然后就是需要懂一些C++的基礎(chǔ)語法,本文講述的內(nèi)容比較基礎(chǔ),用到C++很基礎(chǔ)的知識。比如:類、對象這些基礎(chǔ)內(nèi)容。
沒學(xué)過C++也沒關(guān)系,只要懂C語言,在網(wǎng)上現(xiàn)學(xué)C++基礎(chǔ)知識,難度都不大。
使用說明
在KeilMDK環(huán)境下,使用的是ARM編譯器(Arm Compiler),很多網(wǎng)上教程使用V6編譯,其實V5和V6版本都是支持C++編程語言的。
在工程中添加C++源代碼(比如:main.cpp)

使用V5和V6,工程配置的選項有些差異:

ST的開發(fā)庫都已經(jīng)做了支持,你會看到這么一段代碼:
extern "C" {//這里C源代碼}
什么意思呢?
這是一段預(yù)處理,從預(yù)處理代碼可以看得出來,大概意思就是:支持C和C++混合編程。
定義LED類
在本文默認大家掌握了用C語言開發(fā)STM32流水燈的知識,直接描述C++代碼內(nèi)容。
本文講述一個很基礎(chǔ)的例子"LED點燈",用C++編程實現(xiàn)的方法很多,這里將其中一個基礎(chǔ)的方法。
首先,創(chuàng)建一個main.cpp源代碼文件,定義一個LED類:
class LED_Class{}
然后定義私有成員(當然,public也可以):
class LED_Class{private:GPIO_TypeDef *GPIOx;uint16_t GPIO_Pin;uint32_t RCC_APB2Periph;}
再次就是用到的函數(shù):初始化GPIO、打開、關(guān)閉LED等。
這個代碼是不是很簡單,即使你不會C++,只要懂C語言,相信都能看懂。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);}};
流水燈實現(xiàn)(main函數(shù))
用C++的思路和C語言類似,先初始化,然后再實現(xiàn):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);}}
編譯出來的代碼量相對更大:

然后,如果有開發(fā)板,直接下載即可運行LED閃爍的現(xiàn)象。
說明:
使用C++寫單片機流水燈程序,實現(xiàn)的方法有很多,比如還有一些更高級的繼承、多態(tài)等用法,也可以引入進來。以上只是提供一種思路,引導(dǎo)初學(xué)者學(xué)習(xí)C++編程。
是不是很簡單,看到這里,你學(xué)廢了嗎?
-
led
+關(guān)注
關(guān)注
243文章
24594瀏覽量
690804 -
單片機
+關(guān)注
關(guān)注
6076文章
45494瀏覽量
670262 -
C++
+關(guān)注
關(guān)注
22文章
2123瀏覽量
77110
原文標題:嵌入式開發(fā) | 單片機能用C++開發(fā)嗎?
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
用C語言來開發(fā)單片機系統(tǒng)軟件最大的好處是什么
C語言和匯編語言在開發(fā)單片機時各有哪些優(yōu)缺點?
C++開發(fā)單片機有哪些優(yōu)勢和劣勢呢?
如何基于Keil、STM32用C++編寫流水燈程序?
在Visual Studio Code上開發(fā)單片機程序(基于IAR msp430)
能用C++開發(fā)單片機嗎
評論