《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 解決方案 > 抑制嵌入式系統(tǒng)設(shè)計的復(fù)雜性

抑制嵌入式系統(tǒng)設(shè)計的復(fù)雜性

Lucio Di Jasio
2019-09-23
來源:Microchip

簡介

Raspberry Pi系列不久前通過全新的Raspberry Pi Zero W1(2017年2月)擴充了產(chǎn)品線,這是一臺支持無線連接的個人計算機,售價僅10美元,。對于業(yè)余愛好者、制造商,、工匠和黑客而言,它的意義非同尋常,。是的,,我們之中很少有人真正嘗試做好我們的工作,即設(shè)計真正的(電子)產(chǎn)品!當我最近觀看Eben Upton的視頻公告時,,我忍不住想起早年的經(jīng)歷,。那是80年代中期,我買不起B(yǎng)BC電腦,,也負擔(dān)不起奢侈的Amiga。但我花光所有的錢購買了Sinclair ZX Spectrum,。因此,,Eben努力實現(xiàn)“讓所有人都買得起”的目標確實讓我產(chǎn)生了共鳴。

一臺功能強大的個人計算機塞進一塊小巧的印刷電路板(PCB)上,,確切地說是6 x 3 cm的印刷電路板,,達到這種小尺寸的新記錄著實讓我驚嘆。經(jīng)過進一步思考,,我經(jīng)常想弄清楚是否正是Spectrum的簡約及其諸多限制促使我深入研究計算機并最終沉醉于這一奇妙領(lǐng)域——軟件和硬件之間的邊界,,我們今天稱之為嵌入式。

小型片上系統(tǒng)

Raspberry Pi Zero設(shè)計基于片上系統(tǒng)(SoC)(BCM2835),,其中包括一個1 GHz ARM?內(nèi)核和一個圖形處理單元(GPU),、一個視頻接口、多個串行接口(USB,、UART,、SPI和I2C)以及一個外部存儲器接口,用于管理運行Linux?操作系統(tǒng)(OS)所需的大容量RAM(512 MB DDR2)和大容量存儲卡(SD卡),。對于單芯片器件來說,,這些都是令人印象深刻的功能,特別是與我年輕時看到的早期個人計算機相比,。我們可能會爭辯,,與目前在各種嵌入式控制應(yīng)用中常用的最新簡單型單片機相比,這并非不成比例,。雖然時鐘速度和處理能力都要低得多(從10 MHz到100 MHz不等),,但今天所有小型單片機本身都是真正的小型片上系統(tǒng)奇跡。正如您對單片機期望的那樣,,所有RAM和閃存都位于芯片上,。存在串行接口(USB、UART,、SPI和I2C),,但也集成了所有電源調(diào)節(jié)和電壓監(jiān)控電路。片上通常有五個或更多不同的(精密)振蕩器,,以便獲得更大的靈活性并控制功耗,。此外,還有幾個具有大輸入/輸出多路開關(guān)的模擬外設(shè)(ADC、DAC,、運算放大器和模擬比較器......),,取代了Raspberry Pi幻想視頻中的功能,一直以來反映出偏愛嵌入式超過計算的設(shè)計選擇中的顯著不同,。

事實上,,當Raspberry Pi用戶需要與現(xiàn)實世界連接時,對于使常用LED閃爍等最平和I/O應(yīng)用以外的應(yīng)用而言,,由更小的單片機(實際上通常為8位單片機)通過“帽子”(小型子板)提供必要的I/O接口和所需電壓轉(zhuǎn)換并不意外,。

我不想在兩個截然不同的世界之間將這種不公平的對比一直拖下去,但我必須指出,,在支持開發(fā)人員方面,,兩者有一個共同關(guān)注的問題:“控制復(fù)雜性”,最終“吸引新用戶”,。毋庸置疑,,它們的解決方案類似,但終究有所不同,。

