學(xué)習(xí)必備條件:
1、一塊開(kāi)發(fā)板--例如44B0開(kāi)發(fā)板,建議初學(xué)者不要去購(gòu)買那些ARM9體系結(jié)構(gòu)的,因?yàn)樽鳛槌鯇W(xué)者來(lái)說(shuō)ARM9體系的東西是很復(fù)雜的,買塊ARM7的就可以了(先入門,然后再提高);
2、學(xué)習(xí)必備書籍
《Pointer on C》中文名字叫《C和指針》(美)里科|譯者:徐波 前提你的了解C指針吧(這本書時(shí)非常經(jīng)典的書籍,完全可以看中文版的,作者翻譯的非常到位)
《嵌入式實(shí)時(shí)操作系統(tǒng)μCOS-II(第二版)》--邵貝貝翻譯的(不能不承認(rèn)邵貝貝是一個(gè)非常好的翻譯者)
《μC/OS-Ⅱ標(biāo)準(zhǔn)教程》--楊宗德
對(duì)于英文不好的朋友可以購(gòu)買《ARM體系結(jié)構(gòu)與編程》--杜春蕾(該書其實(shí)還是有很多翻譯錯(cuò)誤的,大家在看的時(shí)候要注意一下,但是不可否認(rèn)的是這本書到目前為止算得上是我見(jiàn)過(guò)最好的講解關(guān)于ARM體系結(jié)構(gòu)的書籍了)
對(duì)于英文過(guò)關(guān)的兄弟姐妹可以直接看《ARM+Architecture+Reference+Manual(2nd+Edition)》
3、有條件的兄弟姐妹可以選購(gòu)一個(gè)仿真器 JLINK V8全功能版(這個(gè)的感謝中國(guó)的優(yōu)秀工程師,是他們把原價(jià)1999多的JLINK變成了幾十元錢的東西
4、開(kāi)發(fā)環(huán)境--MDK350或者IARARM
如果要熟悉這些開(kāi)發(fā)環(huán)境,就需要好好讀一些這些開(kāi)發(fā)環(huán)境的手冊(cè)資料,不好意思,這個(gè)就只有英文的了。
以上4個(gè)條件具備下來(lái),可能也不會(huì)超過(guò)500元錢。
下面來(lái)講講我的學(xué)習(xí)經(jīng)歷:
我剛開(kāi)始學(xué)習(xí)的時(shí)候,自己走了不少?gòu)澛罚@里就省略不說(shuō)了。
第一步:在開(kāi)發(fā)板上跑跑簡(jiǎn)單程序
因?yàn)槟阌虚_(kāi)發(fā)板,所以你就先在網(wǎng)上找一下對(duì)應(yīng)開(kāi)發(fā)板上的ARM芯片的datasheet,你都不先搞懂芯片的手冊(cè),又談何讓自己實(shí)現(xiàn)很多功能呢。
熟讀數(shù)據(jù)手冊(cè)后,就盡可能的在開(kāi)發(fā)板上實(shí)現(xiàn)芯片對(duì)應(yīng)的每個(gè)功能,像GPIO實(shí)驗(yàn),UART通訊,I2C,ADC,DAC,PWM,RTC,SPI等等。自己寫自己的程序,然后在開(kāi)發(fā)板上好好實(shí)踐一下。
當(dāng)每個(gè)功能模塊都實(shí)現(xiàn)以后,建議你讓你的開(kāi)發(fā)板實(shí)驗(yàn)一下多個(gè)功能復(fù)合使用,比如用UART打印出ADC的值什么的。
第二步:學(xué)習(xí)uCOS
鑒于你已經(jīng)購(gòu)買了《嵌入式實(shí)時(shí)操作系統(tǒng)μCOS-II(第二版)》,除開(kāi)以下三個(gè)文件:
1、OS_CPU_C.c
2、OS_CPU.H,
3、OS_CPU_A.asm(這個(gè)是MDK環(huán)境下的匯編文件)或OS_CPU_A.a(這個(gè)是IAR開(kāi)發(fā)環(huán)境下的匯編)
這三個(gè)文件的處理機(jī)制暫時(shí)可以不用先了解怎么做的,怎么移植的,以后再說(shuō)
第一次讀這本書時(shí),搞清楚什么是任務(wù),什么是前后臺(tái),為什么要在系統(tǒng)中加入嵌入式操作系統(tǒng)。
第二次讀這本書時(shí),詳細(xì)了解他的TCB(Task Control Block)和ECB(Event Control Block)的數(shù)據(jù)結(jié)構(gòu),搞清楚整個(gè)uCOS的實(shí)現(xiàn)機(jī)制(這里不要先就去看uCOS的移植,這樣只會(huì)讓你云里霧里的)
第三次讀這本書是,詳細(xì)了解信號(hào)量,互斥信號(hào)量、消息隊(duì)列、郵箱和時(shí)間標(biāo)志組
鑒于你又購(gòu)買了《μC/OS-Ⅱ標(biāo)準(zhǔn)教程》,你 可以想在VC++ 6.0開(kāi)發(fā)環(huán)境下實(shí)現(xiàn)對(duì)信號(hào)量,互斥信號(hào)量、消息隊(duì)列、郵箱和事件標(biāo)志組的上機(jī)實(shí)驗(yàn)代碼。
如果還是不能了解uCOS怎么工作的,建議你多看幾遍(我可是足足看了6、7遍了,書都翻得脫頁(yè)了。汗說(shuō)明我很笨,希望各位看官都比我聰明,呵呵)
第三步:建立對(duì)uCOS的初步認(rèn)識(shí)
在網(wǎng)上下載對(duì)應(yīng)你的開(kāi)發(fā)板ARM芯片移植好了文件OS_CPU_C.c,OS_CPU.H,OS_CPU_A.asm(當(dāng)然有的開(kāi)發(fā)板已經(jīng)提供了這樣的基礎(chǔ)實(shí)驗(yàn))
在你的開(kāi)發(fā)板上跑跑uCOS,建立起自己對(duì)于uCOS在ARM7開(kāi)發(fā)板上的認(rèn)識(shí)。
在你所購(gòu)買的ARM7開(kāi)發(fā)板上編寫一個(gè)自己跑uCOS得任務(wù)(這里先不要去搞中斷,初學(xué)者對(duì)于uCOS下的中斷程序設(shè)計(jì)根本就搞不清楚)
第四步:熟悉ARM體系結(jié)構(gòu)
因?yàn)槭腔贏RM7的移植,建議英文不好的去看看這本書《ARM體系結(jié)構(gòu)與編程》(雖然這本書的作者在翻譯時(shí)有很多操作,但是還是建議初學(xué)者去購(gòu)買來(lái)好好看看),對(duì)于英文好的直接在網(wǎng)上下載《ARM+Architecture+Reference+Manual(2nd+Edition)》看就可以了
在看這個(gè)《ARM體系結(jié)構(gòu)與編程》或《ARM+Architecture+Reference+Manual(2nd+Edition)》時(shí),務(wù)必注意多看幾次,了解以下幾個(gè)方面的知識(shí):
1、ARM模式下的指令集
2、Thumd模式下的指令集
3、異常模式及進(jìn)入異常時(shí)ARM如何處理
4、一定能熟悉ARM中的匯編指令
5、熟悉CPSR,R0-R7,R8-R14,R15及在各個(gè)模式下,這些寄存器的映射。
熟悉以后,再來(lái)自己做uCOS的移植了。
第五步:uCOS移植
當(dāng)然在自己編寫代碼做移植uCOS之前,有必要看看別人的移植代碼。
其實(shí)對(duì)于uCOS的移植,我們只需要編寫關(guān)鍵的三個(gè)文件,文件如下:
1、OS_CPU_C.c(堆棧初始化操作OSTaskStkInit函數(shù))
2、OS_CPU.H:完成在該芯片下的數(shù)據(jù)定義,比如什么unsigned char 之類的,注意一下OS_STK和OS_CPU_SR的定義,定義下關(guān)中斷和開(kāi)中斷的方式,有三個(gè)只能選擇1個(gè),ARM芯片一般是定義為第三種方式
3、OS_CPU_A.asm(這個(gè)是MDK環(huán)境下的匯編文件)或OS_CPU_A.a(這個(gè)是IAR開(kāi)發(fā)環(huán)境下的匯編),這個(gè)文件的內(nèi)容就多了,要做以下幾個(gè)函數(shù)的重寫:
1、OSStartHighRdy函數(shù)
2、任務(wù)級(jí)的任務(wù)切換函數(shù)OSCtxSw,
3、中斷級(jí)的任務(wù)切換OSIntCtxSw,其實(shí)只要寫好了OSCtxSw,OSIntCtxSw自然就copy一下就完了(copy的時(shí)候記者要把保存當(dāng)前任務(wù)的寄存器去掉就可以了。
第六步:測(cè)試自己的uCOS移植代碼
第七步:在自己寫的uCOS移植代碼中跑跑任務(wù)。
[分享]ARM初學(xué)者學(xué)習(xí)ARM的步驟
很多人學(xué)完單片機(jī)就想學(xué)arm,但不知如何去學(xué)~現(xiàn)在列出一下學(xué)習(xí)這方面的步驟-----基于linux系統(tǒng)的學(xué)習(xí)步驟如下:(一步步來(lái)哦:)
其實(shí)這也只是個(gè)基礎(chǔ),以后實(shí)際做項(xiàng)目了還要去學(xué)很多
1、Linux 基礎(chǔ)
安裝Linux操作系統(tǒng)
Linux文件系統(tǒng)
Linux常用命令
Linux啟動(dòng)過(guò)程詳解
熟悉Linux服務(wù) 能夠獨(dú)立安裝Linux操作系統(tǒng)
能夠熟練使用Linux系統(tǒng)的基本命令
認(rèn)識(shí)Linux系統(tǒng)的常用服務(wù) 安裝Linux操作系統(tǒng)
Linux基本命令實(shí)踐
設(shè)置Linux環(huán)境變量
定制Linux的服務(wù) Shell 編程基礎(chǔ)使用vi編輯文件
使用Emacs編輯文件
使用其他編輯器
2、Shell 編程基礎(chǔ)
Shell簡(jiǎn)介
認(rèn)識(shí)后臺(tái)程序
Bash編程熟悉Linux系統(tǒng)下的編輯環(huán)境
熟悉Linux下的各種Shell
熟練進(jìn)行shell編程熟悉vi基本操作
熟悉Emacs的基本操作
比較不同shell的區(qū)別
編寫一個(gè)測(cè)試服務(wù)器是否連通的shell腳本程序
編寫一個(gè)查看進(jìn)程是否存在的shell腳本程序
編寫一個(gè)帶有循環(huán)語(yǔ)句的shell腳本程序
3、Linux 下的 C 編程基礎(chǔ)
linux C語(yǔ)言環(huán)境概述
Gcc使用方法
Gdb調(diào)試技術(shù)
Autoconf
Automake
Makefile
代碼優(yōu)化 熟悉Linux系統(tǒng)下的開(kāi)發(fā)環(huán)境
熟悉Gcc編譯器
熟悉Makefile規(guī)則編寫Hello,World程序
使用 make命令編譯程序
編寫帶有一個(gè)循環(huán)的程序
調(diào)試一個(gè)有問(wèn)題的程序
4、嵌入式系統(tǒng)開(kāi)發(fā)基礎(chǔ)
嵌入式系統(tǒng)概述
交叉編譯
配置TFTP服務(wù)
配置NFS服務(wù)
下載Bootloader和內(nèi)核
嵌入式Linux應(yīng)用軟件開(kāi)發(fā)流程
熟悉嵌入式系統(tǒng)概念以及開(kāi)發(fā)流程
建立嵌入式系統(tǒng)開(kāi)發(fā)環(huán)境制作cross_gcc工具鏈
編譯并下載U-boot
編譯并下載Linux內(nèi)核
編譯并下載Linux應(yīng)用程序
4、嵌入式系統(tǒng)移植
Linux內(nèi)核代碼
平臺(tái)相關(guān)代碼分析
ARM平臺(tái)介紹
平臺(tái)移植的關(guān)鍵技術(shù)
移植Linux內(nèi)核到 ARM平臺(tái) 了解移植的概念
能夠移植Linux內(nèi)核移植Linux2.6內(nèi)核到 ARM9開(kāi)發(fā)板
5、嵌入式 Linux 下串口通信
串行I/O的基本概念
嵌入式Linux應(yīng)用軟件開(kāi)發(fā)流程
Linux系統(tǒng)的文件和設(shè)備
與文件相關(guān)的系統(tǒng)調(diào)用
配置超級(jí)終端和MiniCOM 能夠熟悉進(jìn)行串口通信
熟悉文件I/O 編寫串口通信程序
編寫多串口通信程序
6、嵌入式系統(tǒng)中多進(jìn)程程序設(shè)計(jì)
Linux系統(tǒng)進(jìn)程概述
嵌入式系統(tǒng)的進(jìn)程特點(diǎn)
進(jìn)程操作
守護(hù)進(jìn)程
相關(guān)的系統(tǒng)調(diào)用了解Linux系統(tǒng)中進(jìn)程的概念
能夠編寫多進(jìn)程程序編寫多進(jìn)程程序
編寫一個(gè)守護(hù)進(jìn)程程序
sleep系統(tǒng)調(diào)用任務(wù)管理、同步與通信 Linux任務(wù)概述
任務(wù)調(diào)度
管道
信號(hào)
共享內(nèi)存
任務(wù)管理 API 了解Linux系統(tǒng)任務(wù)管理機(jī)制
熟悉進(jìn)程間通信的幾種方式
熟悉嵌入式Linux中的任務(wù)間同步與通信
編寫一個(gè)簡(jiǎn)單的管道程序?qū)崿F(xiàn)文件傳輸
編寫一個(gè)使用共享內(nèi)存的程序
7、嵌入式系統(tǒng)中多線程程序設(shè)計(jì)
線程的基礎(chǔ)知識(shí)
多線程編程方法
線程應(yīng)用中的同步問(wèn)題了解線程的概念
能夠編寫簡(jiǎn)單的多線程程序編寫一個(gè)多線程程序
8、嵌入式 Linux 網(wǎng)絡(luò)編程
網(wǎng)絡(luò)基礎(chǔ)知識(shí)
嵌入式Linux中TCP/IP網(wǎng)絡(luò)結(jié)構(gòu)
socket 編程
常用 API函數(shù)
分析Ping命令的實(shí)現(xiàn)
基本UDP套接口編程
許可證管理
PPP協(xié)議
GPRS 了解嵌入式Linux網(wǎng)絡(luò)體系結(jié)構(gòu)
能夠進(jìn)行嵌入式Linux環(huán)境下的socket 編程
熟悉UDP協(xié)議、PPP協(xié)議
熟悉GPRS 使用socket 編寫代理服務(wù)器
使用socket 編寫路由器
編寫許可證服務(wù)器
指出TCP和UDP的優(yōu)缺點(diǎn)
編寫一個(gè)web服務(wù)器
編寫一個(gè)運(yùn)行在 ARM平臺(tái)的網(wǎng)絡(luò)播放器
9、GUI 程序開(kāi)發(fā)
GUI基礎(chǔ)
嵌入式系統(tǒng)GUI類型
編譯QT
進(jìn)行QT開(kāi)發(fā)熟悉嵌入式系統(tǒng)常用的GUI
能夠進(jìn)行QT編程使用QT編寫“Hello,World”程序
調(diào)試一個(gè)加入信號(hào)/槽的實(shí)例
通過(guò)重載QWidget 類方法處理事件
10、Linux 字符設(shè)備驅(qū)動(dòng)程序
設(shè)備驅(qū)動(dòng)程序基礎(chǔ)知識(shí)
Linux系統(tǒng)的模塊
字符設(shè)備驅(qū)動(dòng)分析
fs_operation結(jié)構(gòu)
加載驅(qū)動(dòng)程序了解設(shè)備驅(qū)動(dòng)程序的概念
了解Linux字符設(shè)備驅(qū)動(dòng)程序結(jié)構(gòu)
能夠編寫字符設(shè)備驅(qū)動(dòng)程序編寫Skull驅(qū)動(dòng)
編寫鍵盤驅(qū)動(dòng)
編寫I/O驅(qū)動(dòng)
分析一個(gè)看門狗驅(qū)動(dòng)程序
對(duì)比Linux2.6內(nèi)核與2.4內(nèi)核中字符設(shè)備驅(qū)動(dòng)的不同
Linux 塊設(shè)備驅(qū)動(dòng)程序塊設(shè)備驅(qū)動(dòng)程序工作原理
典型的塊設(shè)備驅(qū)動(dòng)程序分析
塊設(shè)備的讀寫請(qǐng)求隊(duì)列了解Linux塊設(shè)備驅(qū)動(dòng)程序結(jié)構(gòu)
能夠編寫簡(jiǎn)單的塊設(shè)備驅(qū)動(dòng)程序比較字符設(shè)備與塊設(shè)備的異同
編寫MMC卡驅(qū)動(dòng)程序
分析一個(gè)文件系統(tǒng)
對(duì)比Linux2.6內(nèi)核與2.4內(nèi)核中塊設(shè)備驅(qū)動(dòng)的不同
11、文件系統(tǒng)
虛擬文件系統(tǒng)
文件系統(tǒng)的建立
ramfs內(nèi)存文件系統(tǒng)
proc文件系統(tǒng)
devfs 文件系統(tǒng)
MTD技術(shù)簡(jiǎn)介
MTD塊設(shè)備初始化
MTD塊設(shè)備的讀寫操作了解Linux系統(tǒng)的文件系統(tǒng)
了解嵌入式Linux的文件系統(tǒng)
了解MTD技術(shù)
能夠編寫簡(jiǎn)單的文件系統(tǒng)為 ARM9開(kāi)發(fā)板添加 MTD支持
移植JFFS2文件系統(tǒng)
通過(guò)proc文件系統(tǒng)修改操作系統(tǒng)參數(shù)
分析romfs 文件系統(tǒng)源代碼
創(chuàng)建一個(gè)cramfs 文件系統(tǒng)