當被人問起“什么是嵌入式系統”時,無需看過我的文章,有一種狡猾的說法肯定是挑不出任何錯誤的——套用知乎上一類著名的問答體,“如何快速的假裝/成為某個領域的專家”——你可以故作認真的說:
“嵌入式系統首先是一個計算機系統”,然后大談你對軟件和硬件的看法……
為了在幾乎沒有逼格的行業中讓大家能夠有機會裝逼,下面我就教大家一種關于嵌入式系統軟件和硬件的特別觀點,絕對可以讓所有的小師妹小師弟甚至是同齡人偷來“刮目相看”的眼光。當然首先你要真的理解這種說法。
為了引起更多人的注意,同時讓話題更有沖擊性,你應該非??隙?、神秘、恨鐵不成鋼而又憤慨的宣布一個觀點:
“你知道么?嵌入式系統中幾乎所有人關于軟件和硬件的看法都是錯誤的……我們被教科書給坑了!”
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)。
重新定義軟件和硬件的概念,不是一個文字游戲,而是一個行業內在心底里約定俗成已經默默在做的事情,只是,今天被明確的點破了而已。雖然你覺得被刷了三觀(也許你沒有),但仔細想想,其實的確和過去的認識沒有本質上的區別?
不是么?其實你早就懂對么?哈哈哈哈——我沒有重新發明軟件或者硬件,我只是誠實的搬運工。
-
嵌入式系統
+關注
關注
41文章
3587瀏覽量
129435 -
PC
+關注
關注
9文章
2076瀏覽量
154147 -
iOS
+關注
關注
8文章
3395瀏覽量
150564 -
計算機硬件
+關注
關注
0文章
14瀏覽量
7718
發布評論請先 登錄
相關推薦
評論