這兩個平臺都是由提供免費軟件工具開始,,包括集成開發(fā)環(huán)境(IDE)、編譯器,、鏈接器,、模擬器、調(diào)試器(在專業(yè)版中提供,,只需少量費用),、或多或少的開放式中間件和(RT-)OS以及一小部分硬件(板)選項。

兩個陣營(嵌入式計算和通用計算)之間的差異比您想象的要小,。兩者最終都依賴于類似的(如果不相同)工具鏈,,這些工具鏈大部分都基于GNU。在中間件級別,,一旦您正確抽取下級(下至金屬)驅(qū)動程序?qū)?,開源選項會再次變得極其相似。操作系統(tǒng)級別的差異最大,,因為許多單片機將很愿意運行RTOS,,但無法承受完整Linux內(nèi)核的負擔(dān)。這反映了真正的行業(yè)差異,。實時是操作系統(tǒng)“工作說明”的一部分,。

膨脹

查看文檔時會發(fā)現(xiàn),兩者的復(fù)雜度在膨脹,。我最喜歡的一個例子是基于流行8位PIC?架構(gòu)的小巧而簡單的單片機,。PIC16F1619經(jīng)常用于控制小家電,為此,它將小容量閃存(16 KB)封裝在20引腳微型封裝中,,具有十幾個數(shù)字外設(shè)接口和幾乎同樣多的模擬支持模塊,。其數(shù)據(jù)手冊長達650頁,之后還增加了特性數(shù)據(jù),、表和圖2,。

此小型SoC上提供的一些外設(shè)(例如信號測量定時器)需要長達50頁的篇幅才能適當記錄。這幾乎是描述實際PIC內(nèi)核及其整個指令集所需頁數(shù)的兩倍,。

在Raspberry Pi方面,,如果只是按比例放大(10倍),則問題類似,,因為有多個數(shù)據(jù)手冊需要考慮,每個數(shù)據(jù)手冊只記錄片上系統(tǒng)硬件組件的一部分(SoC外設(shè),、GPU和內(nèi)核),,內(nèi)核單獨占用超過750頁的篇幅。

嵌入式軟件架構(gòu)

很明顯,,沒有人能夠閱讀或跟上如此龐大的信息量,。特別是嵌入式開發(fā)人員,他們總是承擔(dān)著極大的壓力,,需要在更短的時間內(nèi)完成應(yīng)用,,以實現(xiàn)最快的產(chǎn)品上市速度。常見的解決方案是使用分層架構(gòu)對應(yīng)用進行分區(qū),,并使用標準化外設(shè)庫來抽取硬件詳細信息,。這些層可以整齊地形成協(xié)議棧,其中“應(yīng)用”位于硬件抽象層(HAL)的頂部,。實際上,,可以進一步細化此圖片來完全識別HAL,HAL上方的中間件層將負責(zé)實現(xiàn)諸如網(wǎng)絡(luò),、文件系統(tǒng)和圖形UI(如果存在/需要)一類的通用服務(wù)/功能,。

11.jpg

圖1:嵌入式應(yīng)用的軟件協(xié)議棧 

注:通常通過從HAL分離驅(qū)動程序?qū)雍碗娐钒逯С謱觼磉M一步細化協(xié)議棧,但是在以下考慮中,,我們不需要詳細到這種程度,。

此軟件架構(gòu)直接來源于“計算”領(lǐng)域,可以很好地對大多數(shù)通用案例進行建模,。遺憾的是,,由于它適用于嵌入式應(yīng)用,因此有兩個基本缺點:

·         只要重點放在頂層中間件層提供的標準功能上,,分層架構(gòu)就可以簡化文檔篇幅過長的問題,。在應(yīng)用范圍的底端,當中間件層(如果存在)非常薄時,結(jié)果大多比較模糊,。開發(fā)人員必須依賴以大型應(yīng)用編程接口(API)形式存在的HAL文檔,,這份材料的篇幅同樣較長(可達數(shù)千頁),但始終未真正研究器件的任何細節(jié),。出現(xiàn)問題時,,他/她將身陷窘境或被迫深入研究陌生領(lǐng)域和大量代碼。

