自學經歷

 晚上無事翻了翻以前的資料和筆記,突然發現了幾年前寫的日記,關於自學arm、linux時候的,拿出來曬曬大笑...

 

2009-4-28

這個項目是最簡單也最經典的實驗項目了“跑馬燈”。其實寫這個程序並沒什麼難的,難就難在這時我在這套開發板上跑起來的第一個程序,需要搭建一個開發平臺,從4/19號板子回來就開始看書,看原理圖,上網找資料,到現在不到10天的時間裏,我基本上搞懂了ARM裸跑程序是如何運行的了。

17號在網上訂購了兩本ARM書籍,加上從朋友那裏借了一本ARM的書,然後就開始看,剛開始我還想先看一週書再去買開發板子做,因爲那樣理論要了解了一些,但是我看了兩天後才明白,這樣不行,自己的資料不是很多,網上要去下載的話也要費時間。所以19號親自去南山那面買了套板子回來。這兩天期間我是先看了江湖上流傳的中嵌教育的ARM嵌入式培訓視頻,我只看了拿其中的3集,講ARM體系結構的,本來想看完指令系統,結果那兩集視頻真好沒有聲音,就放那裏了。

買回來開發板子,人家帶的資料就是齊全,而且裏面還有我在鐵驢上下的那十幾個G的中嵌視頻呢。而且還有各種編譯聯接,調試,下載軟件,省去了我很多力氣啊。

這段時間看了學的東西太多了,反正現在時瞭解了ARM是怎麼一回事,鑑於目前還沒有打算在操作系統下編程,所以暫時會在ARM上裸跑一段時間,就是要深入熟悉ARM的片內資源的應用,之後再去加上操作系統,聽說這兩種東西完全是兩碼事。

學了這麼久一下這幾點是需要注意的:

1.    在看資料的時候,如果某些東西自己努力理解還是迷糊的話,最好跳過去,接着往下看,或與某天你就突然明白了。

2.    多看網上的資料,參考被人的經驗,但是也不要完全相信別人的話,自己要思考,多前後聯繫着想,這樣才能將所學知識聯繫起來。

3.    ARM理論的學習,最好先看ARM體系結構和編程結構,寄存器,存儲系統,電源時鐘,最小系統電路一定要先弄明白。至於外設功能者可以先放一邊,以後用的時候在學。上面弄懂之後,就開始看ARM的彙編語言,這個一定要看,而且是認真的搞懂,以後在分析啓動代碼,bootloader的時候就不是那麼費力了。

4.    認識你的開發板,認真分析板子的原理圖,至少在剛開始的時候要把ARM最小系統的電路圖分析透徹。比如ARM引腳定義,外掛存儲器的訪問方法,存儲器芯片的信息,電源,時鐘,都有什麼引腳被外擴出來以供用戶使用等。其他的先暫時不管

5.    開發平臺的搭建:編輯,編譯,調試仿真,下載,這些工具軟件的應用和設置方法,有時開發板上帶的下載工具自己電腦不能使用的話,就要另外想辦法。我的開發板是帶了一個簡易的並口JTAG板,以供調試下載程序用,但是我的主機上沒有並口,只有串口和USB,剛開始把我急壞了,趕緊打電話給開發板供貨商,他說現在網上很多賣一種叫JLINK的東西,是USB口的,功能一樣,一百多快錢。所以我又風塵僕僕得買了個這個東西回來。剛開始不怎麼會用,不過沒事,照着說明書上的做一遍就會了。另外還有就是這幾個工具軟件之間的設置問題,多看點資料就會了,沒什麼難的。

6.    對於自己寫程序,開始自己不是很會寫工程,這樣你可以先拷貝一份板子上帶的測試程序過來,現在你就需要開始研究啓動代碼之類的東西了,就是在進入Main()主函數之前CPU都做了什麼事情,這些事必不可少的,而且是必須整明白的,要不然學了也是白學。

7.    比較難理解的就是那個映像文件的初始化過程了,我都還是琢磨了幾天纔在某天豁然想通的呢。

呵呵,先寫這麼多吧,也記錄一下我的自學過程,反正在這10天我做的事還是比較多的,像全部寫下也是不可能的,只有檢主要的寫了。

昨晚纔開始決定要寫跑馬燈程序的(不過我是兩天之前就在研究啓動代碼了),昨天調試下載都還是存在問題的,今天就改了改主函數的東西,很快就調通了。

