【說在前面的話】
作為一個以“思維”為內容的討論,我并不懼怕話題的龐大。畢竟思維并不是什么可以速成的快餐,俗語說冰凍三尺非一日之寒,著急不來;另一方面,“思維”是個頗為唯心的內容,不僅沒有定論,針對每個人的具體情況也是不同的。所以,我并不害怕談論思維的時候“歪了樓”,或者“缺乏客觀性”——本來,裝在一個皮囊里,我能談論的也只是我自己的思維,供有興趣的看官們消遣一二,如果還能有所啟示或者是幫助,那就再好不過了。
模仿人的認知過程,我也將話題分為“自上而下”(對應Top Down Perception)和“自下而上”(對應Bottom Up Perception)兩個方向。前者從較為宏觀(但更貼近生活和概念的本來面目)出發,討論一些裸機系統相關的嵌入式概念和看似高大上其實很實在的說法;后者則選擇從具體的技術或者是設備出發,從小的問題開始,逐步引出更為復雜的問題。
最終,在某個時刻,你會在某個層面上發現兩個認知方向的重合點,我可以保證的是,幾乎對所有人來說,這個重合點都是不同的。排除智商的因素,起決定性的還是讀者已經掌握的背景知識。
為用而專
【正文】
作為開篇,我們首先對"什么是嵌入式系統"的認識開始。那么什么是嵌入式系統呢?我首先保證,下面的定義已經非常精簡,一個多余的單詞都沒有(請允許我在一個完整的句子中加入空格來強調每一個要素):
嵌入式系統是面向應用高度裁減的專用計算機系統
1、“專用”
首先我們需要牢記于胸的是這個“專”字(Dedicated),這是相對通用計算機系統的“通用”來說的。PC就是通用計算機系統;出乎很多人意料的是,智能手機也是“通用”計算機系統。這是因為,通用計算機系統擁有標準的硬件定義和操作系統,上層軟件可以在一個統一的平臺(對硬件和系統軟件統一性)的一個假設上進行開發。這么說也許很抽象,實際的判斷標準其實很簡單,如果一個計算機系統的軟件可以自由的直接在同類計算機的硬件上執行,那么這個計算機系統很可能就是一個通用計算機系統,例如,APP可以在不同的智能手機上執行(當然需要運行相同的操作系統,無論是Andriod還是iOS,具體你懂得,抬杠的同志請自動取消關注)
這個專用太重要了,如果說嵌入式系統是一個宇宙的話,那么這里的“專用”就是那個著名的宇宙大爆炸——嵌入式系統一切的特點都源自于此。
2、“面向應用”
光說專用,似乎缺少了什么——“專用”總需要面向點什么才能體現“專用”啊。因此,很自然的,“面向應用”的“專用”就成了嵌入式系統的根本立足點。那么你要問了,難道還有不“面向應用”的“專用”么?當然有了,有面向“科研”的,面向“宣傳效應的”,有“面向自我實現”的……
面向科研認真說來也算是面向應用了——科研應用嘛,但其實還是不同的,因為后面我們會說,嵌入式系統的開發是一個工程問題,而科研類的開發是一個學術問題,前者是用成熟的技術去實現一個明確的已知目標,后者是用已知的技術去探索未知的領域或者驗證可能的結果
面向宣傳,你懂得。沒什么卵用,但是可以給人希望和信心。
面向自我實現,有多少人自己寫一個操作系統是面向應用的?
嵌入式系統是面向應用的專用計算機系統。那么應用又大體分兩類:軍用和民用。這么分有什么目的呢?
3、“高度裁剪”
前面我們說,專用是面向應用的專用,目標非常明確——實現某個具體的應用;相對目標不是那么明確的通用計算機系統來說,怎么做才能體現出“針對某個具體應用”而凸現出來的“專用”呢?當然是裁減——從能實現對應應用的通用計算機原形系統(Prototype)上進行裁減——去掉不必要的部分,從而成為某個應用的“專屬”計算機系統。
那么問題來了,哪些東西可以裁減呢?如何裁減呢?這里實際上是有明確的標準的——面向應用的具體需求進行裁減。具體來說,雖然功能性(Functionality)、成本(Cost)、可靠性(Dependability / Reliability)、功耗(Power Consumption)、體積(Size)、性能(Performance)、安全性(Security)都是各類嵌入式系統所追求的,但當我們成本有限的時候(時間、金錢、人力資源),我們只能根據應用的偏好來分配資源,俗話說“好鋼用在刀刃上”就是這個道理。
容易想象,軍用在上述要素的優先級可能是(僅供參考):
功能性 〉可靠性 〉體積 〉性能 〉安全性 〉功耗 〉成本
——想象一下不差錢的軍方會怎樣考慮一套單兵作戰系統
用在裁減的過程中則可能是另外一個樣子:
功能性 〉性能 〉體積 〉成本 〉功耗 〉可靠性 〉安全性
——想象一下國產智能手機(粗糧、某族、某情懷)
【小結】
綜上所述,我們可以簡單的小結一下,嵌入式系統是一個面向應用高度裁減的專用計算機系統——是不是覺得都是廢話了?哈哈哈哈,說明你理解了。下一篇,我們將更深層次的揭示隱藏在嵌入式系統名稱下的產業秘密和規律。
真正的軟硬件
【正文】
當被人問起“什么是嵌入式系統”時,無需看過我的文章,有一種狡猾的說法肯定是挑不出任何錯誤的——套用知乎上一類著名的問答體,“如何快速的假裝/成為某個領域的專家”——你可以故作認真的說:
“嵌入式系統首先是一個計算機系統”,然后大談你對軟件和硬件的看法……
為了在幾乎沒有逼格的行業中讓大家能夠有機會裝逼,下面我就教大家一種關于嵌入式系統軟件和硬件的特別觀點,絕對可以讓所有的小師妹小師弟甚至是同齡人偷來“刮目相看”的眼光。當然首先你要真的理解這種說法。
為了引起更多人的注意,同時讓話題更有沖擊性,你應該非常肯定、神秘、恨鐵不成鋼而又憤慨的宣布一個觀點:
“你知道么?嵌入式系統中幾乎所有人關于軟件和硬件的看法都是錯誤的……我們被教科書給坑了!”
1、傳統計算機系統中的“軟件/硬件”觀
通常,我們提到計算機硬件,腦海里立馬浮現的就是一臺PC主機,當然這個時候你要特別小心,因為這個時候你舉出的例子很可能是暴露年齡或者逼格的。比如,用臺式機舉例還是用筆記本舉例顯然暴露年齡,用Windows筆記本舉例還是Mac舉例將暴露逼格。當我們提到軟件,腦海里浮現的差不多就是Windows上跑著的各類軟件,當然,如果你能用APP,特別是iOS的APP來舉例,顯然就是很有面子的。
是的,細心的你注意到了,傳統的軟硬件觀念直接來源于通用計算機。在后面的討論中我們會發現,這種由通用計算機帶來的思維定勢是非常可怕的。
2、嵌入式系統中的“軟/硬件”觀
嵌入式系統中的軟件和硬件并不是你想象的那么簡單。這其實很好理解,你可以在大學校園里隨便攔下幾個學生,讓我們來做一個采訪,問問他們什么是軟件什么是硬件:
屌絲A(計算機學院):你丫有病么?硬件就是你的電腦主機咯,主板、CPU、內存硬盤、顯卡什么的;軟件就是Windows程序咯
屌絲B(信息學院):硬件就是單片機啊,51、AVR、STM32之類的,對了,還有開發板也算吧?軟件嘛,就是Firmware咯(固件),過去用匯編開發,現在都是用C了
屌絲C(信息學院):毛線!我還可以用VHDL和Verlog寫一個內核呢,你說說VHDL和Verilog寫出來的是不是軟件?FPGA是不是硬件?
屌絲B:呃……那咋辦?
屌絲D(計算機學院):你們別忘了,開發板上跑的虛擬機也是硬件哦,虛擬機上用Java寫的程序也是軟件。
大家可能注意到了,在嵌入式系統中,軟件和硬件是一個不那么靠譜的定義方式——當人們用普通話發相同的聲音說同一個詞語的時候,描述的可能根本不是同一個東西。那么,嵌入式系統中,軟件和硬件應該如何理解呢?
方案一 . 要么,你可以假裝從來沒有看過這篇文章,只跟你用相同系統的人討論問題,或者“自己根據語境”自動切換軟件和硬件的意思。
方案二 . 要么,我們重新定義一下軟件和硬件的概念,只要這個概念兼容原有的理解方式就可以了。
真有一種兼容老概念的新定義么?答案是肯定的。讓我們來首先找一找在不同層面上軟件的共同點:大家都是用一種語言(Java、C、VHDL、甚至是原理圖)來描述自己大腦中的邏輯(思維)。讓我們來體會一下這個特點,是不是這么個特點?因此,我們重新鄭重的定義一下軟件:
軟件:人們借助某種語言,“嘗試”固化下來的,自己的思維
與之相對,硬件的概念可以修改為:
硬件:業已固化下來的邏輯,可以穩定的提供確定的服務和功能
可見, 軟件的本質是思維,是設計人員的思維 ,因而程序設計人員最重要的是自己 根據任務的需求想通所有的邏輯,并借助一定的語言作為工具,把自己的思維"固化"下來 。這個思維的過程叫做"設計(Design)"、這個固化的過程叫做"編碼(Coding)"。簡單的說,寫代碼只是一個思維翻譯的過程,更重要的是首先寫程序的人要想清楚,擁有清晰的思維,然后借助準確無誤的語言表達能力(很遺憾,很多人語言表達能力非常有限——就是用C語言寫不出自己想要實現的功能)才能寫出正確的代碼。
思維的設計有很多輔助工具,如大家熟知的流程圖(Flow Chart)、UML圖、還有大家不太用的數據流圖(Data Flow Diagram)等等。然而,具體代碼往往并不是一個好的輔助工具。進行思維設計的開發人員,叫做Programmer。
將Programmer的設計文檔(各類圖表)翻譯成具體程序代碼的人叫做Coder。
說殘酷一點:Programmer設計,負責思考;Coder翻譯,負責干苦力。如果你不服,我也沒辦法,哈哈哈哈……
**硬件,本質上一個固化下來的邏輯。**這個邏輯的前身當然是思維,只不過它被固化下來了,而且可以"穩定"可靠的提供"確定"的功能和服務。比如,FIFO是隊列,在某些軟件系統中把這種邏輯確定的模塊叫做"構件"(Component),一種中性化的描述,并不強調它是軟件還是硬件。因為構件的本質是一個模塊,是一個可以提供"確定"的,大家都知道的功能的模塊。它可以是硬件的,也可以是軟件的。Who care?有的系統還會提供硬件抽象層,進一步模糊這類模塊的軟硬屬性——反正你知道它是做什么的就行了,反正它很可靠,而且可以重復利用,所以你用就好了,是軟的還是硬的,無所謂,反正都是同一個API。
當我們想凸顯一個模塊的邏輯、確定性和穩定性,而又不能或者不需要或者不關心它的軟硬屬性的時候,我們就干脆叫他構件(Component)。
重新定義軟件和硬件的概念,不是一個文字游戲,而是一個行業內在心底里約定俗成已經默默在做的事情,只是,今天被明確的點破了而已。雖然你覺得被刷了三觀(也許你沒有),但仔細想想,其實的確和過去的認識沒有本質上的區別?
不是么?其實你早就懂對么?哈哈哈哈——我沒有重新發明軟件或者硬件,我只是誠實的搬運工。
重力和沉淀
【正文】
嵌入式(Embedded),聽起來也許是一個很有點科技感的名詞,加之最近大熱的所謂物聯網(IoT)、智能硬件,似乎從事嵌入式開發很有點逼格的感覺——沒錯,在上世紀70年代,大洋彼岸的很多Freaks們也是這么想的,他們中的很多人已經印刷在各類書籍的封面上了。
不幸的是,嵌入式只是一門技術,而不是什么科學。嵌入式系統開發只是一個工程問題,而不是什么讓人側目的科學探索問題——除了針對越來越小的半導體工藝問題的研究。認清這個現實吧!趁我揭露另外一個事實之前,還來得及。
也許你還記得,嵌入式系統是專用計算機系統,是面向特定的應用需求而進行高度裁減的專用計算機系統。成本、體積、性能和可靠性對嵌入式系統來說都是敏感的?一個計算機系統如何才能在成本、體積、性能和可靠性上同時取得進步呢?
Bingo!你答對了,摩爾定律。換句話說——嵌入式系統使用的都是“成熟”的技術、都是“量產”的、“成本敏感”的——或者說過時的技術。如果你對這個結論有疑惑,請按照相反的順序去理解這兩段文字。
——“思維不是不可說,是不必多說,懂就是懂。”
現在的計算機技術差不多領先嵌入式技術大約20年,現在嵌入式系統無論在資源上、理論上還是方法論上,都與上世紀80年代的計算機前沿技術相當。舉一個簡單的例子,現在的Processor完成了從匯編開發到C語言開發的過渡,正在普及面向對象開發的概念——這是資源所決定的。而這一過程,正是上世紀80年代計算機工程師們所面對的環境。只不過這里的對應關系稍微有點不同:32位微控制器(Cortex-M為代表)對應當年的個人電腦,而32/64位的應用處理器(Cortex-A為代表)則對應當年的服務器。其它再無不同。
綜上所述: 嵌入式是一門技術,而不是科學,它的本質決定了它必然要使用成熟或者說過時的技術 。 成本是影響一門技術是否可以在嵌入式系統中應用的決定性因素 ——好東西現在很多都有,只不過太貴,不是做不出來。
在你那“一腔投入嵌入式系統開發的熱血”被澆滅之前,有一個好消息要告訴你:因為嵌入式系統只是一門技術——和木匠活差不多—— 只要你肯花時間,你一定能成為高手 ,或者說成為熟練的工匠——別介意大師這個偽概念,相信我,只要你開源了足夠的代碼,幫助了足夠多的人,大家都會尊你為大師——其實只有你自己知道,這幫人只不過是太懶,知識都在他們懶得翻開的書本上,你只不過堅持看完了,然后順手把自己的筆跡貼在了網上。
感謝你有耐心讀到這里,這說明你除了興趣,對這門技術還有可貴的堅持,為了獎勵這一點,我會介紹一個模型,通過它,你有能力掌握洞悉嵌入式行業發展規律的方法——我通常也總是把好東西留給真正熱愛嵌入式技術的朋友。
沉淀模型
不知道有多少人還記得小學自然課上研究泥土成分的那個實驗:取一塊泥土,放入燒杯中,放入適量的水,用玻棒充分攪拌至懸濁液。將燒杯靜置一小時后觀察會發現:1)燒杯中的液體重新變清;2)泥土樣本會出現分層,質量相似且較大的顆粒沉淀在底層,從底向上,沉淀層中的顆粒質量和體積都越來越小。——這就是沉淀模型。
在你吼出“ 什么gui ”之前,讓我們來講一個故事,一個暴露年齡的故事。在MP3格式和算法剛剛公布的時候,市場被索尼的磁帶隨身聽和CD播放機所統治,兩者分別占據了高端市場和低端市場。在Flash存儲器非常昂貴的背景下,MP3文件的高音質小尺寸的特性簡直就是市場的明日之星——消費者迫不及待的想買到一個體積只有普通隨身體幾分之一,不用重復購買碟片或者磁帶的次世代播放器——想想都很美是么?巨大的市場需求,推動廠商開發出第一代MP3播放器,這個時候,還沒有所謂的硬件解碼,MP3軟件解碼的運算需求使得工程師不得不選擇一塊價格昂貴的處理器,這使得MP3播放器的成本達到了歷史的最高點,但是,WHO CARE?!消費者對這種小巧輕便的高科技產品的熱情,決不亞于現在的iPhone——Oh,別忘記了,One thousand sounds in your poket,就是Apple推廣iPod的經典廣告。
高額的利潤吸引更多的玩家進入這個藍海市場,工程師們漸漸發現,既然MP3解碼算法既然這么流行,我們就做成模塊吧?賣給別的開發者?漸漸的,連開源的MP3解碼模塊也出現了——感謝開源,越來越多的廠商有能力制作和發布自己的MP3播放器——如同華強北的功能手機,銷售一臺MP3播放器的利潤越來越低。在這一過程中,MP3解碼從單純的播放器應用中被第一次提取出來——從應用層沉淀到軟件服務層,成為一個模塊——這是發生在這一嵌入式系統應用中的第一次沉淀。
模塊的出現進一步降低了產品開發的難度和成本,但同時也引入了更多的競爭對手壓低了利潤。工程師們開始面臨從市場傳導而來的成本壓力,大家不得不動腦子。很明顯的,用于軟件解碼的處理器太貴了。實際上,除了解碼,其它應用并不需要這么強大的運算能力。于是,工程師們思考設計專門針對MP3解碼的硬件DSP芯片來取代原有的通用處理器,顯然的,邏輯確定,功能簡單的MP3解碼芯片相對"通用"的處理器,更容易進行裁減并最終降低成本。
——這是”專用”相對“通用”的最大優勢,因為由于目的不確定的“通用“,必須保留大量的邏輯用于確保一定的靈活性,以應對各類不同應用的需求,因此很難對其進行有效的裁減——想想當你預算有限時,買手機或者電腦的時候是如何糾結的吧。而“專用”則目的明確,不需要的都可以大刀闊斧的砍掉,最終結果的輕巧簡潔可想而知。便宜是自然的。
用硬件解碼芯片配合一個低廉的處理器取代原本昂貴的器件是嵌入式系統設計中降低成本的常見手法。這也是MP3播放器這一嵌入式系統應用中第二次沉淀。值得注意的是,這次沉淀并不是整個軟件模塊都沉淀到硬件中,而僅僅是MP3解碼所要用到的DSP算法被提取出來做成硬件加速器——這是在不增加硬件成本的邊界條件下,盡可能提供通用性的典型實例——因為這些固化了DSP算法的芯片還有可能被別的嵌入式應用所使用。
總結
嵌入式系統中只有專用,以及嚴格規定了邊界的通用——即在不增加成本或不增加過多成本的前提下,盡可能的實現通用。
對工程師來說,沒有資源限制的通用不算本事,在有限資源范圍內實現盡可能多的通用才是一項挑戰!
這就是沉淀模型,在應用需求和成本的雙重壓力下,可重復利用或者可用更低廉成本實現的邏輯會被單獨提取出來,沉淀到合適的系統層次中,以便用更便宜的方式加以實現,而在總體功能上保持不變或者改善 。
如果你真的理解了沉淀模型,你會發現,沉淀的過程并不一定是單向的(從上到下:應用層到系統層、軟件模塊沉淀為硬件邏輯)。很容易理解,在運算能力普遍較強的今天,一個有能力作MP3軟件解碼的MCU幾乎是白菜價——換句話說,由于性能的普遍提升,MP3軟件解碼幾乎是白送的,用軟件解碼比用硬件MP3芯片解碼更為便宜,因此,MP3播放器這一嵌入式應用完成了最后一次沉淀,MP3解碼從硬件重新回到了軟件的懷抱。——如果你真的懂了,就不會糾結沉淀模型的方向性問題了——因為你明白,物理世界中,沉淀的驅動力是重力,而嵌入式世界中,沉淀的方向由成本決定。
-
嵌入式系統
+關注
關注
41文章
3593瀏覽量
129476 -
計算機系統
+關注
關注
0文章
282瀏覽量
24115 -
面向
+關注
關注
0文章
9瀏覽量
16515
發布評論請先 登錄
相關推薦
評論