嵌入式中,什么情況用C?什么情況用C ?
C
與 C
的選擇其實是“面向過程”與“面向對象”的選擇。Sugar 認為這兩種編程思想的選擇取決于軟件的特性,軟件特性包括幾個方面,都是 Sugar 總結出來的經驗。本文力求把“軟件特性”與“語言選擇”結合圖示理清晰。嵌入式最簡 IO 模型
“最簡 IO 模型”自然是輸入直接輸出,比如房間里的照明燈給電就亮,這是不需要嵌入式的。按現(xiàn)在的潮流說法,加嵌入式進去那得叫智能硬件。因此,嵌入式的最簡 IO 模型就是在輸入和輸出之間加入“嵌入式運算平臺”,如“圖1”。圖1. 嵌入式最簡 IO 模型在嵌入式最簡 IO 模型下的產品功能大多都相對簡單,有明確的輸入和明確的輸出,也就是說嵌入式軟件的運算過程是明確的。這是自然“面向過程”的情況,這種情況下選
C
還是 C
沒有多大差別。簡單的控制過程就算選 C
也是寫面向過程的軟件。舉個例子來說就是現(xiàn)在小孩子都玩兒膩了的“巡線小車”,上電就跟著線跑。這個用 Arduino C 來實現(xiàn)就可以了,其實 Arduino 是 C
庫,在這種簡單功能上體現(xiàn)不出 C
和 C
有多大區(qū)別。嵌入式受控 IO 模型
所謂“嵌入式受控 IO 模型”可以認為是一個遙控智能車一樣的設備。在受控模型下,嵌入式硬件平臺多了一路“指令”輸入。這時候不妨再加個顯示器,用于顯示當前處于“受控模式”還是“自動模式”,如“圖2”。圖2. 嵌入式受控 IO 模型這里引入的“模式”是一個軟件概念,軟件是有無限可能的,能加一個模式進去就有可能再加很多個模式。模式在軟件流程上是一個環(huán)節(jié),但這個環(huán)節(jié)如上所述有多種不同的可能,這種情況最適合用
C
的面向對象思想來寫程序。即:軟件上“單點多樣”的情況下用 C
使軟件模塊化,用父、子類來實現(xiàn),代碼的可讀性和可維護性都會遠強于用 C
來寫。有關“模式”的詳細展開請看《從 ArduPilot 學習模式管理機制并移植和改進》。嵌入式終級 IO 模型
隨著人工智能的逐步發(fā)展,越來越多的算法需要強勁的 CPU 甚至 GPU,這都不是嵌入式平臺能做的。嵌入式平臺長于實時控制而非快速大量運算,因此需要與機載 PC 配合工作。這樣種情況下的模型如“圖3”。圖3. 嵌入式終級 IO 模型這樣的模型毫無疑問用
C
會得到可維護性更好的嵌入式軟件。如上所述 C
用在“單點多樣”的環(huán)節(jié),也就是說在考慮 C
代碼之前要先確認有“哪些點”以及每個點有“哪些樣”。嵌入式軟件的語言選擇
下面基于“嵌入式終極 IO 模型”展開說嵌入式軟件的語言選擇。在嵌軟部分從前往后展開,首先是傳感器輸入數(shù)據(jù)。傳感器輸入部分的語言選擇
圖4. 傳感器輸入部分語言選擇軟件特性 | 語言 |
---|---|
軟件運行平臺的相關硬件不經常改變 | C |
軟件運行平臺的相關硬件經常改變 | C |
C
的基類,用子類解決廠家差異。這部分 Sugar 在《一文讀懂 ArduPilot 的前后臺架構》中有詳述。嵌入式運算部分的語言選擇
圖5. 嵌入式運算部分語言選擇這一部分的軟件特性是:算法與硬件平臺無關。算法本身是數(shù)學和邏輯,平臺提供運算能力,因此運算部分理應在任何運算能力達到要求的平臺上都能夠運行。另外算法本身具有多樣性,一個目標往往不只一種算法可以達到。“單點多樣”、“跨平臺”這兩點對軟件代碼的文件管理都有比較高的要求,這些要求用
C
就非常容易滿足。協(xié)議數(shù)據(jù)部分的語言選擇
圖6. 協(xié)議數(shù)據(jù)部分語言選擇協(xié)議本質是對傳輸數(shù)據(jù)的打包和解包,這是一個面向過程的事,所以用
C
語言來實現(xiàn)協(xié)議代碼最合適。從數(shù)據(jù)傳輸方面考慮,在把數(shù)據(jù)送給協(xié)議代碼打包前,最好將數(shù)據(jù)分類,以明確數(shù)據(jù)是“給誰”和“干什么”的,這些事 Sugar 統(tǒng)稱為“協(xié)議數(shù)據(jù)管理”。從嵌入式軟件整體來看“協(xié)議數(shù)據(jù)管理”就是整體中的“一個點”,而嵌入式平臺的通信對象可能不唯一,比如“圖6”中就有給顯示器的和給機載 PC 的,也就是說管理起來是“多樣的”。這從軟件整體來看也是一個典型的“單點多樣”,所以協(xié)議數(shù)據(jù)管理這部分選 C
面向對象寫軟件更有優(yōu)勢。往期推薦:嵌入式開發(fā)小記,實用小知識分享
分享幾個Ubuntu必裝的軟件
嵌入式行業(yè)需要什么樣的技術人才?
常用的開源協(xié)議有哪些?
點擊閱讀原文,查看更多分享。