明天可以把今天的bin文件燒到板子上運行一下,練習一下燒程序。

接下來的話準備把按鍵加上,熟悉熟悉中斷。。。

 

2009-5-9

從1號開始調中斷鍵盤,開始是學習理論知識了,反正就是熟悉與外部中斷有關的寄存器,在這之前,分析啓動代碼的時候就已經把異常中斷時如何執行就搞清楚了的,所以就很快把中斷這部分的理論學會了。

接下來就是寫代碼,其實也是有參照被人的代碼在寫自己的代碼。想的是一定要把之前的【跑馬燈程序加進來一起湊合更大個工程。

第一天把代碼寫好,第二天回來調了一天,開始出現的問題是中斷異常已經進入,不過進入的服務程序地址不對,也是偶然湊巧我在一本書上看見了下面的話:當處理器產生中斷時,pc會指向0x00的地址開始處的中斷向量表,再通過中斷向量表再找到最終的服務程序。我最先是在nor flash啓動下,程序下載到SDRAM中進行調試的,後來看了這句話一想,不對哦,nor flash 裏板子在出廠的時候就已經燒寫了super vivi的bios程序,它裏面的中斷向量表初始化的情況和我自己寫的中斷鍵盤的初始化情況又不一樣,當然程序會跑到一個莫名其妙的地方了。就這樣我把原來的跑馬燈工程燒到nand flash 裏去,然後從nand啓動,把程序下載到SDRAM中頻那個調試,因爲一上電nand裏的前4k的程序都會拷貝到0x00開始的4k空間裏去,當然這裏面就包含了完整的未初始化的中斷向量表了。異常發生後,pc就會指向自己程序設置的地址了。

接下來可以進入中斷了,但是全速運行時,中斷仍然看不到,很簡單,在終端服務程序中加一個延時就可以再全速時看到。

接下來的三四天都在絞盡腦汁地搞全局標誌位的問題,在單步時很正確,一全速就不不變了。

到最後終於把罪魁禍首找到了,原來是我鍵盤抖動的問題沒有處理,硬件是廠家做好的,沒有做硬件區抖,要是我自己做的話或許就會加上一個RS電路去抖。當然就只有在軟件上消除了,而且這個還和以前做51的不一樣,以前只要加一個延時10ms的就可以了,現在ARM不一樣了,加了還是不管用,後來上網上一查,有人提供一種方法就是多次採樣,判斷是否按鍵穩定後再做處理,而且最後一定要等釋放鍵完成後再退出中斷處理程序

到目前爲止,鍵盤這一塊是基本解決了。現在按鍵還是比較好用,在調試的時候是有一個兩個按鍵不好用,估計是按鍵的差別了。不過在我燒些進nand裏去之後再運行,每個鍵的話就一樣了。呵呵

    接下來的任務就是:使用定時器,AD,串口,pwm

 

 

2009-5-12

用了兩天的時間9、10號用了ARM的定時器驅動蜂鳴器,加上了之前的鍵盤和led顯示,倒是沒有花太多時間去調試就成功了,還是比較簡單。

現在的問題就是我的程序現在寫的越來越大,至少大於4k了,現在需要將這麼大的程序寫入nand flash裏去的話,就需要修改啓動代碼或者直接應用現成的bootloader去將nand裏的程序複製到SDRAM裏去執行,這個工程就是我接下來的任務了,搞清楚如何複製。

 

 

2009-5-19

經過這麼時間的琢磨,終於將複製nand數據的代碼加進了啓動代碼中,並且成功地將12號調試出來的程序燒錄到nand,然後啓動,結果在意料之中。呵呵,這一切來的不容易。首先我研究了一下2440的數據手冊上寫的關於nand控制器的內容,瞭解到nand錢4k的代碼是位置無關代碼,這是在編譯連接時都已經確定了的,所以一上電,硬件自動加載錢4k代碼到settpingstone中運行,在這4k代碼中有一段代碼是將nand中的全部程序複製到SDRAM中去的,之後通過一條ldr  pc, =copy_proc_beg僞指令跳轉到SDRAM運行。總之就是前期的工作週期比較長,研究透了之後就簡單了,中間的過程還要感謝我在網上蒐集到的資料。

接下來的任務就是要實現串口通信了,因爲現在顯示的話還沒有太多精力去做,但是顯示這一塊的話又不能少,所以就決定先做串口了,通過電腦來顯示信息。

 

 

2009-5-25

