我時常在想,現代社會發展變化速度之快超越了不少人的認知。羅胖子說跟不上時代要交認知稅,頗有道理。半導體和IT行業又是旋渦中心,發展更加快,其實想一想其餘行業的創新(美團外賣、滴滴打車、微信社交、淘寶京東電商,以及最新的新零售自動售貨機、自動駕駛汽車等)本質上都是半導體行業的創新驅動的,都要靠先有芯片,先有配套的軟件資源和開發人才,纔能有人在這些行業創新。linux
入坑嵌入式開發多年的我,面對芯片及其相關的軟件開發技術的快速發展變化,常常會去思考,這些發展變化的內在推進力和外在合理性在哪裏,這些發展變化對咱們有哪些啓發和引導,身處旋渦中心應該何去何從,才能保證本身不被歷史洪流沖走,才能不斷提高本身的價值。android
單片機是中文名,對應的英文名稱是「Single Chip Microomputer」,不少人可能奇怪平時不是都說MCU(Micro Control Unit)嗎?其實MCU準確翻譯過來應該叫微控制器,如今不少中文書籍都用這個詞,不用單片機了。由於單片機這個詞是不少年前的概念了,在那個年代半導體工藝還在起步階段,集成能力不好,每每是CPU一個芯片,SRAM一個芯片,Flash一個芯片,須要中斷的話又得有個專門處理中斷的芯片,因此一個完整可用的計算機系統是不少個芯片(Chip)作在一個PCB板上構成的。編程
單片機呢?就是在一個芯片(Chip)上集成了CPU、SRAM、Flash及其餘須要模塊,在一個Chip上實現一個微型計算機系統,因此就叫Single Chip Microcomputer,也就是單片機了。其實從這個角度來說,單片機這個詞如今已經沒意義了,由於如今的半導體工藝早就很厲害了,如今你買到的全部都是「單片機」,根本不存在分離式的所謂「多片機」。並且現代的單片機不但集成了CPU、SRAM、Flash等微型計算機不可少的部件,並且大多集成了不少內部外設,如Nand控制器、LCD控制器、串口通訊、定時器、RTC等等,因此如今的單片機其實應該叫SoC(System on Chip)。微信
英文是很準確的。這裏有好幾個詞你能夠體會下各自含義:microcomputer、computer、system、microcontroller。不嚴格區分的話這些詞不少時候能夠互相替換和通用的,可是嚴格說其實各自有不一樣代指的。譬如computer,指的就是電腦,你能夠理解爲就是電腦,譬如筆記本、臺式機這些。固然不少年前的電腦很龐大很笨重,因此computer就是指的這種有機箱外殼,有鍵盤鼠標,很龐大笨重,通用性強的電腦。而microcomputer指的就是單片機這類東西,它也是一個獨立的電腦系統,有CPU和內存和外設這些,能跑計算機程序。可是他相對於computer來講體積很小,並且不是通用的而是專用的,因此叫microcomputer。system呢?更傾向於整個系統,也就是說system=microcomputer+各類外設。簡單理解就是,當串口、LCD控制器等模塊進入了Chip內部時,整個microcomputer就成爲system了。因此其實system纔是更有意義,更適合現代單片機芯片的一個名字。因此如今咱們都把芯片叫SoC,這個名字更有價值。那microcontroller呢?如今不少單片機廠商都把本身的單片機叫microcontroller(微控制器),其實我我的理解,以爲microcontroller的重點在於controller,也就是說他們想強調這個chip中集成的system是一個controller,擅長控制。而不是一個DSP(擅長運算)。網絡
嵌入式的全稱是嵌入式系統,英文是Embeded system,因此能夠看出嵌入式是一個system。爲何叫嵌入式呢?這裏的嵌入指的是咱們把這個system(硬件上表現爲一個Chip)嵌入到某個設備中去。譬如冰箱的板卡上的芯片就是一個嵌入到冰箱中的system,負責控制用戶按鍵、冰箱照明燈、製冷系統等。能夠看出,嵌入式系統這個名字主要是從芯片在使用時的組織形態來命名的。因此從這個角度講,只要是被嵌入到設備中的芯片均可以被叫作嵌入式系統。架構
那這個範圍太寬了,說真的你很難找到不屬於嵌入式的system······因此我常常以爲嵌入式這個名詞根本是廢話,根本沒意義。好在這個理解只是廣義上的嵌入式的定義,可是咱們平時講嵌入式大多時候是從狹義上理解的。app
狹義上講,嵌入式是爲了區別於單片機。咱們常常把芯片中不帶MMU(memory management unit)從而不支持虛擬地址,只能跑裸機或RTOS(典型如ucos、華爲LiteOS、RT-Thread、freertos等)的system叫單片機(典型如STM3二、NXP LPC系列、新的NXP imxRT1052系列等),而把芯片自帶MMU能夠支持虛擬地址,可以跑Linux、Vxworks、WinCE、Android這樣的操做系統的system叫嵌入式。因此linux WinCE等也常被叫作嵌入式操做系統,就是這麼回事。你仔細回顧下,其實大部分人在講單片機和嵌入式時都是從狹義角度出發的,並不是廣義。框架
單片機是出貨量最大的一類計算機。這個很好理解,由於單片機用途太普遍了,全部家電內置的控制系統幾乎都是單片機的,這個數目就很驚人了。還有各類公共設施,工廠自動化設備等幾乎也都是單片機控制的。單片機的廠商和品類也是很是多,我下面列舉幾類經常使用的。ide
嵌入式領域目前最火的就是ARM+linux和ARM+android。
芯片都是基於ARM的,低端的有ARM九、ARM11,高端的有Cortex-A七、Cortex-A八、Cortex-A九、Cortex-A5三、Cortex-A57等。從單核心到雙核心、四核心、八核心都有。廠商也一大堆,國產進口臺產等都有。覆蓋面也廣,消費級、工業級、車規級都有。工具
嵌入式級別的ARM由於有MMU因此能夠很好的跑複雜OS,所以雖然芯片自己也能夠裸機運行,可是基本沒有人用這類芯片來跑裸機或者RTOS的。都會上操做系統。簡單說,若是產品不須要華麗美觀的人機界面就上linux(譬如路由器、網絡攝像機),若是須要人機界面可是界面簡單注重功能和穩定性,那就上linux+QT(譬如工控HMI、電動車充電樁、停車場顯示),若是產品很注重人機交互的用戶體驗,那就上Android(譬如智能手機、智能電視機、遊戲機等)。
總的來講,嵌入式系統的複雜性高、開發難度大、學習曲線長。由於軟件上的複雜性,致使出bug的可能性大。一旦出bug查找起來也更加須要技巧和經驗。因此不少公司用嵌入式linux或android作產品問題不少,這一方面和開發者的技術能力有關,另外一方面和公司不能花時間和成本去潛心把產品作穩定作成熟有關。
其實分析到這裏,你們也知道了嵌入式和單片機的真正區別,那就是有沒有linux或android這類複雜操做系統。
單片機不是裸奔就是RTOS,其實玩過RTOS和linux的同窗都知道,RTOS雖然也叫操做系統,可是和linux這種根本不是一個級別。差遠了,更不用說android了,android裏隨便拿出來一個模塊代碼量都比一個完整的RTOS都龐大,都要複雜。因此有沒有linux/android這類複雜OS對開發來講真的很不同。
譬如從C語言角度來說,個人《嵌入式linux核心課程》第4部分《4.C語言深度解析》這個課程,就是專門針對嵌入式linux開發中C語言功力不足的人推出的。不少作了多年單片機的同窗看了後都感慨,真的是不作linux不知道C語言水深。結構體和指針這些元素在單片機編程中徹底體現不出來魅力,可是在linux內核中卻獲得了完美的發揮和釋放。不去真正研究,實在很難體會出那種美感和震撼。
嵌入式和單片機有沒有交集呢?這裏說的交集意思是:某些產品既能夠用嵌入式來解決,也能夠用單片機來解決。
之前是沒有的。你想一想通常單片機幾塊錢十幾塊錢,而嵌入式系統SoC加上DDR和Flash至少幾十塊,怎麼可能有交集。就算單片機能作的事你嵌入式也能作,可是我十幾塊錢能搞定的工做憑什麼要花幾十塊上嵌入式呢?因此之前這2者沒交集。根本不是一個檔次範圍內的事兒。
可是近兩年狀況發生了變化。首先是不少高端單片機的配置和價格愈來愈高。譬如2017年10月發佈的NXP imxRT1052系列單片機,號稱跨界處理器。爲何叫跨界?跨的是哪兩界?
咱們知道單片機嘛,就要單芯片提供整個system,簡單說至少cpu、sram、flash這三大件不能少,要否則根本沒法獨立運行嘛。因此你看無論是51單片機仍是STM32都是內部有CPU,有SRAM,有Flash的,這就是典型的單片機。而嵌入式SoC不一樣,譬如S5PV210內部只有CPU和少許SRAM,它要正常工做須要外部集成DDR SDRAM和Flash(EMMC)。因此嵌入式的system不能在一個chip上,通常典型的嵌入式系統的system由一塊核心板構成,這塊核心板上集成了SoC、DDR SDRAM、Flash、電源模塊等,這叫嵌入式系統。而所謂跨界處理器,跨的就是單片機和嵌入式這兩界。這個imxRT1052內部集成了CPU和SRAM,可是沒有Flash,它須要外部提供獨立的Flash芯片才能組成一個system。因此這東西既不是典型的單片機也不是典型的嵌入式,可是既像單片機,又像嵌入式,因此NXP說這個是跨界處理器。甭管好很差用,名字聽起來酷酷的。
順便多說一句,NXP爲何這麼設計?實際上是由於單片機內置Flash都很貴,imxRT1052爲何能比一樣性能的STM32便宜那麼多,主要緣由就是由於他沒有內置Flash。因此不少人都說ST落後於NXP了,其實沒有。只能說NXP這個設計在單片機界是一種創新,對比來看顯得STM32F七、STM32H7性價比太差了。不過實話實說,STM32的F7和H7確實性價比很垃圾,我都不知道就一個單片機賣一百可能是準備上天?誰給ST的勇氣這麼訂價的,梁靜茹嗎?
算了,懶得吐槽F7和H7了。就說這個跨界處理器imxRT1052吧,這東西主頻有600MHz,有消費級和工業級,帶各類外設(反正你能用到的基本都有了),能夠帶最大分辨率1024*768的TFT LCD(固然了須要外接SDRAM做爲顯存)。這東西相對於普通單片機來講就是神通常的存在啊,通常玩單片機的看到這個數據嚇得直接就跪下叫爸爸了。再說價格,這東西官方公佈的批量價格是人民幣30元左右。想想感受性價比爆棚啊。其實STM32也沒那麼弱,F7和H7的主頻雖然沒有600MHz那麼變態,可是H7的性能總體比RT1052並無太大劣勢。就算不叫爸爸一聲大哥總逃不了。之因此F7和H7沒掀起大浪關鍵仍是價格太嚇人了,通常人據說100多直接內心罵娘轉身走人了,根本不想了解你的性能。而imxRT1052的30元確實很誘人,聽起來彷佛真的是高性能低價格了,不少人甚至據此判斷NXP要「乾死」ST了。
高性能跨界處理器初看彷佛很不錯,實際上並無那麼容易成功。緣由就在於這種高性能單片機實際上和低性能高性價比的嵌入式linux解決方案比並無優點。
是的,不少人以爲600M主頻的單片機才30塊很便宜很厲害。那是由於你不熟悉嵌入式的解決方案。實際上imxRT1052單芯片是不能很好工做的,他要實現高性能至少須要外置Flash和SDRAM,就算只是1Gbit的SLC Nand和32MB 的SDRAM,再加上RT1052BOM成本也在50元左右了。再加上RT1052雖然號稱批量30元,可是實際上小批量拿貨價都在40-50元,因此目前市場上RT1052的核心板售價都在120-150元之間了。這個價格其實並不便宜,有不少嵌入式linux的解決方案都比這個性價比高。
譬如NXP的imx6ul,內置Cortex-A7單核心,最高主頻1.2GHz,也是工業級,各類你能想到的外設都有了。標配256MB SLC Nand和256MB DDR的核心板,市場最低售價119元,比RT1052還低一些。
實際上還有性價比更高的方案,譬如咱們深創客推出的NUC972牛頓板中使用的新唐NUC972方案,內置64MB DDR,外部配置1Gbit SLC Nand。主板批量能夠作到100元內。性價比完勝RT1052這類高性能單片機。
不少人可能會說,我不會嵌入式linux開發,我只會單片機開發啊。因此你linux的方案性價比再高跟我不要緊,單片機的纔跟我有關係。我想說這絕對是一種誤解,百分百的誤解。爲何?
單片機就三個字,你別以爲叫單片機的都是一種東西。單片機和單片機是不同的,你以爲主頻600MHz的單片機帶1024*768分辨率的TFT LCD,它的開發方式和難度會和10塊錢不到的STM32F103同樣?軟件開發是跟着硬件走的,什麼樣性能的硬件就應該配套什麼樣的軟件開發方式和相應資源,也會要求開發者具有某種相應素質。因此不要以爲都是單片機就親切,就能玩。實際上要把高端單片機徹底發揮性能作出好看的GUI而且用到項目中解決掉全部的BUG並非一件容易的事情。
這篇文章寫的比較淺,主要是講了下單片機和嵌入式系統的由來和差別。引出了高端單片機(STM32H七、imxRT1052等)和高性價比嵌入式linux解決方案的的一個對比。主要是但願拋給你們一個思考點,引導你們去思考如何分析和評價一款芯片方案,從而在作項目時可以更好的選型適合本身的芯片方案。總的來講,個人觀點是:能用幾塊十幾塊的單片機就用單片機,若是這些高性價比的單片機不能知足要求非要上幾十塊的高性能單片機,那你確實應該考慮下是否應該一步到位上高性價比的嵌入式linux解決方案。不少人擔憂linux不會開發,其實不該該這麼考慮。真正沉下去作項目,你會發現用嵌入式linux並無那麼難,並且高端單片機加上RTOS和一堆框架、協議棧以後也不簡單。出了問題也很差找。並且嵌入式linux通過多年積累,其方案穩定性大多都不錯。而高端單片機的配套RTOS和框架協議棧等中間件每每處在發展初期,每每bug不少。所以,建議你們值得投入時間去學習嵌入式linux軟件開發的技能。
今天先講到這,後續有時間再繼續更深度來高性價比的嵌入式linux解決方案的各類技術細節。