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

評論