抑制嵌入式系統設計的復雜性

      2019-09-23 07:40:00 來源:EEFOCUS
      標簽:

      簡介 

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

       

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

       

      小型片上系統

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

       

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

       

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

       

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

       

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

       

      膨脹

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

       

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

       

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

       

      嵌入式軟件架構

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

       

      圖1:嵌入式應用的軟件協議棧

       

      注:通常通過從HAL分離驅動程序層和電路板支持層來進一步細化協議棧,但是在以下考慮中,我們不需要詳細到這種程度。

       

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

       

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

       

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

       

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

       

      讓計算機盡其所能!

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

       

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

       

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

      我們發現的顯著特征包括:

       

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

       

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

       

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


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

       

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

       

      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外設的源文件(smt1.c)部分

       

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

       

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

       

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

       

        十(二進制)行代碼

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

       

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

       

          LED_Toggle();

          __delay_ms(500);

       

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

       

      對抗復雜性

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

       

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

       

      鏈接

      1-  RaspberryPi ZeroW公告。https://www.raspberrypi.org/blog/raspberry-pi-zero-w-joins-family/

       

      2-  PIC16F1619數據手冊。http://microchip.com/pic16f1619

       

      3-  Linux內核中的代碼行。https://arstechnica.com/business/2012/04/linux-kernel-in-2011-15-million-total-lines-of-code-and-microsoft-is-a-top-contributor/

       

      4-  MPLAB代碼配置器。http://microchip.com/mcc

       

      5-  In 10 Lines of Code。http://blog.flyingpic24.com/10lines 

       

      個人簡歷  

      Lucio Di Jasio是Microchip的EMEA業務開發經理。過去18年來,他一直在公司8位、16位和32位部門擔任各種技術和營銷職位。作為一位固執己見的多產技術作家,Lucio發表了大量文章和多部有關嵌入式控制應用編程的書籍。憑借對飛行的熱情,他獲得了FAA和EASA私人飛行員執照證書。您可以在他的博客上閱讀更多關于Lucio最新書籍和項目的信息:http://blog.flyingpic24.com

       
      關注與非網微信 ( ee-focus )
      限量版產業觀察、行業動態、技術大餐每日推薦
      享受快時代的精品慢閱讀
       

       

      繼續閱讀
      手把手教你老工程師的秘技:在幾秒鐘內快速估算走線的電阻值
      手把手教你老工程師的秘技:在幾秒鐘內快速估算走線的電阻值

      我們通常需要快速地估計出印刷電路板上一根走線或一個平面的電阻值,而不是進行冗繁的計算。雖然現在已有可用的印刷電路板布局與信號完整性計算程序,可以精確地計算出走線的電阻,但在設計過程中,我們有時候還是希望采取快速粗略的估計方式。

      Nano Dimension向中國科學院 - 香港城市大學機器人學聯合實驗室出售DragonFly LDM增材制造

      全球領先的增材電子供應商 Nano Dimension Ltd.(納斯達克、特拉維夫證券交易所股票代號:NNDM) 今天宣布已將 DragonFly 無人值守數字化電子制造(LDM)系統出售給香港城市大學(城大是一間位于香港九龍的大學,在2020年 QS 世界大學排名第52)。

      嵌入式系統基本核心不能忘,ARM 是如何構架的?
      嵌入式系統基本核心不能忘,ARM 是如何構架的?

      目前在嵌入式開發的過程中,開發者往往把大量精力投入到嵌入式微處理器MPU(Micro Processing Unit)與眾多外設的連接方式以及應用代碼的開發之中,而忽視了對嵌入式系統最基本、最核心部分的研究。

      嵌入式A7平臺AWTK性能實測

      為了比較直觀的看到AWTK的基本性能,我們對產品開發者比較關心GUI的一些參數做了測試,如界面刷新幀數、啟動時間等。讓我們從參數上直觀了解Linux下AWTK與Qt的性能對比。

      導通孔、盲孔、埋孔、鉆孔等,這些PCB中的“孔”你都知道是怎么回事嗎?
      導通孔、盲孔、埋孔、鉆孔等,這些PCB中的“孔”你都知道是怎么回事嗎?

      電路板的導通孔必須經過塞孔來達到客戶的需求,在改變傳統的鋁片塞孔工藝中,電路板板面阻焊與塞孔利用白網完成,使其生產更加穩定,質量更加可靠,運用起來更加完善。

      更多資訊
      不支持iOS 13更新的設備還能再戰幾年?蘋果為舊設備推出專用系統更新
      不支持iOS 13更新的設備還能再戰幾年?蘋果為舊設備推出專用系統更新

      與非網9月27日訊,蘋果這次良心了,給不支持升級iOS13系統的舊設備推送了系統更新。

      國產安卓機即將告別安卓煩人推送?安卓統一推送聯盟確認部分工作已經開發完成

      與非網9月25日訊,安卓APP的信息推送機制常常被用戶詬病,而安卓統一推送聯盟現在有望解決這一問題。

      ARM:華為海思是長期合作伙伴,后續架構可以繼續向華為授權

      與非網9月25日訊,近日,ARM重申了與華為海思的合作關系。

      抑制嵌入式系統設計的復雜性

      Raspberry Pi系列不久前通過全新的Raspberry Pi Zero W1(2017年2月)擴充了產品線,這是一臺支持無線連接的個人計算機,售價僅10美元。

      受已知漏洞影響:美國防部建議蘋果用戶跳過iOS 13.0版軟件更新

      與非網9月20日訊,北京時間今天凌晨,蘋果正式向 iPhone 用戶推送 iOS 13 正式版的系統更新。

      金博棋牌