快一週了吧,就這個週末纔有時間去真正地靜下心來寫程序,上一週都忙着加班和看書了,前天寫了一天的串口,昨天呢,又遇到了編譯的問題,主要是時序和變量類型的問題了,不過也是整了一天的時間呢,今天下了個早班,就是想把這玩意給調出來,真是老天不負啊,剛開始用的pc自帶的DNW串口軟件,遇到了顯示換行的問題,無論我怎麼改程序都不管用,後來我想起以前我們用過一種串口調試助手,我又將其翻出來,一用,嘿嘿,居然換行ok了。

現在都11點過了,今天肯定是燒寫不了了,明天吧,明天還要把另外2個串口加在一起也調一下,之後再燒到nandi去運行,不過這次的程序好大,其實主要是vsprintf()這個庫函數太大了。

繼續努力…………………………………..

 

 

2009-5-28

    串口終於全部完成了,而且還把以前遺留的一個pwm的問題給解決了(關閉蜂鳴器的時候有時按鍵不管用,頻率編程另外的值)。前些天只是在串口精靈上實現了發送操作,但是一直沒有實現接收字符串,然後回寫到電腦上的。之後我還了很多方案,包括調整接收方式,改成查詢接收,還改成先中斷然後查詢接收,改過先接受到字符數組裏,然後利用發送中斷髮送出去。這些都沒有改善效果,這些天上班的時候我都在想這個接收流程,最後發現時在接收過程中出了問題,而且還是發送程序也參合到裏面去了,所以後來我檢查了中斷裏的判斷語句,開始以爲是中斷標誌要和狀態標誌位一起查詢來判斷,後來按照這樣修該了之後還是那樣的效果,後來實在沒有辦法了,纔將清除子標誌寄存器的相應位的清除語句放在了其他兩個標誌位清除之前,這樣就正確了。最後的總結就是,在中斷裏面清除標誌位的時候還是有一定得先後順序的,要不然會引起時序的混亂的。另外一個問題就是之前遺留下來的pwm定時器的問題了,也是在關斷的時候關不斷pwm的輸出,今天才發現還是將GP口初始化位置不是很合適,改成在關斷的時候,關閉定時器,關閉定時中斷,將相應輸出口設置成輸入方式,然後在打開pwm的時候再做相反的工作,即可。

    接下來的事情該做AD轉換和RTC了。

 

 

2009-06-02

    今天終於把AD轉換和RTC的做出來了,具體實現的功能在功能說明的文檔裏寫的很詳細。總之,調試這個地方不是很複雜。出現了一些問題都在很短的時間攻破了。在調試RTC的時候,剛開始是時間顯示不出來,也就是在調用uart_printf()中的串口中斷和定時器T1發生衝突,但是在所有的串口中只有UART1纔可以和t1進行調整優先級順序,所以後來把程序中所有用到中斷的地方的優先級排了個順序,之後就OK了。另外在緊挨着的兩次串口調用之間需要加延時程序,否則會出現亂碼顯示。另外在每次AD轉換之前都需要設置ADCCON寄存器。

    接下來的話主要有以下幾項任務:LCD和觸摸屏顯示,IIS音頻,IIC串行通訊,USB,網絡串口。同時還需接觸操作系統方面的知識。

 

2009-07-4

    一個月沒寫了,今天就把這一個月的經歷補上吧

 

2009-06-03

    開始學習2440的LCD控制器的知識,主要是控制信號和時序,還有先關寄存器的設置。接下來就是在ADS中寫LCD的驅動程序了,兩天後程序出來了,就是實現了靜態顯示圖片,然後在屏幕上劃線和矩形之類的,之後開始在AXD中調試,不過一上電就黑屏了,不知道怎麼回事。就在這幾天,我正好也開始在外面找工作了,所以在接下來的2周內就沒有怎麼調試這個LCD顯示程序了。在這兩週的找工作時間裏我發現了什麼呢?想做嵌入式的話,必須要會操作系統,哪怕你只熟悉一種linux或者wince或者vxwork也好,反正你要懂操作系統纔是硬道理。所以在6月21號之後我就下決心開始學習linux操作系統了。對於ARM的裸奔,我自己覺得是沒有什麼問題的了,其實對於單純的ARM這塊片子如果不加操作系統的話就是個單片機,和8位的差不多,但是還是有很多不一樣的地方了。對於裸機編程主要理解一下幾個部分:都什麼資源外設;時鐘電源管理單元;存儲系統(存儲結構,sram,sdram,nand flash,nor flash,還有存儲單元的編址);啓動代碼(包括nand+sdram組合時代碼的搬運實現);映像文件的裝載域和運行域(這個很重要,分幾種情況,代碼是否大於4k,和是直接裝在到ram中還是燒錄到flash中,情況都不同);中斷控制器(工作原理,主要是相關寄存器的設置了,中斷很多,不過使用起來不是很難的,和51的差不多,寫個中斷鍵盤,做個定時器控制的流水燈,或驅動一下蜂鳴器,頻率可變的那種,最後再玩玩UART串口,adc模數轉換,RTC時鐘系統)這些都和中斷有關的;Lcd控制器(不過我還沒來的及去調試它的邏輯程序呢)觸摸屏顯示,IIS音頻,IIC串行通訊,USB,網絡串口。後面的我都沒時間去做裸機程序就開始學習linux了,等差不多之後就在操作系統之下實現這些設備的驅動吧。

 

