新聞中心

ARM初學(xué)寶典

——
作者: 時(shí)間:2007-05-29 來(lái)源: 收藏
一直都在聽(tīng)說(shuō)有多么好,有多神奇,有多難學(xué)。故學(xué)它時(shí)都興奮加恐懼。呵呵,我剛好用也有一段時(shí)間了。寫點(diǎn)東西給的初學(xué)者,希望能起到幫助作用。
1,記?。篈RM很簡(jiǎn)單,就如從51轉(zhuǎn)換到PIC或者轉(zhuǎn)換到AVR一樣簡(jiǎn)單。ARM的一個(gè)功能就如同掌握一個(gè)其他IC的使用一樣,如時(shí)鐘芯片,存在芯片,等等,甚至更簡(jiǎn)單。所以ARM的那些功能就可以忽略了。
2,和51系列相比,arm的寄存器不在存儲(chǔ)空間之內(nèi),而且不分?jǐn)?shù)據(jù)、程序空間。記住它的分配圖.
3,ARM有多種處理器模式,每個(gè)模式都有自己的獨(dú)立
   記住表格
   記住寄存器的使用
4,ARM的中斷加強(qiáng)了,增加了軟件中斷,掌握swi
   可以把處理器模式及異??闯啥际侵袛嗟臄U(kuò)張,從這些方面去理解也許快些。
   swi是嵌入式系統(tǒng)中任務(wù)切換的一個(gè)關(guān)鍵指令。故先有個(gè)心里準(zhǔn)備。用法:swi 立即數(shù)。執(zhí)行該執(zhí)行時(shí),程序會(huì)跑到swi中斷處。立即數(shù)包含在該指令代碼中,如果要根據(jù)立即數(shù)執(zhí)行程序必須找出立即數(shù)。
5,ARM的啟動(dòng)程序及引導(dǎo)地址
   你編寫的代碼啟動(dòng)時(shí):ARM都是從0x00000000開(kāi)始運(yùn)行。
   實(shí)際芯片運(yùn)行時(shí):ARM啟動(dòng)時(shí),先根據(jù)硬件判斷是否進(jìn)入ISP還是經(jīng)入程序運(yùn)行。如進(jìn)行程序運(yùn)行,又會(huì)根據(jù)硬件判斷會(huì)從0x00000000內(nèi)部 flash空間,還是外部flash空間0x80000000處運(yùn)行(此時(shí)芯片會(huì)自動(dòng)改變映射,也就是將0x80000000映射到 0x00000000)
   在ADS軟件上:ADS軟件會(huì)把ARM Linker-Layout-Place at beginning of image-Objiect/symbol中指明開(kāi)始代碼的文件。
Section中指明代碼開(kāi)始的程序塊。一般習(xí)慣Objiect/symbol中填寫的時(shí)Startup.o。Section中填寫Start。因?yàn)榇蠹乙话銜?huì)將開(kāi)始程序放在Startup文件中的Start段。
   ADS軟件知道了我們程序的開(kāi)始地方,還不知道這個(gè)程序的開(kāi)始地方放到實(shí)際芯片的那個(gè)地址,所以我們還要為ADS軟件指明開(kāi)始地址,ARM Linker-Option-Image entry point中指明就行了。
   這樣我們自己編寫的代碼、實(shí)際芯片、仿真器程序起始的關(guān)系就差不多明白了,然后記住下面中斷向量表的代碼。
6,地址重新映射
   這是個(gè)新概念,但記住它的功能是存儲(chǔ)器映射用于改變從0x00000000開(kāi)始的中斷向量的映射。記住1:是0x00000000開(kāi)始的中斷向量的映射;記住2:為什么要這樣做是為了不管你這段程序放在芯片實(shí)際的那個(gè)可以開(kāi)始放的地方,ARM內(nèi)部都可以從0x00000000開(kāi)始運(yùn)行。
7,匯編語(yǔ)言與c語(yǔ)言的混合編程
   如果你不會(huì)這個(gè)先最好了解一點(diǎn)概念
   匯編與c的參數(shù)傳遞是靠R0,R1這些寄存器傳遞的。
   函數(shù)的返回值也是靠R0。
   匯編中的標(biāo)號(hào)與函數(shù)名相當(dāng)
   c語(yǔ)言函數(shù)結(jié)束時(shí)實(shí)際上是匯編子程序的返回指令,故用匯編語(yǔ)言中用BL調(diào)用c的函數(shù)。否則就會(huì)返回出錯(cuò)。
8,匯編指令的記憶
   多了幾種尋址方式
   先記住基本指令然后進(jìn)行擴(kuò)展,在記指令的執(zhí)行條件,在搞懂特性符合的意義,如!,^等
