時間:2018-11-18 00:00:00 來源:信盈達 作者:信盈達
那么,現(xiàn)在的嵌入式開發(fā)是怎樣的?相比十年前、二十年前有什么發(fā)展?“物聯(lián)網(wǎng)”這一大概念下,應(yīng)用開發(fā)者應(yīng)從何切入?
嵌入式操作系統(tǒng)現(xiàn)狀
目前嵌入式設(shè)備主要分為兩大類:MCU設(shè)備和帶MMU的CPU設(shè)備。
MCU(MicroComputing Unit),也就是我們常說的單片機,其特點是Micro:主頻大概在幾十MHz,內(nèi)存在幾KB,Flash非易失存儲也是幾十KB,資源小,價格便宜。單片機這個領(lǐng)域從80年代、90年代開始就一直有人玩,像是玩具、鬧鐘、計算器、電子表、工業(yè)控制等很多領(lǐng)域都有用到,應(yīng)用廣泛。單片機程序的特點是邏輯簡單、實時性強沒有等待,不像Linux那樣會存在資源被其他程序占用的情況。
早期單片機程序一般都是裸寫C代碼的方式,用一個大循環(huán)把所有事情搞定,所有的底層功能——如資源分配、進程調(diào)度、DNS查詢、域名轉(zhuǎn)換等,都要手寫實現(xiàn)。前幾年開始有一些基于MCU的操作系統(tǒng),比如μC/OS、RT-Thread等,單片機有了操作系統(tǒng)就相當于資源分配、進程調(diào)度等工作不用手寫了,可以交給系統(tǒng)去管理,程序員不用去管任務(wù)間協(xié)調(diào)的問題。這可以看作是第二代單片機開發(fā)環(huán)境。
近幾年有一些新的單片機操作系統(tǒng),比如Contiki,這套系統(tǒng)的特點是把互聯(lián)網(wǎng)特征作為基礎(chǔ)的構(gòu)建。這套系統(tǒng)很牛,用10KB以內(nèi)的內(nèi)核就提供了對HTTP、TCP/IP等協(xié)議的支持,讓單片機上來就可以聯(lián)網(wǎng),讓單片機開發(fā)者繞過了每次都要裸寫這些基本功能的痛苦。
現(xiàn)在的單片機有些很神奇的應(yīng)用,比如圖像識別、語音識別,可以做到在視頻上識別色塊的程度。但是,單片機如果又要做圖像識別又要上網(wǎng),就會非常吃力,畢竟資源十分有限,需要有很高的開發(fā)能力把它們協(xié)調(diào)好,這種情況下就不能用操作系統(tǒng)了。
以上是單片機的情況。另外一種是更大一些的,就是自帶MMU(Memory ManagementUnit,內(nèi)存管理單元)的設(shè)備。這種設(shè)備的主頻一般在幾百MHz以上,內(nèi)存在幾十MB以上,早些年的智能手機就差不多是這個配置,跟十幾年前的PC機配置差不多,所以安裝運行Linux系統(tǒng)是沒有問題的。這類設(shè)備其實也做了十多年了,現(xiàn)在用的比較多的架構(gòu)有兩個:ARM和MIPS,都是商業(yè)的,現(xiàn)在新的硬件基本上都是這兩種架構(gòu)。
有很多發(fā)行版都專門為ARM做過安裝包,比如流行的Ubuntu和Debian。無論是ARM還是MIPS,因為有了系統(tǒng),開發(fā)起來要比在單片機上舒服多了,但也仍然有一個很麻煩的地方,那就是要做交叉編譯。開發(fā)者一般都是在自己電腦上——大部分是x86架構(gòu)——完成開發(fā)的,因此要用x86上的ARM編譯器交叉編譯出ARM的二進制文件,用MIPS編譯器交叉編譯出MIPS的二進制文件,才能在設(shè)備上運行,這為調(diào)試帶來了不小的麻煩。為什么我們這個圈子門檻比較高,就是因為一般都是掌握了交叉編譯的開發(fā)者才會進來玩。不過好在有一個叫做GDB(GNU Debugger)的工具可以做遠程調(diào)試,減少一些麻煩。
物聯(lián)網(wǎng)終端需要完成的工作
現(xiàn)在在有一種M2M(Machine to Machine)的思路,在終端用可以聯(lián)網(wǎng)的單片機做最簡單的事情,比如開關(guān)一個燈泡;終端直接跟家庭網(wǎng)絡(luò)的網(wǎng)關(guān)(路由器)連接,或直接跟公網(wǎng)的云端連接,由云端做更復(fù)雜的計算和處理。
這種思路可以解決一部分問題,但是我覺得還不夠。終端需要做更多的事情。
我認為終端需要是智能的,它們需要達到“機器人”的層面?,F(xiàn)在我們說的機器人跟以前大家理解的那種人型機器人不同,現(xiàn)在所說的機器人是一種復(fù)雜控制系統(tǒng),是軟件,可以跑在各種各樣不同姿態(tài)的設(shè)備上。機器人需要完成三項工作:
· 感知:從傳感器采集數(shù)據(jù)
· 交互:網(wǎng)絡(luò)傳輸(如HTTP、TCP/IP)和物理控制
· 智能:如圖像識別、語音語義的理解、智能規(guī)劃,需要抽象成智能的算法
現(xiàn)在的機器還處于太過依附于人類的狀態(tài),需要人告訴他要做什么。我覺得未來的機器應(yīng)該自己知道要做什么事情?,F(xiàn)在的人工智能、知識圖譜的建立就是奔著這個方向去的,比如Google工程師訓(xùn)練機器,讓機器在Youtube的視頻里認識貓,這個涉及到一個很大的知識庫和訓(xùn)練過程,需要云端的協(xié)助。但最終訓(xùn)練出來之后,其實貓的圖像識別特征數(shù)據(jù)是很小的,可以放在終端的機器人里,他們自己就會認識貓了。這就好像嬰兒的學(xué)習(xí)過程一樣。
但是跟嬰兒不同的是,機器天生是執(zhí)行器。所以結(jié)合認知能力,讓機器認識貓了之后,加上執(zhí)行,是不是可以讓機器自動的去抓貓或者逗貓玩?機器認識電梯之后,是不是能夠自己去按電梯?機器認識無線充電站后,是不是能夠自己跑到無線充電站上面蹲著充電?隨著知識圖譜的建模完善,事物和事物之間的聯(lián)系能夠被機器理解,機器人會變得越來越強大,越來越重要。
其實現(xiàn)在語音語義的知識圖譜建設(shè)已經(jīng)相對完善了,機器已經(jīng)能夠理解一些上下文之間的關(guān)系,比如你說到吃蘋果,他就知道你說的是什么意思。我們現(xiàn)在在語音語義+網(wǎng)絡(luò)這塊直接使用了訊飛的服務(wù),我們把工具鏈給他,他們幫我們生成了一個二進制包給我們,就很方便了。
技術(shù)上的挑戰(zhàn)
上述這些工作當中,有些單片機可以完成的很好,有些不能。單片機可以采集一些簡單的數(shù)據(jù)如位置、高度、重力加速度、四軸姿態(tài)、溫度、濕度等,進來都是數(shù)字,只需要做AD轉(zhuǎn)換。比較復(fù)雜的數(shù)據(jù)如聲音、圖像,單片機處理起來就比較困難,一般我們通過Linux的USB驅(qū)動來跑,需要MMU的芯片。但是單片機有一個特征是Linux無法滿足的,就是實時性。很多物理控制對實時性的要求很高,比如四軸飛機的控制,嚴格要求50Hz的控制頻率,即一秒進行50次計算來決定下一幀的動作,如果稍微有點資源搶占造成延遲,飛機就掉下來了。
為了同時達成實時計算+復(fù)雜性這兩個目的,我們只好把兩個芯片加在一起。但是兩個芯片在一起,就成了一個分布式系統(tǒng),有芯片級的通信問題,同時開發(fā)者還需要寫兩套代碼,又要寫單片機的交叉編譯,又要做Linux開發(fā),各種調(diào)試和測試的困難。Arduino現(xiàn)在已經(jīng)有一套挺完善的思路:首先它的傳感器、控制器的庫都很全,然后它做了一個ArduinoYUN的板子,就是一個OpenWRT(一個超級精簡的Linux發(fā)行版)+單片機的雙芯片板子,然后它有一個萬用固件——一個支持firmata協(xié)議的庫,算是一個翻譯,只要符合這個協(xié)議就可以從Linux控制Arduino,算是一種思路。但是我覺得這個思路有兩個問題:第一,ArduinoYUN的思路是以MCU開發(fā)為主,把OpenWRT當做單片機的透傳模塊,為單片機提供網(wǎng)絡(luò)服務(wù)。放著強大的芯片在一邊,用小小的單片機跑主程序,感覺未免太浪費。第二,firmata協(xié)議雖然簡化了控制,但是又影響了實時性,在實時性要求較高的時候(比如四軸飛機),這種思路又無法滿足需求了。
現(xiàn)在一些芯片公司已經(jīng)開始意識到這個問題,開始考慮如何把兩者封裝成一個芯片,來滿足實時性+復(fù)雜性的結(jié)合。我認為封裝后應(yīng)該要以Linux為主要的開發(fā)平臺和軟件運行平臺,以MCU作為輔助以滿足實時性需求。
所以,實時性+復(fù)雜性的結(jié)合是第一個挑戰(zhàn)。第二個挑戰(zhàn)是復(fù)雜運算的加速,比如H.264/H.265的視頻壓縮、圖像識別的硬件加速,要不要放在機器人的芯片里?我覺得是需要的,但是不需要手機那么強的GPU,有一個視頻壓縮的芯片放在里面就可以。終端如果能做視頻壓縮,多半也能做圖像識別,那么終端機器人可以做的事情就更多。
第三個挑戰(zhàn)是針對Linux內(nèi)核本身的,就是在這種級別的計算平臺上如何進行更合理的裁剪、做更合理的算法策略、執(zhí)行策略。OpenWRT的開發(fā)版現(xiàn)在我們做到64MB的運行時內(nèi)存占用,而一般的路由器芯片都是16MB、32MB。其實內(nèi)存的空間占用倒不是大問題,因為現(xiàn)在內(nèi)存很便宜,就算用到128MB、256MB也沒什么,但是關(guān)鍵在于時間片的占用。所謂省資源其實就是兩個意思:少占地兒+少占時間,這樣才能低延遲。所以Linux內(nèi)核如何解決這個問題,也是一個比較大的挑戰(zhàn)。
這三個點可能是未來幾年這個產(chǎn)業(yè)很多人的努力方向。
總結(jié)
相比十年前裸寫C代碼的場景,現(xiàn)在我們有圖形化的界面,有RESTfulAPI,嵌入式開發(fā)的難度可以說已經(jīng)大大降低了。雖然有上面提到的基礎(chǔ)設(shè)施與開發(fā)工具的挑戰(zhàn),但我認為用不了幾年時間也都能解決。網(wǎng)絡(luò)連接現(xiàn)在已經(jīng)基本不是問題,3G、4G、Wifi已經(jīng)足以支撐大部分智能設(shè)備的應(yīng)用場景。
但是,僅僅有這些,到“智能的物聯(lián)網(wǎng)”有很大的距離。機器需要學(xué)習(xí)更多、建立更多的知識圖譜,才能變得更加強大?,F(xiàn)在云端還沒有太多現(xiàn)成可用的知識圖譜,但我們?nèi)匀豢梢韵葟暮唵蔚氖虑樽銎?,比如讓機器人掃地,讓機器人把空瓶子扔進垃圾桶,一點一點的改進它們。也希望有更多的開發(fā)者能夠加入這一進程,讓我們的世界變得更加完整。
免費領(lǐng)取試聽卡
申請已經(jīng)提交
老師會馬上給您安排試聽課程!
申請出錯了
您可以加老師QQ:914865590報名咨詢!