·         HAL層為支持標準中間件服務(wù)提供了巨大幫助,,但由于其性質(zhì)極其嚴格,,因此最終會清除特定器件的任何獨特差異化功能。否則,,這些獨特功能可以為特定應(yīng)用提供技術(shù)優(yōu)勢,,并且可能成為選擇特定器件型號的原因。

·         在應(yīng)用范圍的頂端,,中間件層非常厚,,例如Raspberry Pi,僅Linux OS內(nèi)核就添加了數(shù)百萬行代碼來應(yīng)對問題3,。雖然可以說這是開源代碼,,但對于希望自己永遠不必深入了解到如此程度的普通開發(fā)人員而言,它幾乎無法帶來安慰,。

讓計算機盡其所能,!

最終,Raspberry Pi開發(fā)人員將能夠依靠“計算”性能帶來的巨大收益和小電路板提供的大量資源,。標準Linux操作系統(tǒng)的便利性遠不止彌補API的復(fù)雜性和廣泛性,。

我最關(guān)心的是全新小型SoC的開發(fā)人員:現(xiàn)代單片機用戶。對于他們而言,,使用標準化HAL的好處減少了,,因為性能存在損失,而且堆疊軟件架構(gòu)使獨特的功能變得單一,。

用于快速開發(fā)的新一代軟件工具代表了擺脫這一難題的巧妙方式,。這是最近出現(xiàn)在嵌入式控制市場中的一種新型代碼生成器或配置器。盡管最初時持有明顯(但通常合理)的懷疑態(tài)度,,但事實證明,,這些工具不僅有效,對于任何嚴格的嵌入式開發(fā)人員也必不可少,。

我們發(fā)現(xiàn)的顯著特征包括:

-          完全集成在常見的IDE中,,這有助于其了解項目上下文:型號(器件編號)選擇和中間件庫感知。

-          支持獨特和復(fù)雜的外設(shè),。例如,,先前示例中提到的信號測量定時器(SMT)可以在單個頁面/對話框中直觀地呈現(xiàn)給用戶,,其中僅包含少數(shù)滾動列表、復(fù)選框和一些直觀選項,。有關(guān)來自Microchip的PIC單片機的旗艦快速開發(fā)工具MPLAB?代碼配置器(MCC)4的屏幕截圖,,請參見圖2。

10.jpg

圖2——MPLAB代碼配置器:信號測量定時器選項

-          利用模板引擎,,將配置選項轉(zhuǎn)換為一小部分完全自定義的函數(shù),。這意味著只需通過少量待學(xué)習(xí)的函數(shù)以及一致且直觀的命名約定便可生成最小API。函數(shù)定制保證大多數(shù)硬件抽象是在編譯時(實際上在編譯前)靜態(tài)執(zhí)行的,。這有助于減少傳遞到每個函數(shù)所需的參數(shù)列表,,從而提高性能和代碼密度。有關(guān)MPLAB代碼配置器的典型簡約用例,,請參見列表1,。

-          輸出由非常短的(C語言)源文件組成,這些源文件可由用戶全面檢查(可將其作為一次學(xué)習(xí)機會),,但也會經(jīng)過專家進一步手動優(yōu)化?,F(xiàn)代化的代碼生成器將其代碼與用戶代碼靈活地混合,既可保持完整性,,也允許充分利用寶貴的高級硬件功能,。

void SMT1_Initialize(void) {

    // CPOL rising edge; EN enabled; SPOL high/rising edge enabled; SMT1PS 1:1 Prescaler; …

    SMT1CON0 = 0x80;

    // SMT1MODE Counter; SMT1GO disabled; SMT1REPEAT Single Acquisition mode;

    SMT1CON1 = 0x08;

    // SMT1CPRUP SMT1PR1 update complete; SMT1TS not incrementing; RST SMT1TMR1 update complete …

    SMT1STAT = 0x00;

    SMT1CLK = 0x00;            // SMT1CSEL FOSC;

    SMT1WIN = 0x00;            // SMT1WSEL SMTWINx;

    SMT1SIG = 0x00;             // SMT1SSEL SMTxSIG;

    SMT1PRU = 0x00;          // SMT1PR16 0x0; 

    SMT1PRH = 0x00;           // SMT1PR8 0x0; 

    SMT1PRL = 0x00;            // SMT1PR0 0x0;

}

 

