1. 程式人生 > >從微控制器初學者邁向微控制器工程師第二版第一章 究竟該如何學習

從微控制器初學者邁向微控制器工程師第二版第一章 究竟該如何學習

    走進圖書城,面對整排的微控制器類技術書籍,看著一個個陌生的微控制器型號,你是否茫然不知如何選擇?就微控制器核心體系結構而言,有51微控制器,AVR微控制器,PIC微控制器,MSP430微控制器, ARM系列核心等等。除了這些廣為人知的之外,還有很多相容上述某些核心體系的微控制器。選擇何種微控制器作為入門學習的物件,往往成為困擾初學者最大的問題。我們可能道聽途說,某某型號的微控制器功能很豐富,某某型號的微控制器市場使用量大,某某型號微控制器抗干擾強。這些資訊都可能導致先入為主的觀念,對初學者選擇微控制器型號進行學習產生影響。是否有必要把這些微控制器都學習一遍,才能信心滿滿的去面對工作中的挑戰?答案是否定的。

    微控制器的學習並不能拘泥於某一體系的具體某種型號的微控制器。而是通過某一種微控制器的學習,掌握微控制器程式設計的思想。從而在後續的開發工作中,以不變應萬變。如果掌握了具體的程式設計思想,學習一種新的微控制器只是需要了解其相應的暫存器設定即可。對於底層硬體驅動程式以及上層應用程式的編寫均可以套用以前學習過的思想。這樣無論未來工作中接觸到何種微控制器,均可以在很快的時間內上手掌握。只有達到了這樣的地步,方能真正稱之為掌握了微控制器。

  對於程式語言的選擇,也是困擾初學者的一個大問題。君不見,電子專業論壇上面,每每時隔不久就會冒出“微控制器程式設計到底是選擇組合語言還是C語言?”之類的帖子。而且這些帖子一旦出現就會成為眾生爭論之地,但除了一番口水戰,最終無法給出一個確切的定論。組合語言由於是直接操作硬體,在對時序要求精確以及程式碼精簡和講究極端效率的地方可以派上大大的用場。但是這也並不是表明用匯編語言編寫出來的程式就一定是最優的程式。程式的優與否取決於程式編寫者的實際能力,優秀的程式設計師才能編寫出高質量的程式碼。就好像一把寶劍在手,但是還是需要功夫厲害的人才能發揮它的作用。雖然組合語言可以完全控制底層的操作,知曉微控制器每一步指令的執行流程,但由於它艱澀難懂,對於複雜資料結構操作以及演算法實現非常繁瑣,因此在需要定義複雜資料型別以及實現各種演算法時候往往會選擇另外一種高階語言:C語言。C語言恰好彌補了上面組合語言所表現出來的缺陷,在對複雜資料結構定義和操作運算以及編寫各種演算法的時候,編寫的程式碼可讀性非常好。此外,C語言更大的好處在於其良好的可移植性。不管是何種體系結構的微控制器,只要它的開發環境支援C語言開發,那麼我們編寫的程式模組就可以在不同的微控制器之間進行移植。(雖然不同體系結構的微控制器C語言編譯器或多或少的對標準C語言進行了擴充套件,但一般都是相容標準C,只要在設計軟體模組的時候儘量避免使用這些語言擴充套件功能,那麼編寫出來的程式碼的就是可移植的)。然而組合語言卻沒有這個優點,這是因為每一種體系結構的微控制器組合語言都是不同的,這就註定了它只能專用於某一特定體系結構的微控制器。因此對於初學者的建議就是選擇C語言進行微控制器的開發。在對C語言熟練掌握後再去了解學習組合語言,以便在需要C語言和組合語言混合程式設計的場合使用。

    對在校生而言,掌握微控制器應用技術對於未來的工作來說可謂至關重要。而對於已經工作的工程師如果因為工作需要使用到微控制器,如何才能最快的拿下它,卻也是頗為頭疼的事情。幾乎絕大多數的人都會選擇一款市面上出售的微控制器學習板(我頗不習慣稱它們為開發板,因為它們中的大多數教授給你們的實戰開發技術實在太少)。對於經驗豐富的工程師來說,這是最快的上手方法。因為他已經具備豐富的微控制器應用經驗,面對一款新的微控制器,唯一的區別在於外設資源的多少,暫存器如何配置,開發環境如何搭建等等,通過學習板可以很快的瞭解到這些,從而應用到新的專案中去。而對於在在校生和初次需要使用微控制器的工程師來說,這並非是最好的辦法。君不見眾多買了學習板的人,僅僅只是跑了幾個demo例程之後就扔在一邊吃灰去了,抑或是發現做完了所有的外設實驗依然發現自己頭腦裡面沒有一點概念,面對實際的工作需求,無法將其轉換到具體開發設計思路上面。一方面是由於微控制器應用與具體的應用聯絡非常緊密,並非獨立存在,需要眾多的基礎知識作為支撐,如類比電子,數位電子,PCB LAYOUT等知識在設計電路板的時候均需要有一定程度的掌握,方能設計實際可工作的電路系統出來。此外,因為微控制器系統需要編寫程式去控制整個系統的運轉,因此,又需要紮實的的C語言,資料結構與演算法,作業系統原理等等基礎知識,方能設計出優秀的控制程式出來。綜上總總,學習微控制器應用技術並非是一蹴而就,而是一個反覆實戰應用,總結,反思歸納的過程。掌握的東西越多,看待同樣一個東西眼光就會不一樣。正如修禪一樣,初始時候看山是山,看水是水,一段時間後,看山不是山,看水不是水,而最終有所悟的時候看山還是山,看水還是水。因此對於基礎瞭解不是那麼全面的在校生以及工程師來說,難度不可謂不大。另外一方面,市面上面為了推銷自己的微控制器學習板從而喊出的十天學會微控制器,十天學會XXX的口號,讓整個氛圍都變得異常浮躁。學習者以為真的就是如此簡單,在發現並非如此之後,往往會學習勁頭銳減。因此,若是真的想從事電子相關的行業,一定要摒棄此浮躁心態,不積跬步,無以至千里,不積小流,無以成江河。

    我時常在論壇看到有如此初學者發的帖子,大意如下:照著學習板例程手冊學完了整個微控制器學習板上面的例程,還是感覺沒有底,還是覺得自己啥都沒有學會,到底該如何學習微控制器。歸根到底,就是實際應用的太少,總結反思的太少,想急於求快求成,而忽略了太多基礎的東西。偶爾閒暇的時候,我也會回想起我的學習過程中的那些點點滴滴。那個時候大一,在圖書館瞭解到有如此一個東西之後,立即被吸引,興趣大增。立即自己動手買齊了搭建最小系統的元器件,搭建了第一個微控制器的最小系統。當第一行彙編程式碼被燒寫進微控制器,洞洞板上面的LED按照程式邏輯被點亮時候,那個欣喜的心情至今仍然記得。也許現在的初學者永遠也體會不到我們當年的那個興奮勁。不管怎麼說,興趣始終應該是第一個老師,尤其是在知識更新非常快的電子技術領域,如果沒有足夠的興趣,很難夠靜下心來去學習繁雜紛呈的電子技術知識點。所謂初生牛犢不怕虎,隨後校裡面組織的電子設計大賽,我自己選題,搭建電路,第一次學習用C語言來編寫控制程式(之前都是彙編),在短短十來天的時間裡面,掌握了基本的C語言用法,以及一些程式上面的設計思想(當然是後來總結時候才意識到的,當時就想著如何能夠實現系統所需要的功能),至此便走上了C語言的康莊大道。不得不說,有時候有壓力才能夠更有衝勁。也許沒有給自己設定參加電子設計大賽的目標,我還僅僅只是一個愛好者,後來的進步也許就沒有那麼快。

    今天的學習者是幸福的。因為你們踩在前人的肩上。網路上有足夠多的入門學習所需要的資源。而你只需要投入一腔的熱情以及持之以恆的努力,定當會有所收穫。對於在校的學生來說,因為時間比較充裕,建議最好自己動手搭建整個學習中所涉及到的電路模組,這樣既可以加深認識,又可以提高動手能力和解決分析問題的能力。而對於工程師來說,也是儘可能的多動手,紙上得來終覺淺,踐行相較之下會提高整體認知能力。

    至於選擇何種微控制器的問題,我覺得這個問題並不是太大,畢竟微控制器應用的精髓在於軟硬體配合,電路的設計,軟體設計的技巧與思想方法才是至關重要的。而微控制器只是一個載體罷了。只要精通熟悉了一種,掌握了這些思想與方法,任何微控制器的應用都不是問題。因此,51,AVR, PIC或者MSP430都是不錯的入門選擇物件,在熟悉了這些之後,可以考慮學習CORTEX-M3核心的32位微控制器,擴寬知識面,在工作中應用更加得心應手。至於是否學習ARM9及以上的核心的微控制器,則因人而異了。如果你以後想從事嵌入式linux開發,則可以自行選擇某公司晶片進行學習,涉及ARM9以上的微控制器時候一般都會跑作業系統,如linux系統或及其變種系列或者CE系統等等,注意這裡一般會分兩個方向,一是底層驅動開發,二是上層應用開發。按自己喜好選擇,底層驅動開發則會涉及到系統核心驅動層,以及具體的硬體知識,而上層應用開發則與PC程式設計無太大區別,當然會有很多資源上面的區別,如在設計上層開發時候,系統的效率,記憶體的佔用都是需要考慮的。不建議初學者一上來就學習ARM9 以及作業系統,萬丈高樓平地起,先把基礎打紮實,再去學習則會事半功倍,否則學習過程中很多坎坷會大大打擊你的積極性。

     這一系列的文章不會是簡單的帶你入門認識微控制器,已經有很的資料可以幫助你完成這個入門過程。而我要做的是,讓你更快的轉變思想,從工程師的角度,實際工作開發應用的目的來帶你進階。因此如果有很多概念你不清楚,則你需要自行尋求資料弄明白,這個過程也是學習的過程,只有通過這個過程才會將基礎打紮實。所以我假定你至少對微控制器有所瞭解,對C語言有所瞭解,基本的電子電路知識。剩下的,只需要緊跟我的教程,一步一步的學習。

    學習是一個苦並快樂的過程,貴在持之以恆,那麼,收拾好心情,準備好興趣,讓我們拋掉畏難的心理,一起叩開微控制器程式設計的大門,走向工程師之路。

    從微控制器初學者邁向微控制器工程師之路正式啟程……

    我在等你。