一隻老鳥嵌入式工程師的血淚史!
作為一名在嵌入式行業摸爬滾打許久的老鳥,回想自己的經歷之路,那麼漫長可又彷彿近在眼前。——此文僅獻給那些剛剛踏上硬體之路和還在徘徊的同學們,在此我簡要的記錄了我的學習經歷和其間自己所獲的一些心得,以幫助初學者少走彎路。當然,如果你覺得深有感觸的話,這邊也可以私我:
我深知對於一個初學者來說,身邊有一個能手把手相授的老師該是多麼幸福的事情,老師一句不經意的話可能我們初學者要花上幾天甚至是幾個月的時間去思考和驗證。遺憾的是,我們身邊並非總有這麼一位老師。所幸的是而今網路發達,這致使我們不得不經常求助於網路,網路上豐富的個人經驗是非常值得借鑒的,我們能從一些文章中悟出一些東西,為我所用,或者從中感受精神動力。
藉此機會我想介紹一下我曾經的工作團隊,因為他們對我影響極大。團隊有四個人,其一是擁有11年工作經驗且已擁有自己專利的高級工程師(我習慣叫他二導,他是我為什麼在團隊的原因),一個是擁有5年經驗、熱心腸的工程師,還有兩個分別是電源和視頻方面的專家和元老級人物。耳濡目染,自己漸漸的對硬體發生了濃厚的興趣。從單片機,FPGA、SOPC硬體的搭建以及軟體編程,以及現在正在努力研究的ARM,我是憑著無限的熱情來做的。
但熱情不是唯一的原因,另一個原因是試驗室提供了便捷的學習環境。這裡有現成的winbond 51單片機、有偉福模擬器、advanced labtool 48uxp萬能編程器,一台12萬的示波器,自己買了個萬能板。學習階段時,找本書就能在上邊進行試驗了。從簡單的led閃爍、數碼管顯示、pwm到中斷、串口通信(單片機與單片機通信,單片機與pc通信)、I2Ceeprom讀寫、A/D轉換、溫度的測量等。當時令我神魂顛倒的是每一個試驗經過資料的查找、程序的編寫以及調試、再到後來問題的解決,那份成就感與喜悅之情,相信只有經歷過的人才能夠體會。正是有這份熱情和愛好,我常常在實驗室呆上十二、三小時,通常是晚飯在食堂吃了後直接到驗室,晚上9點半回宿舍。雖說那時候沒有做過什麼大項目,但是這每一個小小的實驗都是我知識積累過程中的點滴,有了這積累,之後我才能涉足更大的項目。
剛進實驗室的時候,二導就給了我一塊開發版,是Altera公司的nios ep1c20 cyclone系列開發板,當時是以大學計劃的名義買的,5000元人民幣。於是就開始了我的FPGA學習之路。之前學習過verilog,只停留在純粹的理論階段,編幾個小小的程序,用quartus-ii自帶的模擬軟體進行一下模擬就ok了。
用模擬軟體進行模擬,往往能夠得出你所想要的結果,但是一旦下載到晶元裡邊運行,問題就會接踵而至。萬事開頭難,我做的第一個實驗是點亮led,自己編寫程序(幾行而已)、編譯、引腳分配、模擬、然後就用jtag下載線連接開發板和pc,將sof文件下載到晶元。現在想起來這是多麼簡單的幾個步驟,但是對於當時的我來說,花費了相當的時間和精力來查找資料和埋頭反覆實驗。特別是引腳的分配,文檔上只說需要這麼做,那為什麼要這麼做呢?當時沒有過多的想法,只想看到實驗的結果,有了結果我就有了無限的成就感和高漲的熱情,所以當經過努力,第一個FPGA實驗里的led終於按照意圖動作的時候,那種激動與當初學習單片機時得以實現led閃爍的情形如出一轍。
我做實驗的一個慣例同時也是一個經驗就是邊做實驗邊看書,在實驗中發現問題,遇到不懂的問題或者原理在查找相關的文檔。我習慣動手,如果讓我坐在實驗室看上1天的純理論書籍,而不讓動手試驗,我想我的腦袋肯定會爆炸,正因為沒有這樣看過書,所以這腦袋也一直健在。到後來學習ucos嵌入式操作系統我也採用了這個方法,我把它叫做「階梯成就感」(實在是寫這篇文章的時候突然覺得這個詞語非常貼切,臨時杜撰的)。抱著這種熱情,後來一點一點地深入學習FPGA,一些常規邏輯電路的設計,包括邏輯門電路、數據選擇器、編解碼器、加減乘除運算器、移位器,到後來的稍微複雜的電路設計,如FIFO、數字跑表、頻率計、狀態機、交通等的控制、卡式電話計費系統以及UART等。
這些試驗當時我都是採用的verilog語言實現的。初接觸FPGA時本想學VHDL,那時的同學都用verilog,為了與他們討論問題的方便,就改學verilog了。一學不打緊,慢慢發現自己深深地愛上了verilog,對於我來說,它無疑更適合我。這也是我要推薦的一個經驗,那就是多看看你周圍的人用的是什麼工具,他們用的工具往往不是你最喜歡的或者不是當前最廣泛最流行的,但你若要和他們交流討論問題,那還是遷就一下,和別人所用工具一樣,交流起來也會順暢方便。到實驗室後,因為實驗室的員工都用偉福的模擬器,所以軟體當然還是用偉福提供的。偉福的軟體我認為不怎麼好,只支持彙編,比起大名鼎鼎的keil c51遜了一大截,但除非你想等到自己有問題不會的時候周邊竟沒有人幫助你,不然在前期還是選擇偉福的軟體方便溝通。再後來,經過自己的摸索和向身邊的工程師們請教,偉福用很熟悉了,彙編也有了自己的一套,這時候我開始在偉福裡邊嵌入keil,用c語言來寫程序,但調試的時候用偉福軟體還是有缺陷,比如不能夠單步執行等。所以再後來我就下載了keil c51軟體,從此以後便正式地在keil的開發界面下寫程序了。當然模擬的時候也可以在keil環境下用偉福模擬器,我想偉福在製造自己產品的時候就已經考慮到這點了,他們的一些產品肯定要考慮兼容主流軟體keil的。用了keil C51後就不想用偉福編譯軟體了,同樣的用了c寫程序後,就不想用彙編了。但是彙編是每一個硬體研發工程師們必備的,彙編有c不可企及之處,但有時候還非用彙編不可。彙編的運行效率高,寫起來很是煩瑣,煩瑣規煩瑣,在某些特定的時刻,彙編還是發揮了它不可替代的作用。比如在將usoc移植到單片機的時候,與處理器相關的程序還真是必須用彙編來完成的。
再後來,學習sopc。從最小系統硬體平台的搭建,到簡單的led閃爍程序的編寫,到sof文件在晶元上跑起來,看著led的亮與滅,心中熱情澎湃。每一次接觸新知識都有一種發自內心的激動,每一次接觸的新東西我都從最簡單的led閃爍開始,從單片機到FPGA到sopc再到ucos,每天一個小小的進步能讓我燃起對工作的熱情,只要有這每天小小的看得見的「階梯成就感」,就能激發我對更多知識的追求。在此期間本人比較欣賞Altera公司推出的可編程片上系統即sopc,它解放了我們搭建硬體系統的煩瑣,僅僅需要按照需求在系統裡邊加上自己的IP核和一些必須的外設。Altera公司或者其他的第三方公司已經為我們提供了性能和功能很完善的IP核,我們所要做的只是將這些IP核加入到我們的系統里完成我們需要的功能。硬體系統完成後,需要在Altera公司提供的nios IDE環境下對硬體系統進行軟體編程,在這裡,完全用c語言來完成所需要的功能。與前邊學習單片機、FPGA一樣,第一個實驗還是led閃爍,然後慢慢的轉向一些比較複雜的功能設計上去,也無非是實現以前用verilog實現過的一些功能。兩者的區別是:一種完全用verilog語言來實現全部功能;一種需要先用sopc builder搭建硬體系統,然後在nios ide中進行軟體的編程。這兩種方法都能夠實現需要的功能,但是後者更方便快捷,因為在這種方法里,我們使用的是「拿來主義」,IP核已經實現了我們的功能,要做的僅僅是去利用它而已。
再後來學習ucos嵌入式操作系統,主要是運用在FPGA裡面。nios已經為使用者移植好了,不需要修改任何文件。在nios用戶界面里進行一些相應的設置就可以使用了。Altera公司為我們提供的模板裡邊有幾個很好的例子,任務管理、信號量、郵箱傳遞、事件標誌、時間管理等提供了很好的模板,我們需要做的是認真的閱讀,研究它,必要的話對模板進行一些改寫來完成自己的功能,這是模仿的更高境界了,把他的一些東西進行吸收轉化成為自己的東西,我想這是一個硬體愛好者和初學者非常樂於做的事情。
在進行FPGA學習的時候,我遇到過問題停滯不前,試驗沒有進展,心情沮喪的時候。那時對底層硬體一無所知,連對基本的原理圖也看不太懂,更別說程序在開發板上是怎麼運行的了。再到後來進行nios開發的時候,這種沮喪感與日俱增,每天感受不到一點進步,真是很漫長難熬的日子。一次,我和辦公室的一個工程師聊天,談到了我的困惑,他建議我先學習單片機,自己搭建硬體平台,從最小系統做起。這個工程師古道熱腸,學習方面的問題他總是很耐心地幫助解答,讓我受益匪淺,我很慶幸能夠在這種環境當中學習。還有我的導師,他是一個擁有近30年硬體開發經驗的資深研究員,開始工作的時候我什麼都不懂,但總喜歡往導師辦公室跑,喜歡和他瞎聊。他為人和藹可親,容易接近,和他交流的時候總能得到一些職業和人生方面的忠告,這些忠告將伴隨著我一生。到後來,事情逐漸有了轉機,我也慢慢適應了這種心情,調整好了心態。現在想起來,慶幸自己並沒有絕望,沒有對自己熱愛的硬體失去信心。我想說的還是那句老話:遇到問題的時候,當我們感覺事情沒法進展下去的時候,不妨換一種方式,與周邊的人聊聊,或許會有改變。或許這就是學習嵌入式中最大的困難吧!人生總是有很多坎坷,我們的學習職業生涯也是如此。正是因為如此,我們經歷了風雨,方能看見彩虹!如果你目前想學嵌入式確沒有方向,或者正處於學習中存在問題又不知道如何解決的話,這邊你可以私我,樓主這些年也有不少乾貨,相信一定可以幫助你走向新的篇章。
推薦閱讀:
※單片機和Linux都想學_換個兩全的方法學習單片機
※嵌入式開發的四大方向,學習嵌入式可以做什麼?
※DeepMind在醫療領域再下一城,用人工智慧預測急性腎損傷
※eeprom和flash的區別
※重磅!中國科學家最新醫學AI成果榮登《細胞》雜誌