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