五部門(mén)關(guān)于開(kāi)展2024年新能源汽車下鄉(xiāng)活動(dòng)的通知
ARM在mbed集成開(kāi)發(fā)環(huán)境上的設(shè)計(jì)——第2部分:程序設(shè)計(jì)和結(jié)構(gòu)
ARM在mbed集成開(kāi)發(fā)環(huán)境上的設(shè)計(jì)——第2部分:程序設(shè)計(jì)和結(jié)構(gòu)在嵌入式系統(tǒng)中有許多不同的開(kāi)發(fā)方法。如第 1 部分所述,mbed 無(wú)需安裝軟件,也不需要額外的開(kāi)發(fā)硬件來(lái)程序。所有的
在嵌入式系統(tǒng)中有許多不同的開(kāi)發(fā)方法。如第 1 部分所述,mbed 無(wú)需安裝軟件,也不需要額外的開(kāi)發(fā)硬件來(lái)程序。所有的軟件工具都放在網(wǎng)上,只要能上網(wǎng)就可以編譯。
值得注意的是,有一個(gè) C++ 編譯器和一組廣泛的軟件庫(kù)用于驅(qū)動(dòng)外圍設(shè)備。因此,也如第 1 部分所述,無(wú)需編寫(xiě)代碼來(lái)配置外設(shè),這在某些系統(tǒng)中可能非常耗時(shí)。
但是,盡管本書(shū)并不假定您具備任何 C 或 C++ 知識(shí),但如果您具備這些知識(shí),您將獲得優(yōu)勢(shì)。
mbed 編譯器和 API
mbed 開(kāi)發(fā)環(huán)境使用 ARM RVDS(RealView 開(kāi)發(fā)套件)編譯器,當(dāng)前版本為 4.1。該編譯器與 mbed 相關(guān)的所有功能都可以通過(guò)mbed 門(mén)戶獲得。
讓 mbed 與眾不同的一件事是它帶有一個(gè)應(yīng)用程序編程接口 (API)。簡(jiǎn)而言之,這是一組編程構(gòu)建塊,以 C++ 實(shí)用程序的形式出現(xiàn),允許快速可靠地設(shè)計(jì)程序。因此,我們將使用 C 或 C++ 編寫(xiě)代碼,但會(huì)利用 API 的功能。
使用 C/C++
如前所述,mbed 開(kāi)發(fā)環(huán)境使用 C++ 編譯器。這意味著所有文件都將帶有 .cpp (Cplusplus) 擴(kuò)展名。然而,C 是 C++ 的一個(gè)子集,并且更易于學(xué)習(xí)和應(yīng)用。這是因?yàn)樗鼪](méi)有使用 C++ 更的“面向?qū)ο蟆狈矫妗?/p>
通常,C 代碼將在 C++ 編譯器上進(jìn)行 C 編譯,但反之則不然。C 通常是任何低復(fù)雜度或中等復(fù)雜度的嵌入式程序的語(yǔ)言,因此在這里很適合我們。因此,為簡(jiǎn)單起見(jiàn),我們的目標(biāo)是在我們開(kāi)發(fā)的程序中僅使用 C。然而,應(yīng)該認(rèn)識(shí)到,mbed API 是用 C++ 編寫(xiě)的,并充分利用了該語(yǔ)言的特性。當(dāng)我們遇到任何基本特征時(shí),我們的目標(biāo)是概述它們。
程序設(shè)計(jì)和結(jié)構(gòu)
處理嵌入式系統(tǒng)設(shè)計(jì)項(xiàng)目時(shí)會(huì)遇到許多挑戰(zhàn)。首先考慮軟件設(shè)計(jì)結(jié)構(gòu)通常是明智的,尤其是對(duì)于大型多功能項(xiàng)目。不可能將所有功能編程到一個(gè)控制循環(huán)中,因此應(yīng)該仔細(xì)考慮將代碼分解為可理解的功能的方法。特別是,它有助于確保實(shí)現(xiàn)以下目標(biāo):
正如此處所討論的,有多種 C/C++ 編程技術(shù)可以考慮這些設(shè)計(jì)要求,包括:函數(shù)、流程圖、偽代碼和代碼重用。
函數(shù)的作用
函數(shù)是較大程序中的一部分代碼。函數(shù)執(zhí)行特定的任務(wù),相對(duì)獨(dú)立于主代碼。函數(shù)可用于操作數(shù)據(jù);如果程序中需要多個(gè)類似的數(shù)據(jù)操作,這將特別有用。函數(shù)可以輸入數(shù)據(jù)值,函數(shù)可以將結(jié)果返回給主程序。因此,函數(shù)對(duì)于編碼數(shù)學(xué)算法、查找表和數(shù)據(jù)轉(zhuǎn)換以及可能對(duì)多個(gè)不同并行數(shù)據(jù)流進(jìn)行操作的控制功能特別有用。也可以使用沒(méi)有輸入或輸出數(shù)據(jù)的函數(shù),只是為了減少代碼大小并提高代碼的可讀性。圖 6.1 說(shuō)明了一個(gè)函數(shù)調(diào)用。
使用函數(shù)有幾個(gè)優(yōu)點(diǎn)。首先,一個(gè)函數(shù)只寫(xiě),編譯到一個(gè)內(nèi)存區(qū)域,而不管從主程序中調(diào)用它的次數(shù)如何,因此減少了程序內(nèi)存。函數(shù)還允許設(shè)計(jì)干凈且易于管理的代碼,允許軟件在多個(gè)抽象級(jí)別上結(jié)構(gòu)良好且可讀。函數(shù)的使用還支持模塊化編碼的實(shí)踐,軟件工程師團(tuán)隊(duì)通常需要開(kāi)發(fā)大型和應(yīng)用程序。因此,使用函數(shù)編寫(xiě)代碼允許一名工程師開(kāi)發(fā)特定的軟件功能,而另一名工程師可能負(fù)責(zé)其他事情。
然而,使用函數(shù)并不總是完全有益。存儲(chǔ)程序位置數(shù)據(jù)和從函數(shù)跳轉(zhuǎn)返回的執(zhí)行時(shí)間開(kāi)銷很小,但這應(yīng)該只在大多數(shù)時(shí)間關(guān)鍵的系統(tǒng)中考慮。此外,可以在函數(shù)中“嵌套”函數(shù),這有時(shí)會(huì)使軟件難以遵循。C 函數(shù)的一個(gè)限制是只能從函數(shù)返回一個(gè)值,并且不能將數(shù)據(jù)數(shù)組傳遞給函數(shù)或從函數(shù)傳遞數(shù)據(jù)數(shù)組(只能使用單值變量)。因此,使用功能和模塊化技術(shù)需要在開(kāi)始編程之前設(shè)計(jì)和評(píng)估經(jīng)過(guò)深思熟慮的軟件結(jié)構(gòu)。
使用流程圖定義代碼結(jié)構(gòu) 使用
流程圖來(lái)指示程序流程的操作和功能的使用通常很有用。可以在編碼之前使用流程圖設(shè)計(jì)代碼流。圖 6.2 顯示了一些使用的流程圖符號(hào)。
例如,采用以下軟件設(shè)計(jì)規(guī)范:
設(shè)計(jì)一個(gè)程序來(lái)連續(xù)遞增七段數(shù)字發(fā)光二極管 (LED) 顯示器的輸出(如圖6.3所示,與第 1 部分中使用的類似)通過(guò)數(shù)字 0 到 9,然后重置回 0 繼續(xù)計(jì)數(shù)。這包括:
七段顯示器的輸出已在前面的第 1 部分中討論過(guò),特別是在表 3.4 中。一個(gè)可行的軟件設(shè)計(jì)如圖 6.4所示。
流程圖使我們能夠可視化代碼的操作順序,并判斷程序的哪些部分可能需要多的關(guān)注或花費(fèi)多的精力來(lái)開(kāi)發(fā)。它們還有助于與非工程師交流潛在設(shè)計(jì),這可能是設(shè)計(jì)滿足非常詳細(xì)規(guī)范的系統(tǒng)的關(guān)鍵。偽代碼
偽代碼由簡(jiǎn)短的英語(yǔ)短語(yǔ)組成,用于解釋程序中的特定任務(wù)。理想情況下,偽代碼不應(yīng)包含任何特定計(jì)算機(jī)語(yǔ)言的關(guān)鍵字。偽代碼應(yīng)該寫(xiě)成一系列連續(xù)的短語(yǔ);我們甚至可以繪制箭頭來(lái)顯示循環(huán)過(guò)程??s進(jìn)可用于顯示偽代碼中的邏輯程序流。
編寫(xiě)偽代碼可以節(jié)省程序開(kāi)發(fā)的編碼和測(cè)試階段的時(shí)間,還有助于設(shè)計(jì)人員、編碼人員和項(xiàng)目經(jīng)理之間的溝通。一些項(xiàng)目可能使用偽代碼進(jìn)行設(shè)計(jì),其他項(xiàng)目可能使用流程圖,還有一些是兩者的結(jié)合。
圖 6.4 中流程圖所示的軟件設(shè)計(jì)也可以用 如下圖 6.5所示的偽代碼來(lái)描述
請(qǐng)注意,函數(shù) SegConvert( ) 和 Delay( ) 是在別處定義的,例如在由不同工程師編寫(xiě)的單獨(dú)的“實(shí)用程序”文件中。函數(shù) SegConvert( ) 可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的查找表或多個(gè) if 語(yǔ)句,將合適的值分配給 B。
使用 mbed 上的函數(shù)
實(shí)現(xiàn)七段顯示計(jì)數(shù)器。下面的程序示例 6.1顯示了一個(gè)程序,它實(shí)現(xiàn)了圖 6.4 中的流程圖和圖 6.5 中所示的偽代碼所描述的設(shè)計(jì)。
它應(yīng)用了第 1 部分的程序示例 3.5 中首次使用的一些技術(shù),但不僅限于這些技術(shù)。主要設(shè)計(jì)要求是使用七段顯示從 0 到 9 連續(xù)計(jì)數(shù)并循環(huán)返回到 0。BusOut 對(duì)象和 A 和 B 變量的聲明以及 SegConvert() 函數(shù)原型出現(xiàn)在程序的早期??梢钥闯觯琺ain() 程序函數(shù)之后是 SegConvert() 函數(shù),該函數(shù)在主代碼中定期調(diào)用。行內(nèi)通知
B=SegConvert(A); // 調(diào)用函數(shù)返回 B
B 可以立即接受 SegConvert() 函數(shù)的返回值。
請(qǐng)注意下面一行的 SegConvert( ) 函數(shù),它應(yīng)用了 return 關(guān)鍵字:
返回 SegByte;
這一行導(dǎo)致程序執(zhí)行返回到函數(shù)被調(diào)用的點(diǎn),將值 SegByte 作為其返回值。一旦你開(kāi)始編寫(xiě)提供返回值的函數(shù),它就是一個(gè)重要的技術(shù)。請(qǐng)注意,SegByte 已在程序清單的早期聲明為函數(shù)原型的一部分。
將一個(gè)七段顯示器連接到 mbed 并執(zhí)行程序示例 6.1。七段 LED 顯示屏的接線圖如前面第 1 部分的圖 3.10 所示。驗(yàn)證顯示屏輸出是否連續(xù)從 0 計(jì)數(shù)到 9,然后重置回 0。通過(guò)交叉引用流程圖和偽代碼確保您了解程序的工作原理先前顯示的設(shè)計(jì)。
函數(shù)重用
現(xiàn)在我們有了將十進(jìn)制值轉(zhuǎn)換為七段顯示字節(jié)的函數(shù),我們可以毫不費(fèi)力地使用多個(gè)七段顯示來(lái)構(gòu)建項(xiàng)目。例如,我們可以通過(guò)簡(jiǎn)單地定義其 mbed BusOut 聲明并調(diào)用與之前相同的 SegConvert() 函數(shù)來(lái)實(shí)現(xiàn)第二個(gè)七段顯示(圖 6.6 )。
只需將主程序代碼修改為程序示例 6.2中所示的代碼,就可以實(shí)現(xiàn)一個(gè)從 00 計(jì)數(shù)到 99 的計(jì)數(shù)器程序。請(qǐng)注意,在此程序中還需要復(fù)制(重用)先前在程序示例 6.1 中定義的 SegConvert( ) 函數(shù)例子。另請(qǐng)注意,使用的編程方法略有不同;這里我們使用兩個(gè) for 循環(huán)來(lái)計(jì)算每個(gè)十位和單位值。
使用兩個(gè)七段顯示器,引腳連接如圖 6.6 所示,執(zhí)行程序示例 6.2 并驗(yàn)證顯示器輸出從 00 連續(xù)計(jì)數(shù)到 99 然后重置回 0?;仡櫝绦蛟O(shè)計(jì)并熟悉用于計(jì)數(shù)十位的方法和個(gè)位數(shù)字,每個(gè)數(shù)字從 0 到 9。
更的程序還可以從主機(jī)終端應(yīng)用程序讀取兩個(gè)數(shù)值,并將這些數(shù)值顯示在連接到 mbed 的兩個(gè)七段顯示器上。因此,根據(jù)用戶按鍵的要求,該程序可以顯示 00 到 99 之間的任何整數(shù)。
示例程序設(shè)計(jì)使用四個(gè)函數(shù)來(lái)實(shí)現(xiàn)主機(jī)終端在七段顯示器上的輸出。四個(gè)函數(shù)如下:
SegInit( ) e 設(shè)置和初始化七段顯示HostInit( ) e 設(shè)置和初始化主機(jī)終端通信GetKeyInput( ) e 從終端應(yīng)用程序獲取鍵盤(pán)數(shù)據(jù)SegConvert( ) 將十進(jìn)制整數(shù)轉(zhuǎn)換為七段顯示數(shù)據(jù)字節(jié)的函數(shù)。我們將使用 mbed 通用串行總線 (USB) 接口與主機(jī) PC 和兩個(gè)七段顯示器進(jìn)行通信,就像之前的練習(xí)一樣。
現(xiàn)在,我們次遇到使用 ASCII 代碼傳遞鍵盤(pán)數(shù)據(jù)和顯示字符的方法。術(shù)語(yǔ) ASCII 指的是美國(guó)信息交換標(biāo)準(zhǔn)代碼,用于將字母數(shù)字字符定義為 8 位值。每個(gè)字母字符(低位和高位大小寫(xiě))、數(shù)字(0e9)和標(biāo)點(diǎn)字符的選擇都由標(biāo)識(shí)字節(jié)描述,即“ASCII 值”。因此,例如,當(dāng)按下計(jì)算機(jī)鍵盤(pán)上的某個(gè)鍵時(shí),其 ASCII 字節(jié)將傳送到 PC。與顯示器通信時(shí)也是如此。
數(shù)字字符的 ASCII 字節(jié)將高四位設(shè)置為值 0x3,低四位表示按下的數(shù)字鍵的值(0x0 到 0x9)。因此,數(shù)字 0e9 在 ASCII 中表示為 0x30 到 0x39。
要將鍵盤(pán)返回的 ASCII 字節(jié)轉(zhuǎn)換為常規(guī)十進(jìn)制數(shù)字,需要?jiǎng)h除高四位。我們通過(guò)將 ASCII 代碼與位掩碼進(jìn)行邏輯與運(yùn)算來(lái)實(shí)現(xiàn)這一點(diǎn),該數(shù)字的位設(shè)置為 1,我們希望在 ASCII 中保留一個(gè)位,并設(shè)置為 0,我們希望將位強(qiáng)制為 0。在這種情況下,我們應(yīng)用位掩碼 0x0F。邏輯 AND 應(yīng)用運(yùn)算符“&”并出現(xiàn)在以下行中:
返回(c&0x0F);// 應(yīng)用位掩碼轉(zhuǎn)換為十進(jìn)制,并返回
程序示例 6.3中顯示了示例函數(shù)和程序代碼。
再次,應(yīng)添加函數(shù) SegConvert( ),如程序示例 6.1 所示,以編譯程序。
-
解鎖代碼重復(fù)使用!本田被曝安全漏洞,黑客可遠(yuǎn)程解鎖甚至啟動(dòng)汽車2022-07-14
-
游戲規(guī)則悄然發(fā)生變化,汽車公司深陷“代碼”牢籠2022-06-29
-
開(kāi)源AEB代碼,理想汽車意在何為?2022-06-24
-
寶馬召回3561輛進(jìn)口汽車,控制串聯(lián)泵的相關(guān)軟件程序存在安全隱患2021-08-20
-
百度公開(kāi)“車機(jī)小程序測(cè)試”相關(guān)專利,中興通訊公開(kāi)“自動(dòng)停車方法”相關(guān)專利2021-06-30
-
寶沃汽車將進(jìn)入破產(chǎn)程序2021-06-21
-
中國(guó)電動(dòng)汽車初創(chuàng)公司拜騰德國(guó)子公司進(jìn)入臨時(shí)破產(chǎn)管理程序2021-04-27
-
如何將增量式PID公式轉(zhuǎn)化為程序?2021-01-30
-
寧德時(shí)代全球蟬聯(lián)冠軍;2020年建成47座加氫站;LG新能源將啟動(dòng)上市程序......2021-01-24
-
氫燃料電池汽車再獲利好;國(guó)網(wǎng)充電設(shè)施控制程序升級(jí)2021-01-04
-
國(guó)網(wǎng)北京充電設(shè)施控制程序升級(jí) 充電至95%將自動(dòng)停機(jī)結(jié)算2020-12-29
-
特斯拉被曝程序漏洞:旗下充電樁成“免費(fèi)設(shè)施”2020-09-18
-
國(guó)務(wù)院提出優(yōu)化新能源車審批發(fā)布程序;第335批新車公示發(fā)布;特斯拉全系車型定金下調(diào)至1000元......2020-07-24
-
國(guó)務(wù)院提出優(yōu)化新能源車審批發(fā)布程序2020-07-22
-
國(guó)務(wù)院:2020年底前優(yōu)化新能源車審批發(fā)布程序2020-07-22