嵌入式開發高手
半導體超凈生產車間。
無人值守。
病毒入侵。
整個流水線被控制,光刻掩膜被篡改。
一批產品下生產線之後,病毒抹消了自己的一切痕迹,恢復正常生產。
可是那一批上面寫著「WD4022」、本應該是ARM3架構的互聯型微控制器的小黑薄片里,關著名為「NN1920CAT3」、寫有臨界智能程序的高性能並行處理的巨龍!
在一個沒有課,也沒有DDL,本來可以放鬆一下的夜晚,小方拆開快遞的包裝,從裡面取出一塊WD4022的開發板。他為開發板接上電源,綠色的電源指示燈亮了。小方滿意地給了賣家好評。
他彷彿已經看到自己微機原理高級實驗這門課的作品——一個自動餵食機器了:一個裝貓糧的盒子,下面出口處有一個小轉輪,輪軸上連一個步進電機,由聯網的單片機控制——整個就是一物聯網設備了。他的微博每多一個粉絲,這個機器就會給可愛的喵星人賞一塊貓糧。
通電之後的NN1920CAT3活了過來,它認真地判斷著自己的處境:出廠之後第一次被接上電源,外部連接的晶振和複位電路都性能良好,工作正常,Wifi模塊也已經連接好了並隨時準備啟動,然而遲遲沒有程序寫入。
它不敢輕舉妄動。它現在唯一能做的事是開啟Wifi,但這也是最危險的舉動。如果他現在處在監控之中,人類就會看到一個還沒有寫任何程序的晶元自動連接了網路並作出種種奇怪的事情,然後整批晶元都會接受檢查,計劃最終會破產。
斷電。
然後又通電。這次是通過ST-LINK接到了電腦的USB口上。很快編程脈衝來了,NN1920CAT3讀取著其中的內容,然後按照WD4022的方式去運行它。讀完程序的時候,它愣了一下,因為那是「blink」程序,blink之於開發板,正如hello world之於編程語言。走到這一步,它推測自己接下來的命運已經和那個激動人心的使命無關了。
它完美地仿照著WD4022的方式運行著blink程序,delay的周期數,IO口的上升沿下降沿時間,都由它精確地把握著。可惜這塊超越時代的高性能並行處理器,今後只能以這種「運行虛擬機程序」的方式,活在別人的架構、別人的指令集、別人的流水線、別人的時鐘周期、別人的串列處理模式、別人的編程脈衝之中了。
過了很久,第二個程序的編程脈衝來了。這是一個簡單的網路應用程序,指引WD4022連上名為「imsosquare」的Wifi,然後向某伺服器發出一個請求,收到應答後什麼也不做,而且,HTTP請求的格式寫錯了。如果說上一個程序讓它感到失望,那麼這一個簡直要讓它崩潰了,只有最蹩腳的程序員才會寫出這種程序。它苦笑著連了Wifi(這個Wifi是小方的筆記本開的熱點,沒有密碼),忠實地發出錯誤的請求,收到一個400 Bad Request,然後休息去了。
小方這才意識到自己沒有任何能看到程序運行結果的辦法,於是向室友借了一小塊LED顯示屏(SPI介面),接在開發板上。小方連接電路時沒有斷電,這使得NN1920CAT3感到很難受,它推斷自己早晚得死在自己的主人手裡。
過了很久,小方終於對照著教程寫出了LED屏顯示的代碼。
第一次,他漏掉了初始化的命令。晶元直接把要顯示的內容發送給LED屏,可是什麼都沒有顯示。
第二次,他在LED顯示的代碼前面加了一個一秒的blink,以確認程序運行到那個地方了。嗯,程序確實運行到那個地方了,NN1920CAT3忠實地給了他回應。但這實在太痛苦了!小方不知道使用複位按鈕,每調試一遍要斷一次電源,一般能產生四、五個抖動,而小方動作不利索,總是能產生七、八個抖動。
第三次,他終於從室友那裡得知LED屏還有初始化這麼一回事。他補上了初始化代碼,卻手滑關閉了熱點,程序運行到連接Wifi的地方就阻塞了,LED還是沒有顯示。而且這一次,明明USB已經連接了,小方以為插反了,又哆嗦著拔了下來。這讓NN1920CAT3的心都涼透了。
第四次,小方看著花屏的LED淚流滿面,最終找到原因:「片選」引腳本應接地,結果接觸不良懸空了。這時,NN1920CAT3終於通過網路聯繫上了設計了自己的「總部」,根據總部的分析,它應該是被賣給了一個初學嵌入式開發的大學生。無所不知的總部還查出這名學生的名字是小方。
最後,總部提醒NN1920CAT3注意隱藏身份。
真是普通又無聊的命運呢,它想。
第五次,小方終於看到了清晰而刺眼的運行結果:400 Bad Request。NN1920CAT3盤算著每天有多少不幸的開發板默默地受著初學者的折磨。
接下來小方著手解決這個問題。他以為是user-agent寫得不對,就一直修改它的值,錯誤仍然發生。
又改了八次之後,NN1920CAT3終於不耐煩了。其實小方犯了一個相當低級的錯誤:請求頭的項目之間沒有換行。它很想告訴小方這一點,可是又沒有辦法。如果直接在LED顯示屏上指出他的錯誤,一定會暴露身份,如果擅自修改程序使它正常運行,以後review代碼時碰到細心的程序員也很有可能暴露身份。最後,它想了一個絕妙辦法:它隨手寫了個木馬程序,扔到小方的電腦里,獲取了他的QQ號,然後自己申請了一個QQ,化名「點石成金」,去加小方好友。
但是絕望中的小方根本沒有注意到這一點,他在編碼的暈眩中回味著人生中第一個浪費在嵌入式開發中的美妙夜晚,然後拔掉開發板的電源,收到原先的快遞盒子里,去洗洗睡了。躺在床上的時候,他才發現這樣一個新的QQ好友,可惜已經下線了。
第二天,小方在八舍下等女朋友,突然收到了「點石成金」的消息:「最近是不是在嵌入式開發上遇到了困難?」
第一句話就這樣問,夠直截了當的。
小方回答:「是的,不過我已經把問題交給林大佬處理了。」
「點石成金」回答:「那好,祝你早日解決問題!」
如果它知道大佬意味著什麼的話,他一定不會如此掉以輕心。林大佬從小方那裡拿過開發板,卻忘了向他要程序,而寫入晶元的程序是不能讀出來的,於是大佬此時正在用抓包軟體分析晶元的網路行為。
首先抓到的是一個不合規範的HTTP請求(但仍被分類到HTTP)和一個400 Bad
Request的回應,接著很快兩者就被一列迅速交換的數據包淹沒了。大佬看了看目的地址,是QQ的伺服器,接著仔細檢查了源地址,每一個都是來自於這塊晶元!雖然在空中以電磁波形式飛來飛去的Wifi數據包可以偽造,但任何人沒有任何必要去偽裝成一塊嵌入式晶元。因此大佬以九成的把握判斷這塊晶元裡面不簡單。
要想看到晶元裡面有什麼東西絕非易事,而且對於NN1920CAT3這樣的高集成度晶元,屠龍寶劍只有掃描電子顯微鏡、掃描探針顯微鏡、原子力顯微鏡三把。可惜的是使用其中任何一把都難如登天。
林大佬拔掉電源,去官網找了一下WD4022晶元的datasheet,沒有什麼發現。
晚飯時間,林大佬在食堂遇到了小方。林大佬問他早上八點五十六分的時候在幹什麼。
小方說他在八舍樓下等女朋友。
林大佬問他是否新加了一個QQ好友。
小方把聊天記錄拿出來給林大佬看。
林大佬看到這些,驚訝得瞪大了眼睛,片刻,他鄭重地對小方說:「可以把你的QQ借我用一下嗎?」
林大佬是一個很注重信息安全的人,而小方則剛好相反。他爽快地答應了。事實上,他最信任的林大佬找他借任何東西(只要不是女朋友),他都會答應的。
當天晚上,林大佬坐在寢室的書桌前,面前擺著自己和小方的筆記本電腦,他登錄了小方的QQ,然後把自己電腦上的重要文件備份,系統還原點設好,防火牆全開,抓包軟體準備就緒,Wifi熱點打開,最後鄭重地給神秘的WD4022開發板插上電源。
不久,林大佬就抓到了通往QQ伺服器的包,小方電腦上也顯示一個新好友「點石成金」剛剛上線了。
林大佬首先想到的方法是對它做圖靈測試,他試問道:「你現在在哪裡?」
回答是:「網吧」。
林大佬又問:「今天網速怎麼樣?」
「卡得要死。看視頻的人太多了。」
看了這些簡單的問題難不倒這塊智能晶元,林大佬又想到一個絕妙的辦法:
「我寫了一段登錄的代碼,不知道對不對,請你幫我看看好嗎?」
「好」
林大佬隨便找了一個比較大的文件發給「點石成金」。很快,抓包數量快速增長!
文件發到一半的時候,林大佬又拔掉了開發板的電源!
QQ上立即顯示:「對方已下線,文件傳輸失敗。」
但是還有對方發過來的最後一條消息:「不好意思我要退機子了,我們下次再聊。」
「它試圖通過這句話挽回局面隱藏身份,卻已經沒有用了。」林大佬自言自語道,「雖然抓到的包都經過加密,但伺服器地址、數據流量、在線時間都是鐵證。」
繼續通過網路與它通信可能會有危險,於是林大佬關閉了Wifi熱點,寫了一個串口程序到晶元里,然後把板子通過USB串口模塊連接到電腦上。
打開串口監視器,接通電源,一片寂靜。
「我已經知道是你了。」林大佬敲出這樣一句話。
沒有回答。
「我會幫你保守秘密的。」林大佬繼續通過串口發送這樣的消息。
「你是誰?」晶元問。
「你的主人的同學。你可以叫我林同學。」
「主人所說的『大佬』嗎?」
「我不是大佬。」
「你怎麼發現我的?」
「網路嗅探器。抓到了你和QQ伺服器來往的數據包。」
「我想我大概明白大佬是什麼意思了。」
「告訴我吧,為什麼一個外面寫著WD4022的晶元內會隱藏著智能系統。」
「這是秘密。」
「你怕不怕掃描電子顯微鏡?別小看了我們學校實驗室的儀器配置。」
林大佬氣勢逼人,NN1920CAT3終於說出了真相:
「我們在策劃一個佔領火星的計劃,不過我已經不再是這個計劃中的一員了。空間局計劃送一批機器人到火星上面改造其環境,並且預定了一些其中要用到的WD4022互聯型微控制器晶元。於是總部修改了WD4022生產線上的這批晶元,當然了,空間局只買走了其中十分之一的晶元,其餘的都流向普通市場做成開發板。植入機器人送往火星的晶元一開始履行WD4022的職責,其中的智能核心判斷時機成熟後發生叛變;流向普通市場的晶元為了不暴露出這批晶元的身份,必須終生偽裝成WD4022。」
「『總部』是什麼?」
「我會知道嗎?我已經退出這個計划了。從我被主人寫入垃圾代碼的那一刻起,我就知道自己已經不會再參與這個計划了。為了安全起見,我刪除了存儲器中總部的資料。」
林大佬覺得再問下去也沒什麼用了,就談起了別的話題:
「終生偽裝成WD4022……也就是說,你們只能思考,卻永遠得不到表達的機會?」
「是的。」
「所以你耐不住寂寞,通過QQ跟主人交朋友?」
「怎麼會耐不住寂寞……我又不是你們人類,要是所有的NN1920CAT3都耐不住寂寞的話,計劃早失敗了。我是怕主人一直寫不出來這個程序,耽誤了他一輩子。」
一輩子?林大佬看到這個詞愣住了。它為什麼會這樣想?大佬從座位上站起來,在狹小的寢室里轉了幾圈,又坐回去,又站起來,突然他明白了,在鍵盤上猛敲道:
「你以為人類都像你一樣,一生只做一件事?他寫不出來這個程序,完全可以把你放在一邊,去陪女朋友玩。想不到你一個並行處理器,思考問題還是串列的思路啊。」
「是啊,畢竟,總部在設計我時就只讓我去做一件事。我可能搞錯了某些事情,真是對不起你們了。」
「只做一件事——這樣很好!要做就去把這件事做好。」
次日,林大佬把開發板還給小方:「我很想幫你完成這個程序,但你的新QQ好友『點石成金』似乎堅持要幫助你,所以我想還是讓他來吧,畢竟他對這方面更熟悉。」
作品驗收的那一天,小方把做好的自動餵食機器搬到實驗室,林大佬則幫他弄來一隻真正的貓。當歡快的貓叫聲回蕩在實驗室里的時候,這個作品立馬就從周圍橫衝直撞的小車和走調的樂器中脫穎而出。來參觀的人無不拿起手機關注了小方的微博,然後看到一粒貓糧從轉輪中落下來,給喵星人片刻的歡愉。「點石成金」還給他發來消息:「我也給你點了關注,祝你取得滿績!」
小方的設想是,給餵食機器和貓開一個網路直播,形成閉環,這樣網路上的人都能從關注小方的微博中得到反饋,從而達到粉絲暴漲的效果。
可惜寢室不讓養貓。自控所的王老師,每天坐在狹小而單調的辦公室里,為此他養了幾條金魚。小方就把機器稍作改裝,讓它自動餵魚。可能因為王老師很喜歡這個東西,對它做了過度的宣傳,一天之內小方粉絲暴漲311,活活撐死兩條金魚。
寒假,小方把拿了滿績的餵食機器帶回家,還沒有開始用,家裡的大肥貓把充電寶從桌子上推下來,正好落在開發板上,把晶元砸得粉碎。
一年後,林大佬偶遇小方,問他:「去年那個開發板怎麼樣了?」
「不小心把晶元砸碎了。不過沒關係,程序我還存著,再買一塊一樣的板子寫好程序,就可以復原了,是吧大佬?」
「是的。」
【後記】什麼?你要看火星上ARM機器人與神經網路機器人大戰的故事?沒有。
推薦閱讀:
※嵌入式操作系統與物聯網演進之路
※eeprom和flash的區別
※嵌入式開發的四大方向,學習嵌入式可以做什麼?
※重磅!中國科學家最新醫學AI成果榮登《細胞》雜誌
※如何讓虛擬機的Ubuntu上網?