第一篇:裸機開發學習心得
裸機開發學習心得
首先說明,我沒啥經驗。只是說一下我的體會。也沒有朝誰開火的意思。如果無意傷了誰,還望海涵;如果所言有誤,還請高手多多指教。好了,開始忽悠~~~~~~~~~~~~~~~~ 在論壇里見到好多朋友學習裸機的時候都有一個習慣——做裸機開發時,過度依賴天嵌的裸機測試程序。怎么說呢,我覺得這樣不是很好。尤其是對于一個新手。
也許是學習單片機出身的原因,我有一個毛病,就是對別人的代碼不放心、凡事非得扣到底層。
一開始我看天嵌的裸奔三部曲,有一個體會——越看越迷茫。尤其是簡單地修改了天嵌的程序,實現了顯示幾個自定義圖片的時候。這里也算是給天嵌提一個建議吧。一般來講,新手看到這里的感覺就是特迷茫:難道這就是學裸機程序嗎?修改幾行C代碼?天嵌手冊里說這樣會迅速建立成就感,可是我絲毫沒有。反而感到的是強烈的不安。畢竟天嵌的裸機程序對于一個新手來說太龐大,甚至會搞不清文件之間的關系。我們現在做的就是簡單地修改幾行現成的代碼,然后看看效果。我就在想,此時我只會修改幾行代碼。底層硬件、ARM是如何啟動的、啟動代碼2440init.s是如何支持ARM啟動并跳轉到C函數里的?這些東西都被天嵌的裸奔三部曲教程透明掉了,這些我都不會,我們只是做了做應用層的修改。而那些被透明掉的知識,現在完全都是依賴于天嵌的測試程序的。試想,一旦一天老板讓我做一個新的東西,新的硬件配置,沒有了天嵌裸機程序里的底層知識,我們將如之奈何?基本就廢了吧。
也許是由于原先是搞單片機的緣故,所以總喜歡扣底層,做Linux或者WinCE上層應用的朋友也許會覺得我在這里瞎折騰,做無用功。但是,對于從單片機轉過來的人來說,我說的這些是最重要的——他們要搞清楚ARM是如何工作的,如何用程序去控制硬件,如何靠自己的力氣搭建出來一個裸機程序。和做上層的人不一樣,做底層的人就喜歡扣這些東西,因為這些東西如果搞不懂,那搞其上層來就會覺得發飄,或者說總是不知道地下發生了什么導致心里沒底。最要命的是以后做Linux設備驅動的時候。由于對底層的認識不夠,必將導致非常吃力!
這些天狂啃了一頓啟動代碼2440init.s。忽然意識到,裸機應該換一個方法學。
第一步、狂啃啟動代碼。
啃過之后你就會發現,原來大家在三星原版基礎上改的,然后互相抄,有的甚至都抄錯了。這可能是個痛苦的過程,你要找各種版本的2440init.s,但卻是必經的。一旦走過,你會發現你對ARM底層就有了和以前不是一個深度的理解。以后做起開發來底氣也就足了。這個過程里,你會遇到很多匯編
的基礎,杜春雷的那本《ARM體系結構編程》就是本很不錯的材料。但是千萬記住,你拿它當字典用就行,千萬別運氣下決心要從頭到尾看完。不然你真不知道你是怎么死的。以前還有人說一定要通讀三星手冊,我覺得這跟殺人沒什么兩樣。學習一定要有目的性。當學習啟動代碼遇到問題時,再去查匯編語法和三星手冊時,學習時最快的,記得最牢的。如果漫無目的地通讀。。就算最后你活下來了,你也不知道之前你都看了些什么。。
第二步、跟著啟動代碼跳轉到C程序來。
這個過程就像搞單片機一樣了。自己寫自己的第一個跑馬燈程序、蜂鳴器程序、按鍵中斷程序、定時器、LCD etc etc etc etc etc。最后你再把自己寫的所有的東西組合起來,構建成一個屬于自己的裸機測試程序。經歷過這個過程,你就會發現,原來ARM不是不可戰勝的。原來,你已經一步一步踏實的走過來了。這個時候,你回頭再看一眼天嵌的邏輯測試程序,你就會淡然一笑,哦,這個啊,我自己已經寫出來了。
至此,所謂“成就感”才建立起來。至此,你才可以絲毫不依賴別人地做出自己的東西。至此,你才學到了真正的東西。
因此,在這里我誠懇地向天嵌提出建議。如果寫裸奔教程,請從最底層寫起。貴公司對啟動代碼的介紹少之又少。而完全是在對上層做文章。我想,對于一個ARM新手,不管他之前學沒學過單片機,你讓他過度依賴測試程序的框架做開發,他真的會因為底層基礎不好而發飄,導致以后的全部開發都過度依賴現有的測試程序。從本質上講,他還是沒有學懂裸機。在沒搞懂啟動過程的前提下,就去學習裸機電子鐘之類的東西,結果只有一個字——飄。
我知道天嵌寫教程也要考慮篇幅,也不能面面俱到。面面俱到那真的是強人所難。但是不知道貴公司是否可以考慮換一個思路,換一種引導的方式,哪怕只是寫一個啟動代碼的詳細注釋,已經如何建立一個啟動代碼+LED跑馬燈程序,都足以給用戶一個清晰的方向。以后的教程甚至不寫,用戶也會沿著思路,學會自己搭建起屬于自己的東西,而不是搭建起建立再現有代碼基礎之上的東西。這樣用戶學到的東西才真正會變成自己的。最后,想說選本好的教材,這很重要。不好的教材只能讓你多走彎路。我覺得阿南的那本《ARM Linux入門與實踐》就很不錯,我不是在做廣告,真的不錯。那里多一句廢話不寫,凈撈干的。比如匯編部分,他只介紹了學習啟動代碼所必須掌握的一些指令和偽指令。其他沒用的一概不寫,不像有些書,就會抄DataSheet。
韋東山的《嵌入式Linux應用開發完全手冊》對于裸機部分
寫得其實不是很好,他總喜歡在Linux下搞。而且中斷那里寫得非常不好。我們大多數人還是在ADS下搞的,于是我們一般還都是用啟動代碼來啟動開發板的(搞裸機也不能太裸不是,啟動代碼都自己重新寫就基本可以直接累死了),啟動代碼里的非常漂亮的兩級向量表中斷處理機制韋東山完全沒用到。而且那本書每一章里知識高度濃縮,新手看了容易上頭。而且,凡是號稱什么什么全書的,往往不可能寫得很全。嵌入式技術是一個龐大的體系,怎么可能一本書寫全呢?如果號稱全,則必然不精。
還有,有誰還看中嵌的視頻的就別看了。首先我說,他們已經倒閉了,因為騙錢倒閉的。他們的質量很差,視頻質量也很差。老師就是在念程序或者念DataSheet。講啟動代碼的時候老師屁都不會,之前他們講過匯編語法,講到bootloader的時候,bootloader再干什么一點兒沒講,反而又領著學生復習匯編基本語法,這都忍了,可老師硬說bic指令是跳轉指令。還有,體系亂套。先講Linux,然后將裸機。我都不知道他是不是先拉屎后脫褲子。這種東西最好別看。看完他的視頻再看什么教程都沒法學了。這個和吃完大便之后就再沒食欲吃烤鴨是一個道理。
帖子有的地方有點兒攻擊性,有點兒偏激。再次往誤傷的同胞海涵。如果您覺得我扯了半天都是廢話,您就當這是一陣風飄過,或者這是我半夜的夢話。。
OK,今天就說到這兒吧。困死了,睡了。
第二篇:S3C2440裸機學習心得(完整版)
有什么問題歡迎一起交流。以下是部分心得:
LED
GPXCON中每兩位控制一個引腳:00輸入,01輸出,10特殊功能
初始化 rGPBCON , rGPBUP , rGPBDAT 三個寄存器 關于ADS配置的解釋:
在Target Settings中的Post-linker中選擇ARM fromELF,因為我們需要把ELF文件格式轉化為下載到flash中所必須的二進制文件。
在Language Settings中的所有語言的Target下的Architecture or Processor,選擇ARM920T,因為s3c2440是ARM920T內核。
在ARM Linker中的Output中的RO Base填寫0x30000000,因為在開發板上SDRAM是從0x30000000地址開始。在Layout中的Object/Symbol中填寫2440init.o,它是啟動文件的目標文件,在Section中填寫Init,它是在啟動文件中我們所定義的入口代碼段的名稱。
外部中斷
我們要打開某一中斷的屏蔽,這樣才能響應該中斷,相對應的寄存器為INTMSK; 還要設置外部中斷的觸發方式,如低電平、高電平、上升沿、下降沿等,相對應的寄存器為EXTINTn。
另外由于EINT4到EINT7共用一個中斷向量,EINT8到EINT23也共用一個中斷向量,而INTMSK只負責總的中斷向量的屏蔽,要具體打開某一具體的中斷屏蔽,還需要設置EINTMASK。
有一些中斷是共用一個中斷向量的,而一個中斷向量只能有一個中斷執行函數,因此具體是哪個外部中斷,還需要EINTPEND或rINTOFFSET來判斷
使用__irq這個關鍵詞來定義中斷處理函數,這樣系統會為我們自動保存一些必要的變量,并能夠在中斷處理函數執行完后正確地返回 這種形式:void __irq key();pISR_EINT0=(int)key;
定時器使用
主要配置 :外部時鐘源→通過寄存器MPLLCON得到FCLK→再通過寄存器CLKDIVN得到HCLK和PCLK->再得到定時器的工作頻率
PWM定時器使用:
蜂鳴器=GPB0=TOUT0=定時器0 蜂鳴器 高電平響,低電平不響
關鍵是設置寄存器TCNTBn和TCMPBn,前者可以確定一個計數周期的時間長度,而后者可以確定方波的占空比
定時器中斷使用:
不需要配置TCMPBn,只需TCNTBn,TCNTBn*1/定時器的工作頻率=定時的時間 但要記住中斷要:
void __irq timer0_sever();
pISR_TIMER0=(int)timer0_sever;rINTMSK =~BIT_TIMER0;
Uart
主要配置以下寄存器: UBRDIVn,UCONn,UTRSTATn 收發寄存器: UTXHn,URXHn 注意幾點:
1.對于s3c2440來說,接收數據是被動的,發送數據是主動的,因此一般來說,接收數據用中斷方式,發送數據用查詢方式較好;
2.在中斷方式下,當接收到數據時,盡管可能該數據無用,但也一定要讀取它,否則下次再接收數據時,不會再引起中斷,因為接收數據緩存器被上次接收到的數據所霸占,只要沒有讀取它,它就永遠在那里;
3.由于UART中斷涉及到SUBSRCPND寄存器,因此在中斷處理程序中不僅要清SRCPND寄存器,還要清SUBSRCPND寄存器,它們的順序一定是先清SUBSRCPND寄存器,再清SRCPND寄存器,否則就會引起一個中斷兩次響應的問題。因為是否中斷由SRCPND寄存器決定,而SRCPND寄存器的相關狀態位由SUBSRCPND寄存器決定
簡單的串口控制臺:1.鍵盤輸入數據后在控制臺上進行回顯
recv_data = uart_getc();
return recv_data;
2.讓接收的字符組成命令 data_buf[i] = uart0_scanf();if(data_buf[i] == ' 主站蜘蛛池模板: 久久久久国产精品无码免费看| av无码免费永久在线观看| 婷婷综合久久狠狠色99h| 国产在线无码一区二区三区| 国产一区二区在线影院| 亚洲老熟女与小伙bbwtv| 色欲av久久综合人妻无码| 男女猛烈拍拍拍无挡视频| 婷婷亚洲天堂影院| www无套内射高清免费| 国产日产欧产美| 久久人妻精品白浆国产| 日韩精品无码一区二区三区av| 日本高清一二三不卡区| 无码免费一区二区三区免费播放| 少妇把腿扒开让我舔18| 精品无码日韩国产不卡av| 蜜臀av无码人妻精品| 亚洲 小说 欧美 激情 另类| 999久久久精品国产消防器材| 亚洲视频日本有码中文| 女女女女bbbbbb毛片在线| 亚洲国产一区二区精品无码| 少妇粉嫩小泬喷水视频www| 国产激情无码一区二区| 亚洲熟女综合一区二区三区| 国产性一交一乱一伦一色一情| 少妇内射视频播放舔大片| 99精品国产一区二区三区a片| 欧美 日韩 国产 成人 在线观看| 亚洲成av人片不卡无码手机版| 97伦伦午夜电影理伦片| 18禁网站禁片免费观看| 国产裸体美女视频全黄| 色又黄又爽18禁免费网站现观看| 成熟人妻av无码专区| 亚洲最大av网站在线观看| 国产一区二区三区| 中字幕一区二区三区乱码| 免费网站内射红桃视频| 国产69精品久久久久999小说|