1. 首頁
  2. 心得體會

嵌入式學習的心得體會

嵌入式學習的心得體會

導語:嵌入式是指以應用為中心,以計算機為基礎,並且軟硬體可裁剪,適用於對功能、可靠性、成本、體積和功耗有嚴格要求的專用計算機系統。下面是小編給大家整理的嵌入式學習的心得體會,希望能給你帶來幫助!

本人本科學的是電子資訊工程專業,其實這個專業和嵌入式沒有多大的關係,要說有關係就是簡單的講了下C語言語法,學完之後還不知道什麼是C語言,只記住了char,int,long等佔幾個位元組,if, while,for迴圈什麼的,感覺也就能算一些小學就會的題目,全國計算機二級C語言也就糊塗的過了。我這個專業沒學過C++,一開始不知道什麼是面向物件,這可能會讓人笑話了。不過這說的是實話,本科的時候,學院安排的課程大部分偏硬體部分,動手機會比較多,自然而然比較喜歡硬體方面。

在大二的時候就聽學長說,微控制器很難學,那時候經學長介紹,淘寶買了本郭天祥老師出的書《51微控制器C語言教程》,一開始還真是不怎麼懂,感覺有點像是看天書,然後硬著頭皮去看,當我把51的結構看完了,就不像一開始那樣一頭霧水了,自己在紙上把51的結構圖默畫一遍,然後再把各個暫存器功能寫一下,各個功能口的結構粗略畫了下,然後覺得51整體已在我心中了,雖然沒有什麼作用,但是至少懂得這門課要怎麼去學習。其實有些時候不是這個東西你不會,而是在不會的時候自己先告訴自己這個太難了,自己先放棄了。

在大三的時候,第一學期課比較少,我就經常待在圖書館,會去蠻看些專業相關的書籍,現在想想,那時候也是機緣巧合下,看到了一本書《從51到ARM》,講述的是從51系列微控制器的一般知識出發,將arm處理器和51系列微控制器進行對比,引導讀者去理解和學習arm處理器的知識。那個時候也有考慮到以後就業的問題,就想到一件事情,如果去應聘工作的話,每個工科院校電子資訊類的畢業生都會異口同聲地說:我會51系列微控制器。當他說這句話的時候,他和別人是站在同一起跑線上的。可我們完全有可能和別人不站在同一起跑線上。正是這本書給我開啟了另外一扇大門,讓我初步瞭解了嵌入式。後來去報考全國計算機等級考試三級教程——嵌入式系統開發技術,在圖書館奮鬥了兩個月,最後取得優秀的成績,也讓我進一步瞭解嵌入式系統。

在大四的時候,我們有嵌入式的選修課,不過當時因為考研的緣故,就沒有去上過這門課,好可惜呀!但是,在選擇讀研研究方向的時候我還是毅然選擇了嵌入式方向,我知道這將成為我未來三年研究的方向。這學期(研一下學期),很開心能夠再次接觸嵌入式系統這門課程,對於導師教的這門課程,我覺得自己上課還是蠻認真聽講的,當然也被師在臺上那講得頭頭是道,溫文儒雅的風姿所吸引。對於沒有學過微機8086的我,有些時候,老師用微機與嵌入式的對比讓我頭腦沒有相關概念...

首先,我對嵌入式在概念上有了一個比較精確的瞭解。嵌入式是指以應用為中心,以計算機為基礎,並且軟硬體可裁剪,適用於對功能、可靠性、成本、體積和功耗有嚴格要求的專用計算機系統。它由硬體平臺和系統軟體組成。硬體平臺指嵌入式處理器和與之透過介面連線的外圍硬體平臺。系統軟體是指實時作業系統和使用者應用軟體。

談到硬體部分,我首先想到的是嵌入式處理器那些外圍功能模組。對於這部分的學習,我當初花了好長時間看《深入淺出ARM7——LPC2400》這本書,現在想想覺得自己學習方法沒用對,完全沒有那個必要,自己卻花了大把時間在看這些暫存器引腳的使用,因為單純的看過之後還是很容易忘的,之後在進行實驗的時候還是翻書來查就證明了這一點。不過一些最基本的模組,例如通用輸入/輸出口(GPIO),通用非同步收發器(UART),向量中斷控制器(VIC),外部中斷輸入和定時器/計數器還是需要看書認真去記住那些常用的引腳功能。對於CPU異常這部分,我一開始以為異常就是中斷,因為處理程式流程設計是相似的,都是請求處理器打斷正常的程式執行流程,進入特定程式的一種機制。當時還對老師提出的一個看法有點疑義,51可以處理中斷巢狀而ARM處理器卻不能?我當時腦子裡面就在想:中斷不都是有硬體裝置產生的,那按常理來講ARM處理器也可以處理的呀。後來在認真查書,發現CPU異常有7種:復位,資料中止,中斷,快中斷,預取中止,未定義,軟體中斷。而異常向量會使CPU轉入異常入口地址執行程式,開始了異常處理。同理的話,中斷向量使CPU轉入中斷入口地址執行程式,開始了中斷處理。即當發生IRQ中斷時,程式返回地址被存入該IRQ中斷模式下的LR,如果繼續發生IRQ中斷,那第二次的中斷返回地址也還是被存入該IRQ中斷模式下的LR中,那先前發生中斷時候存入的程式返回地址將被覆蓋掉,導致不能返回正確的位置。在我解決這個問題的期間,每次睡前思維準會定格在這問題上,久久不能繞出來,其實有時候查書還是最好的解決方案,因為網路資源只能提供給我們部分的參考資料。

