在單片機(jī)的地界兒里,C 語言穩(wěn)坐中軍帳,C++ 想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內(nèi)存空間較勁,C++ 那些花里胡哨的玩意兒,在這兒真玩不轉(zhuǎn)。
先說內(nèi)存這道坎兒。您當(dāng) stm32f4 的 256k RAM、1M ROM 是標(biāo)配?多數(shù)時(shí)候咱打交道的,是 stm8 這種 8k RAM 的 “小矮個(gè)兒”,stm32f1 的 32k RAM 就算是 “小康家庭” 了。就這么丁點(diǎn)兒地方,C 語言打個(gè)轉(zhuǎn)都得縮手縮腳,C++ 帶著類、對(duì)象、虛函數(shù)殺進(jìn)來,光構(gòu)造析構(gòu)的開銷就能把 ROM 啃掉一大塊。您說上實(shí)時(shí)系統(tǒng)?C 語言寫代碼都得掰著字節(jié)算,C++ 的運(yùn)行時(shí)環(huán)境?在這兒純屬 “奢侈品”,就像讓小毛驢拉火車頭,根本不配套。
再聊動(dòng)態(tài)內(nèi)存這事兒。keil 里 stm32f1 的 malloc 默認(rèn)就 800 字節(jié),您想用 C++ 的動(dòng)態(tài)內(nèi)存玩花樣?那些依賴動(dòng)態(tài)內(nèi)存的類,分分鐘把棧撐爆。單片機(jī)開發(fā)講究的是 “把每滴血都榨干”—— 全局變量往 map 文件里一擺,編譯完內(nèi)存占用明明白白,出問題順著寄存器和棧區(qū)就能摸到根兒。C++ 的動(dòng)態(tài)內(nèi)存監(jiān)控庫(kù)?得了吧,那庫(kù)自己先占一塊內(nèi)存,本來就緊張的 RAM 哪經(jīng)得起這么折騰?咱電子工程師沒那么多講究,估摸好內(nèi)存直接定全局變量,爆了內(nèi)存直接扒拉匯編找棧幀,比在 C++ 的內(nèi)存海里撈針痛快多了。
硬件驅(qū)動(dòng)這塊兒,芯片廠壓根沒給 C++“開小灶”。就說 stm32 的 HAL 庫(kù),用句柄模仿類函數(shù),可要是不用 cubemx 自己擼代碼,那層層嵌套的函數(shù)能把人繞暈,改個(gè)驅(qū)動(dòng)能薅掉半頭頭發(fā)。反過來看 C 語言的標(biāo)準(zhǔn)庫(kù),直接把寄存器封裝得明明白白,想改哪兒就改哪兒,對(duì)著芯片手冊(cè)就能硬剛寄存器位。要是發(fā)現(xiàn)廠商把寄存器位置改錯(cuò)了,分分鐘就能揪出來。C++ 想玩硬件級(jí)操作?先穿過類封裝的 “迷宮” 再說,等摸到寄存器,C 語言寫的驅(qū)動(dòng)早跑出老遠(yuǎn)了。
最后說說咱寫代碼的人。沒錯(cuò),咱在純軟大佬眼里就是 “菜”—— 四年大學(xué)就學(xué)了 C 語言和匯編,數(shù)據(jù)結(jié)構(gòu)、算法啥的都是野路子,git、stackoverflow 也不熟,寫的代碼沒少被罵 “屎山”。可您讓那些玩慣高級(jí)語言的來搞單片機(jī),分分鐘在內(nèi)存越界里打轉(zhuǎn)。咱靠的就是對(duì)硬件的死磕勁兒,知道每一行代碼在寄存器里怎么跳,C++ 的優(yōu)雅在這兒不如一句精準(zhǔn)的寄存器操作實(shí)在。您看市面上的 MCU 例程、廠商庫(kù),有幾個(gè)不是 C 語言打底?生態(tài)在這兒擺著,咱犯不著為了好看去折騰那些不實(shí)用的語法糖。
在 MCU 開發(fā)這一畝三分地里,C 語言就像一把趁手的螺絲刀,簡(jiǎn)單、直接、高效,每一行代碼都能釘在該釘?shù)牡胤剑籆++ 則像一把雕花匕首,好看是好看,可在這兒施展不開。咱追求的不是代碼多漂亮,而是讓那幾 k 的 RAM 和幾十 k 的 ROM 實(shí)實(shí)在在跑起來,不出錯(cuò)、好調(diào)試、能落地 —— 就這點(diǎn)兒實(shí)在需求,C 語言足夠漂亮地把活兒干完,何必去夠那夠不著的月亮呢?
-
mcu
+關(guān)注
關(guān)注
146文章
17950瀏覽量
363850 -
C語言
+關(guān)注
關(guān)注
180文章
7631瀏覽量
141352
發(fā)布評(píng)論請(qǐng)先 登錄
是否應(yīng)該使用C++替代C語言進(jìn)行開發(fā)工作
C語言C++運(yùn)用
是否應(yīng)該使用C++替代C語言進(jìn)行開發(fā)工作
c++程序設(shè)計(jì)語言題解

C/C++編程語言學(xué)習(xí)難點(diǎn)及語言
C語言與C++相互調(diào)用

嵌入式程序開發(fā),C語言和C++究竟應(yīng)該用哪個(gè)?

評(píng)論