2009-6-21

    今天開始接觸linux操作系統了

    第一步是要先在我的pc機上裝一個linux操作系統,開始的5-6天都是在網上找一些資料學習怎麼裝雙系統,最主要是分區這個事情把我的時間浪費地多一些了,不過幾天之後我還真明白了裝雙系統分區要改怎麼分了呢。首先是在網上下載linux的3張安裝鏡像文件ISO格式的,後來再下了個分區魔術師和一個酷客DOS工具箱,裝上之後,我準備先在分區魔術師裏面將裝linux的10G空間先分出來,但是在這裏我碰到了2個問題沒有解決掉:1.我在現有xp的d盤裏分去了10G的空間,此時這個10G的空間還是fat分區,還是xp的DOS分區,我不知道怎麼把這個10G的分區從DOS分區中刪除,在網上沒找到答案。2我分好之後,xp系統只要一重啓我xp下面的硬盤都被還原了,就像沒有分過區一樣。但是我又瞭解到可以不事先分區,待在linux安裝的過程中要提示你分區操作的,這裏你只要選擇手動分區就可以了,然後之後在原來XP的系統d盤中分出一些空間作爲linux的根分區,root分區,swpe分區,然後再格式化成ext3或ext2格式的就可以了。但是我在DOS環境下(xp下沒有純dos環境,用的是網上下載的DOS工具箱,這裏必須學幾個DOS下的簡單命令了,dir,cd等)運行安裝文件的時候,出來的安裝界面和網上介紹的教程出現的圖片不一樣,之後讓我選從什麼安裝,這裏我選硬盤驅動器後,結果找不到相應的硬盤驅動器,我搞了一天之後實在不行,朋友建議我裝了一個虛擬機操作系統,然後我就開始在網上找如何安裝虛擬機linux操作系統,結果搜了一大堆,意思就是先在xp下面裝個虛擬機軟件,然後新建一個虛擬機平臺,在新建的嚮導中會要求你設置這臺虛擬pc機的各種配置。設置好後,一臺新的美裝任何操作系統的pc就擺在這裏了,接下來的工作就是安裝linux系統了。在安裝的過程中有幾個重要地方需要說明:

1.    在分區選擇時,選擇自動分區,爲什麼不是手動分區呢?因爲這臺虛擬pc機時一個全新的pc,不用擔心破壞其他任何pc中已存在的文件和系統。

2.    在設置root根口令的時候,在第一次輸入時可能會提示你的口令太短或者不匹配,這個不用管,等第二次輸完就沒有了。因爲你在輸入的過程中系統在自動檢測兩個輸入區的字符是否相同。

3.    在最後安裝的時候會出現兩次換碟的提示,這個時候,使用ctrl+alt將鼠標切換到xp下,在VMware界面的右下角有個光盤的圖標,雙擊打開出現對話框,然後換上第二張或第3張盤。這之後還不能馬上點擊確定,還需要在這個光盤圖標上單擊左鍵,點其中的disconnect,將其改成connect,之後在點擊確定。

就這樣我把linux系統裝上了,不過顯示屏幕的大小隻有800x600,這點不爽外,其他還好,速度沒什麼影響的。虛擬機其實挺好的,在以後開發的時候方便,可以再xp和linux之間切換。但是現在我的linux還是不能上網,這個問題待解決。