對於ARM組合語言這部分的學習,我認為是需要重視的,學彙編不是說用這語言做多牛逼的事情, 問題的關鍵在於, 學透了彙編會使你真正理解計算機。另外一方面,只要以後在嵌入式工作中你遲早會在某個陰暗的角落裡遇到彙編。“不管你承認不承認, 現在的CPU沒有直接跑高階語言的, 哪怕是虛擬機器也都是類似彙編的指令集.當遇到崩潰分析, 效能最佳化甚至編譯器抽風等等的時候, 彙編是你最後一根救命稻草(這句話是福來師兄講的)。”為此他給了我們一份資料,周立功lpc21xx/lpc22xx系列ARM7啟動程式碼分析,主要講述的是startup.s檔案的分析,看了下才發現老師上課講的那個啟動程式碼分析很多不理解之處這裡都有詳細的介紹,這分析太精闢了。

學 ARM7這麼久,我認為從硬體上講,一方面就是學習介面電路設計,另一方面就是學習彙編和C語言的板級程式設計。如果從軟體上講,就是要學習基於ARM處理器的作業系統層面 的驅動和移植。這些對於我們初學者來說必須明確,要麼從硬體著手開始學,要麼從作業系統的熟悉到應用開始學,但不管學什麼,只要不是純的作業系統級,硬體的暫存器類的東西還是要能看懂的,基於板級的彙編和C程式設計還是要會的。

μC/OS-II 是一種基於優先順序的搶佔式多工實時作業系統,包含了實時核心、任務管理、時間管理、任務間通訊同步(訊號量,郵箱,訊息佇列)和記憶體管理等功能。它可以使各個任務獨立工作,互不干涉,很容易實現準時而且無誤執行,使實時應用程式的設計和擴充套件變得容易,使應用程式的設計過程大為減化。μC /OS-II是一個完整的、可移植、可固化、可裁剪的佔先式實時多工核心。μC/OS-II絕大部分的程式碼是用ANSI的C語言編寫的,包含一小部分彙編程式碼,使之可供不同架構的微處理器使用。

μC/OS-II可以大致分成核心結構、任務管理、時間管理、任務之間通訊與同步4個部分。核心結構是作業系統的處理核心,包括作業系統初始化、作業系統執行、中斷進出的前導、時鐘節拍、任務排程、事件處理等多部分。任務管理部分中的內容都是與任務的操作密切相關的。包括任務的建立、刪除、掛起、恢復等等。因為μC/OS-II是以任務為基本單位排程的,所以這部分內容也相當重要。μC/OS-II中的最小時鐘單位是timetick(時鐘節拍),任務延時等操作是在時間管理這部分完成的。任務之間通訊與同步為事件處理部分,包括訊號量、郵箱、郵箱佇列、事件標誌等部分;主要用於任務間的互相聯絡和對臨界資源的訪問。μC/OS-Ⅱ作業系統是在main()中建立的,首先要系統初始化,OSInit(),初始化系統所有的變數和資料結構。然後進行任務的建立,OSTaskCreate();之後進行多工的啟動,OSStart()。在進行任務的並行處理的時候,一個任務的程式是順序執行的,而不同任務的程式卻是並行執行的。從應用程式的觀點來看,此處的並行處理只是一個假象。而實際上它是透過實時作業系統的核心控制任務之間的切換來實現的,也就是任務排程啦。

μCOS-Ⅱ總是執行進入就緒態任務中優先順序最高的那一個。當建立新任務時,或當前任務呼叫一些可能把自己掛起的系統函式(如OSMBoxPend)時,核心就要進行任務切換。在上述的場合,任務級的排程是由函式OSSched()完成的。

在一個多工的應用工程中,任務之間並不是完全獨立的,它們存在一些需相互配合的處理,這些相互配合是靠任務間的通訊或同步,訊號量、郵箱、訊息佇列可以實現這種任務與任務,任務與中斷服務函式間的通訊與同步。