void SMT1_DataAcquisitionEnable(void) {   

    SMT1CON1bits.SMT1GO = 1;      // Start the SMT module by writing to SMTxGO bit

}

 

void SMT1_SetPeriod(uint32_t periodVal) {

    // Write to the SMT1 Period registers

    SMT1PRU = (periodVal >> 16);

    SMT1PRH = (periodVal >> 8);

    SMT1PRL = periodVal;

}

列表1——由MCC生成,、用于配置SMT外設(shè)的源文件(smt1.c)部分

從根本上說,,代碼配置器/生成器可將“計算機”執(zhí)行的操作做到最好。構(gòu)建HAL是硬件外設(shè)配置重復(fù)且容易出錯的階段,,通常會導(dǎo)致在數(shù)據(jù)手冊中花費大量時間進行乏味的搜索,,現(xiàn)在,這一階段現(xiàn)已然消失或顯著縮短,,只留下一些更加趣味橫生,、啟發(fā)思維的探索與創(chuàng)造時間。

事實上,,用戶可以從同一個用戶界面了解特定的硬件外設(shè)功能,,從根本上消除(或至少極大減少)對數(shù)據(jù)手冊的需求。

硬件抽象層成為項目的靈活部分,,實際上可以根據(jù)需要頻繁,、快速地重新生成,從而優(yōu)化應(yīng)用性能,。

十(二進制)行代碼

處理完(外設(shè))配置后,,可將注意力立即集中到應(yīng)用上,這是設(shè)計中更智能的部分(在應(yīng)用層上),,這一部分位于“主循環(huán)”之內(nèi),,而不是之前,。

最后要說的是,憑借代碼生成器,,即使在嵌入式領(lǐng)域中,,經(jīng)典的“Hello World”示例(總是轉(zhuǎn)換為使LED閃爍)也會成為令人耳目一新的兩行代碼練習(xí)! 

    LED_Toggle();

    __delay_ms(500);

列表2——為創(chuàng)建第一個嵌入式“Hello World”而需要輸入的短短兩行代碼  您將能夠在我最近出版的書中找到(20個)更多關(guān)于同樣有效利用快速開發(fā)工具的實例:“In 10 Lines of Code”5,。

對抗復(fù)雜性

在小型單片機發(fā)展成為小型SoC或者個人計算機縮小為Raspberry Pi的過程中,,不僅會浪費時間和造成認知負擔(dān),還會在我們操作無法完全理解/掌握的系統(tǒng)時引入漏洞,。

復(fù)雜性不是技術(shù)進步的必然結(jié)果?,F(xiàn)代化的代碼配置器/生成器可以通過擴展我們的軟件開發(fā)流程、實現(xiàn)自動化并最終恢復(fù)我們對快速增長的可用功能/選項數(shù)量的掌握來幫助我們,。

個人簡歷  

Lucio Di Jasio是Microchip的EMEA業(yè)務(wù)開發(fā)經(jīng)理,。過去18年來,他一直在公司8位,、16位和32位部門擔(dān)任各種技術(shù)和營銷職位,。作為一位固執(zhí)己見的多產(chǎn)技術(shù)作家,Lucio發(fā)表了大量文章和多部有關(guān)嵌入式控制應(yīng)用編程的書籍,。憑借對飛行的熱情,,他獲得了FAA和EASA私人飛行員執(zhí)照證書。


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章,、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者,。如涉及作品內(nèi)容,、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,,以便迅速采取適當措施,,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118,;郵箱:[email protected],。