2009-6-29

    接下我花了3天的時間跟着教學視頻學習linux下的命令,還不錯,現在是比較熟悉了,呵呵,不過還要多加練習,幸好我找了個小本本記下來了。Shell編程和設備管理都學了,不過現在還是不怎麼能理解那些管理功能。沒事,慢慢來嘛。

2009-7-3

    昨天晚上看完shell編程和設備管理之後就已經半夜一點了,但是當時我是特別想把我linux的網絡配置好。

參考: 在VMware的 linux虛擬機下如何配置網絡.doc

       虛擬機VMware for linux 的網絡配置.doc

    現在我的linux可以上網了

 

2009-07-05

    Linux下的網絡功能:saba服務和nfs服務,實現linux與windows系統的文件共享,linux主機和客戶機之間的文件共享(貌似在以後的嵌入式調試中就是用這種方法來共享pc linux環境下的文件共享給開發板客戶機的)。

    目前可以在windows下訪問linux的共享目錄,但是還沒有找到linux下訪問windows的目錄呢,正在努力中。nfs服務已經全部搞定(具體做法參見筆記本上的記錄)。

    Linux和windows下的文件下載我是下載了一個flashFXP軟件完成的,很好用的。

 

2009-7-25

    真的很抱歉呀,過了20天的時間纔想起來回顧一下這短時間來所學的知識了。不過話說回來,學的東西還是挺多的,雖然每天基本上是12點才睡覺的,甚至有時候1點2點才睡覺,就想現在一樣,都快2點了,不過沒辦法,我這個人就是這樣,做不出來我就睡不着,除非是十分困,纔會去睡覺的,要不然一定搞完。

    這幾天爲了搞清楚本機、虛擬機、2440開發板的聯網,我都沒怎麼睡好覺。不過還是挺值得的,下面這一個連接文件就是我這幾天來的心血啊。

開發板、虛擬機、本機的互聯筆記.doc

 

現在目前只是實現了互相ping通,還沒有開始實際的網絡功能呢,明天就開始吧!

 

2009-7-5----2009-7-20

這段時間裏呢,主要是學習虛擬機上的linux的各種知識了,包括進程創建管理,進程間通信,通訊方式呀,管道,信號量,共享內存,還有linux的系統調用及文件系統的調用,設備文件的訪問,最後來了一個串口的編程。幸好以前大學時候上過一學期的操作系統課程,所以纔不是很陌生,要不然。。嘿嘿!不過目前學的還不是很深入,畢竟我也不會去專門從事linux系統下的工作,只是爲了以後的開發板移植,相信以後會,慢慢深入瞭解的。加油!

    Come on baby!

 

 

明天之後的工作就是在虛擬機和開發板之間進行了,當然也是離不開本機的。

 

 

2009-7-28

近三天來主要完成了連個任務,一個是虛擬機和mirco2440開發板的nfs,telnet,ftp的連接,最主要的是nfs功能的實現,這些東西的實現都在下面的幾篇日記裏面:

虛擬機linux和開發板的nfs連接筆記.doc

在xp下面使用telnet遠程登錄開發板.doc

使用FTP傳遞文件.doc

 

 

另外一個就是交叉編譯環境的搭建。目前基本上有三種搭建的方法:

方法一 分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。該方法相對比較困難,適合想深入學習構建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用方法二或方法三構建交叉工具鏈。

方法二 通過Crosstool腳本工具來實現一次編譯生成交叉編譯工具鏈,該方法相對於方法一要簡單許多,並且出錯的機會也非常少,建議大多數情況下使用該方法構建交叉編譯工具鏈。

方法三 直接通過網上(ftp.arm.kernel.org.uk)下載已經製作好的交叉編譯工具鏈。該方法的優點不用多說,當然是簡單省事,但與此同時該方法有一定的弊端就是侷限性太大,因爲畢竟是別人構建好的,也就是固定的沒有靈活性,所以構建所用的庫以及編譯器的版本也許並不適合你要編譯的程序,同時也許 會在使用時出現許多莫名的錯誤。

我這裏是用的第三種最簡單的,使用開發板廠商自帶的交叉編譯工具鏈,實際上他們是編譯好的工具,在linux目錄下解壓後就可以使用的。最後在在配置文件裏設置一下環境變量就可以了。

使用現成的交叉編譯工具鏈的方法.doc

讓Linux知道arm-Linux-gcc編譯器的存在.doc

 

 

在這之後停了,去一家公司做單片機開發,再後來就發生了後來的事情...
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章