郵箱可以使一個任務或者中斷服務子程式向另一個任務傳送一個指標型的'變數。而訊號量不可以,其只能傳送訊號量。訊息佇列可以使一個任務或者中斷服務子程式向另一個任務傳送以指標方式定義的變數。因具體的應用有所不同,每個指標指向的資料結構變數也有所不同,實際上,我們可以將訊息佇列看作多個郵箱組成的陣列,只是它們共用一個等待任務列表。

我們實驗所用的ARM開發工具是ADS1.2。ARMADS全稱為ARM Developer Suite,是ARM公司推出的新一代ARM整合開發工具。現在ADS的最新版本是1.2,支援軟體除錯及JTAG硬體模擬除錯、支援彙編、C語言、C++源程式,具有編譯效率高、系統庫功能強等特點。在安裝ADS1.2的時候出現過小問題,當時我的電腦是64位的,安裝完之後顯示不了,後來百度查詢到原因,竟然是資料夾放錯地方,應該放在Program Files(x86)這個資料夾中。後來有同學問我這方面的問題,但是發現他們的ADS1.2安裝不了的原因是因為Licence弄錯了。在開啟CodeWarrior for ARM Developer Suite的時候,一定要記得選DebugInChipRAM,否則Make都出現很多error,而且那些幾乎都是未定義函式的錯誤。之後就進行Debug,除錯成功之後會跳出AXD的介面,選擇Options裡面的ConfigureTarget,再新增H-JTAG的檔案,之後點選GO,程式會跳出組合語言的介面,再點選下就跳到C語言程式入口地址,之後再點選下GO,程式就開始跑起來。前面所述的這些步驟是理想情況下程式自身沒有發生錯誤,當然在除錯過程中,還是有很多硬體上的問題,一方面是有些開發板可能用久了,用JTAG並口連線的時候接觸不良,很容易自動掉線,常出現未連線裝置的的Error,還有一方面是跑程式過程常會出現相容性的問題,導致程式AXD除錯時候會出現卡在某個部分一直進入死迴圈,這個後來是解決了,但是偶爾還是會出現這個BUG。

透過這學期對嵌入式的學習,我發現自己尚未掌握的知識點還是蠻多的,尤其是對μC/OS-II的移植方面,我只是理論上粗略瞭解,沒有經過實驗的操作。還有對儲存器加速模組(MAM)這方面不夠了解,主要一方面當初在做訊息佇列採集實驗(KeySem_SampdataQeue),這個模組被代替掉,不需要使用它,所以後來也沒有去掌握相關知識點。對於任務就緒演算法這部分,我只是上課的時候聽“懂”了,課後自己再看完全懵了。對於CAN匯流排除錯的部分,老師上課沒有講到這部分的介紹與應用,但是後來透過自己對實驗室師兄們所做的課題初步瞭解,發現我自己有必要去弄懂它的構造和原理。

“看書不要希望一次就會,一次就明白是什麼意思,也不要死記硬背,看不明白也沒關係,以後遇到了知道去哪裡去找就可以了,以後遇到的多了,也就記住了,遇到的少的,忘記也就忘記了。”依然記得當初不懂怎麼解決某個問題的時候請教李碩師兄,師兄對我說的這番話。自己在μC/OS-II這部分內容掙扎了好久,現在想想,覺得當初不應該一上來就直接閱讀核心原始碼,看了一些自己把頭撞破也想不明白的事,這樣直接正面打擊我學習嵌入式的積極性。學習啊,還是得要循序漸進。如果你想學習嵌入式一定要有塊學習板。看再多的影片,看再多的書,也不如自己動手試一下,看著很簡單的東西,做起來就可能遇到很多的問題,遇到問題找到原因,解決問題,只有這樣才能學到東西。記得我第一次仿寫led的驅動,想自己試一下,可是自己一試,就出了好多的問題,那個led弄了我一天才把led燈點亮。所以不要眼高手低。

對於初學者,有一點小建議,我們拿到一個開發板,很興奮也很激動,想法自然也很多,想用開發板實現自己的這個想法,實現那個想法,然後又不知道從何下手,然後就去論壇中發一個貼,最後等著別人去回覆,當見沒人回覆就開始抱怨。這種做法是不可取的,有想法是好的,我們要實現自己的想法也是有前提的,首先,我們對這部分知識瞭解嗎?如果不瞭解就去google一下(最好別用百度,不太好用),瞭解了一些,也就大概知道要怎麼做了。如果再遇到問題,再去發貼問,這樣也顯得咱們有水平。比如自己連串列埠是什麼都不太清楚呢,就問串列埠通訊怎麼做啊,就是人家把程式碼給咱,咱也不明白是怎麼回事啊。見多識廣,熟能生巧。多看程式碼,要從程式碼中讀出程式碼的意思來。自己平時也要多寫程式碼,多練習(這一點我做的不好,寫的少)。

最後,我想說的是嵌入式系統的學習和研究一旦我們達到了一定的水平後,其實很簡單,就是如何去看CPU和相關晶片的Datasheet!