ARM初學(xué)寶典
1,記?。篈RM很簡單,就如從51轉(zhuǎn)換到PIC或者轉(zhuǎn)換到AVR一樣簡單。ARM的一個(gè)功能就如同掌握一個(gè)其他IC的使用一樣,如時(shí)鐘芯片,存在芯片,等等,甚至更簡單。所以ARM的那些功能就可以忽略了。
2,和51系列相比,arm的寄存器不在存儲空間之內(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í),程序會跑到swi中斷處。立即數(shù)包含在該指令代碼中,如果要根據(jù)立即數(shù)執(zhí)行程序必須找出立即數(shù)。
5,ARM的啟動程序及引導(dǎo)地址
你編寫的代碼啟動時(shí):ARM都是從0x00000000開始運(yùn)行。
實(shí)際芯片運(yùn)行時(shí):ARM啟動時(shí),先根據(jù)硬件判斷是否進(jìn)入ISP還是經(jīng)入程序運(yùn)行。如進(jìn)行程序運(yùn)行,又會根據(jù)硬件判斷會從0x00000000內(nèi)部 flash空間,還是外部flash空間0x80000000處運(yùn)行(此時(shí)芯片會自動改變映射,也就是將0x80000000映射到 0x00000000)
在ADS軟件上:ADS軟件會把ARM Linker-Layout-Place at beginning of image-Objiect/symbol中指明開始代碼的文件。
Section中指明代碼開始的程序塊。一般習(xí)慣Objiect/symbol中填寫的時(shí)Startup.o。Section中填寫Start。因?yàn)榇蠹乙话銜㈤_始程序放在Startup文件中的Start段。
ADS軟件知道了我們程序的開始地方,還不知道這個(gè)程序的開始地方放到實(shí)際芯片的那個(gè)地址,所以我們還要為ADS軟件指明開始地址,ARM Linker-Option-Image entry point中指明就行了。
這樣我們自己編寫的代碼、實(shí)際芯片、仿真器程序起始的關(guān)系就差不多明白了,然后記住下面中斷向量表的代碼。
6,地址重新映射
這是個(gè)新概念,但記住它的功能是存儲器映射用于改變從0x00000000開始的中斷向量的映射。記住1:是0x00000000開始的中斷向量的映射;記住2:為什么要這樣做是為了不管你這段程序放在芯片實(shí)際的那個(gè)可以開始放的地方,ARM內(nèi)部都可以從0x00000000開始運(yùn)行。
7,匯編語言與c語言的混合編程
如果你不會這個(gè)先最好了解一點(diǎn)概念
匯編與c的參數(shù)傳遞是靠R0,R1這些寄存器傳遞的。
函數(shù)的返回值也是靠R0。
匯編中的標(biāo)號與函數(shù)名相當(dāng)
c語言函數(shù)結(jié)束時(shí)實(shí)際上是匯編子程序的返回指令,故用匯編語言中用BL調(diào)用c的函數(shù)。否則就會返回出錯。
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è)置。故開始初始化的事情也是蠻的多,主要做那些呢
開始的中斷向量表要做好吧。
每個(gè)處理器模式都有自己的SP,你要指明每個(gè)SP的開始地址,進(jìn)行堆棧的初始化。
初始化外部總線控制
設(shè)置存儲器加速模塊
初始化時(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 ;快速中斷模式堆棧空間
AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;中止義模式堆??臻g
UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;未定義模式堆棧
10,邊看書邊實(shí)踐,不斷培養(yǎng)自己對ARM的興趣,不斷取得點(diǎn)成績,別奢望一口吃成一個(gè)胖子,不斷的給自己帶來成功得快樂,我們都需要短期成績的刺激才能長久的堅(jiān)持。
11,做一個(gè)項(xiàng)目吧。否則永遠(yuǎn)也不能說你學(xué)會了。
12,本文給初學(xué)者指路用,背下本文,然后去看學(xué)習(xí)ARM的書籍,現(xiàn)在網(wǎng)上到處都有的ARM指令集,ARM的芯片資料,ARM應(yīng)用系統(tǒng)開發(fā)詳解,ADS-EasyJTAG,本篇寶典將是你學(xué)習(xí)ARM的加速器。
c語言相關(guān)文章:c語言教程
評論