我先是記住了以下幾個(gè)指令:B,BX,BL,LDR,STR,LDM,STM,MOV,MRS,MSR,DCD,SWI,ADD,AND,CMP,MUL這些指令后,以后就邊用邊記。
9,ARM初始化要干些什么
   ARM初始化靈活方式,很多功能都可以方便設(shè)置。故開(kāi)始初始化的事情也是蠻的多,主要做那些呢
   開(kāi)始的中斷向量表要做好吧。
   每個(gè)處理器模式都有自己的SP,你要指明每個(gè)SP的開(kāi)始地址,進(jìn)行堆棧的初始化。
   初始化外部總線控制
   設(shè)置存儲(chǔ)器加速模塊
   初始化時(shí)鐘,初始化VIC等等,當(dāng)然有很多你不必管,先拷貝
   在網(wǎng)上找資料就行了。中斷向量表與初始化堆棧一般如下
;中斷向量表
Reset
        LDR     PC, ResetAddr
        LDR     PC, UndefinedAddr
        LDR     PC, SWI_Addr
        LDR     PC, PrefetchAddr
        LDR     PC, DataAbortAddr
        DCD     0xb9205f80           ;ARM保留位,使向量表所有數(shù)據(jù)32位累加和為0,才能脫機(jī)運(yùn)行。
        LDR     PC, [PC, #-0xff0]    ;
        LDR     PC, FIQ_Addr

ResetAddr           DCD     ResetInit
UndefinedAddr       DCD     Undefined
SWI_Addr            DCD     SoftwareInterrupt
PrefetchAddr        DCD     PrefetchAbort
DataAbortAddr       DCD     DataAbort
Nouse               DCD     0  ;
IRQ_Addr            DCD     0  ;
FIQ_Addr            DCD     FIQ_Handler

;未定義指令
Undefined
        B       Undefined

;軟中斷
SoftwareInterrupt
        B       SoftwareInterrupt

;取指令中止
PrefetchAbort
        B       PrefetchAbort

;取數(shù)據(jù)中止
DataAbort
        B       DataAbort

;快速中斷
FIQ_Handler
        STMFD   SP!, {R0-R3, LR}
        BL      FIQ_Exception
        LDMFD   SP!, {R0-R3, LR}
        SUBS    PC,  LR,  #4

;初始化堆棧

InitStack   
        MOV     R0, LR

;設(shè)置管理模式堆棧
        MSR     CPSR_c, #0xd3
        LDR     SP, StackSvc
;設(shè)置中斷模式堆棧
        MSR     CPSR_c, #0xd2
        LDR     SP, StackIrq
;設(shè)置快速中斷模式堆棧
        MSR     CPSR_c, #0xd1
        LDR     SP, StackFiq
;設(shè)置中止模式堆棧
        MSR     CPSR_c, #0xd7
        LDR     SP, StackAbt
;設(shè)置未定義模式堆棧
        MSR     CPSR_c, #0xdb
        LDR     SP, StackUnd
;設(shè)置系統(tǒng)模式堆棧
        MSR     CPSR_c, #0xdf
        LDR     SP, =StackUsr

        MOV     PC, R0

StackSvc           DCD     SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4  ;
StackIrq           DCD     IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4
StackFiq           DCD     FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4
StackAbt           DCD     AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4
StackUnd           DCD     UndtStackSpace + (UND_STACK_LEGTH - 1)* 4

        AREA    MyStacks, DATA, NOINIT, ALIGN=2
SvcStackSpace      SPACE   SVC_STACK_LEGTH * 4  ;管理模式堆??臻g
IrqStackSpace      SPACE   IRQ_STACK_LEGTH * 4  ;中斷模式堆??臻g
FiqStackSpace      SPACE   FIQ_STACK_LEGTH * 4  ;快速中斷模式堆??臻g
AbtStackSpace      SPACE   ABT_STACK_LEGTH * 4  ;中止義模式堆??臻g
UndtStackSpace     SPACE   UND_STACK_LEGTH * 4  ;未定義模式堆棧
10,邊看書(shū)邊實(shí)踐,不斷培養(yǎng)自己對(duì)ARM的興趣,不斷取得點(diǎn)成績(jī),別奢望一口吃成一個(gè)胖子,不斷的給自己帶來(lái)成功得快樂(lè),我們都需要短期成績(jī)的刺激才能長(zhǎng)久的堅(jiān)持。
11,做一個(gè)項(xiàng)目吧。否則永遠(yuǎn)也不能說(shuō)你學(xué)會(huì)了。
12,本文給初學(xué)者指路用,背下本文,然后去看學(xué)習(xí)ARM的書(shū)籍,現(xiàn)在網(wǎng)上到處都有的ARM指令集,ARM的芯片資料,ARM應(yīng)用系統(tǒng)開(kāi)發(fā)詳解,ADS-EasyJTAG,本篇寶典將是你學(xué)習(xí)ARM的加速器。

c語(yǔ)言相關(guān)文章:c語(yǔ)言教程




關(guān)鍵詞: ARM

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