ARM基礎(chǔ)知識(shí)強(qiáng)烈推薦_第1頁(yè)
ARM基礎(chǔ)知識(shí)強(qiáng)烈推薦_第2頁(yè)
ARM基礎(chǔ)知識(shí)強(qiáng)烈推薦_第3頁(yè)
ARM基礎(chǔ)知識(shí)強(qiáng)烈推薦_第4頁(yè)
ARM基礎(chǔ)知識(shí)強(qiáng)烈推薦_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、ARM基礎(chǔ)知識(shí)(強(qiáng)烈推薦).txt有誰(shuí)會(huì)對(duì)著自己的褲襠傻笑。不敢跟他說(shuō)話卻一遍一遍打開他的資料又關(guān)上。用了心旳感情,真旳能讓人懂得很多事。如果有一天,我的簽名不再頻繁更新,那便證明我過(guò)的很好。ARM基礎(chǔ)知識(shí)(強(qiáng)烈推薦)ARM基礎(chǔ)知識(shí)一ARM處理器共有37個(gè)寄存器。其中包括: *31個(gè)通用寄存器,包括程序計(jì)數(shù)器(PC)在內(nèi)。這些寄存器都是32位寄存器。 *6個(gè)狀態(tài)寄存器。這些寄存器都是32位寄存器。 ARM處理器共有7種不同的處理器模式,每一種模式中都有一組相應(yīng)的寄存器組。在任何時(shí)刻,可見(jiàn)的寄存器包括15個(gè)通用寄存器(R0-R14),一個(gè)或兩個(gè)狀態(tài)寄存器及程序計(jì)數(shù)器(PC)。在所有的寄存器中,有

2、些是各模式公用一個(gè)物理寄存器,有一些寄存器各模式擁有自己獨(dú)立的物理寄存器。 通用寄存器 *8 通用寄存器分為以下三類:備份寄存器、未備份寄存器、程序計(jì)數(shù)器PC 未備份寄存器 未備份寄存器包括R0-R7。對(duì)于每一個(gè)未備份寄存器來(lái)說(shuō),所有處理器模式下都是使用同一個(gè)物理寄存器。未備份寄存器沒(méi)有被系統(tǒng)用于特別的用途,任何可采用通用寄存器的場(chǎng)合都可以使用未備份寄存器。 備份寄存器 對(duì)于R8-R12備份寄存器來(lái)說(shuō),每個(gè)寄存器對(duì)應(yīng)兩個(gè)不同的物理寄存器。系統(tǒng)為將備份寄存器用于任何的特殊用途,但是當(dāng)中斷處理非常簡(jiǎn)單,僅僅使用R8-R14寄存器時(shí),F(xiàn)IQ處理程序可以不必執(zhí)行保存和恢復(fù)中斷現(xiàn)場(chǎng)的指令,從而可以使中斷

3、處理非常迅速。 對(duì)于R13,R14備份寄存器來(lái)說(shuō),每個(gè)寄存器對(duì)應(yīng)六個(gè)不同的物理寄存器,其中的一個(gè)是系統(tǒng)模式和用戶模式共用的;另外的五個(gè)對(duì)應(yīng)于其他的五種處理器模式。采用下面的記號(hào)來(lái)區(qū)分各個(gè)物理寄存器: R13_<MODE> 其中MODE可以是下面幾種模式之一:usr,svc,abt,und,irq,fiq 程序計(jì)數(shù)器PC 可以作為一般的通用寄存器使用,但有一些指令在使用R15時(shí)有一些限制。由于ARM采用了流水線處理器機(jī)制,當(dāng)正確讀取了PC的值時(shí),該值為當(dāng)前指令地址值加上8個(gè)字節(jié)。也就是說(shuō),對(duì)于ARM指令集來(lái)說(shuō),PC指向當(dāng)前指令的下兩條指令的地址。由于ARM指令是字對(duì)齊的,PC值的第0

4、位和第一位總為 0。 需要注意的是,當(dāng)使用str/stm保存R15時(shí),保存的可能是當(dāng)前指令地址值加8個(gè)字節(jié),也可能保存的是當(dāng)前指令地址值加12個(gè)字節(jié)。到底哪種方式取決于芯片的具體設(shè)計(jì)。對(duì)于用戶來(lái)說(shuō),盡量避免使用STR/STM指令來(lái)保存R15的值。 當(dāng)成功的向R15寫入一個(gè)數(shù)值時(shí),程序?qū)⑻D(zhuǎn)到該地址執(zhí)行。由于ARM指令是字對(duì)齊的,寫入R15的值應(yīng)滿足bits1:0為0b00,具體要求arm個(gè)版本有所不同: *對(duì)于arm3以及更低的版本,寫入R15的地址值bits1:0被忽略,即寫入r15的地址值將及0xFFFF FFFC做及操作。 *對(duì)于ARM4以及更高的版本,程序必須保證寫入R15的地址值bi

5、ts1:0為0b00,否則將產(chǎn)生不可預(yù)知的后果。 對(duì)于Thumb指令集來(lái)說(shuō),指令是班子對(duì)齊的,處理器將忽略bit0。ARM基礎(chǔ)知識(shí)二程序狀態(tài)寄存器 CPSR(當(dāng)前程序狀態(tài)寄存器)在任何處理器模式下被訪問(wèn)。它包含了條件標(biāo)志位、中斷禁止位、當(dāng)前處理器模式標(biāo)志以及其他的一些控制和狀態(tài)位。每一種處理器 模式下都有一個(gè)專用的物理狀態(tài)寄存器,稱為SPSR(備份程序狀態(tài)寄存器) 。當(dāng)特定的異常中斷發(fā)生時(shí),這個(gè)寄存器用于存放當(dāng)前程序狀態(tài)寄存器的內(nèi)容。在異常中斷退出時(shí),可以用SPSR來(lái)恢復(fù)CPSR。由于用戶模式和系統(tǒng)模式不是異常 中斷模式,所以他沒(méi)有SPSR。當(dāng)用戶在用戶模式或系統(tǒng)模式訪問(wèn)SPSR,將產(chǎn)生不可預(yù)

6、知的后果。 CPSR格式如下所示。SPSR和CPSR格式相同。 31 30 29 28 27 26 7 6 5 4 3 2 1 0 N Z C V Q DNM(RAZ) I F T M4 M3 M2 M1 M0 *條件標(biāo)志位* N本位設(shè)置成當(dāng)前指令運(yùn)算結(jié)果的bit31的值。當(dāng)兩個(gè)表示的有符號(hào)整數(shù)運(yùn)算時(shí),n=1表示運(yùn)算結(jié)果為負(fù)數(shù),n=0表示結(jié)果為正書或零。 zz=1表示運(yùn)算的結(jié)果為零;z=0表示運(yùn)算的結(jié)果不為零。對(duì)于CMP指令,Z=1表示進(jìn)行比較的兩個(gè)數(shù)大小相等。 C下面分四種情況討論C的設(shè)置方法: 在加法指令中(包括比較指令CMP),當(dāng)結(jié)果產(chǎn)生了進(jìn)位,則C=1,表示無(wú)符號(hào)運(yùn)算發(fā)生上溢出;其他情

7、況C=0。 在減法指令中(包括減法指令CMP),當(dāng)運(yùn)算中發(fā)生錯(cuò)位,則C=0,表示無(wú)符號(hào)運(yùn)算數(shù)發(fā)生下溢出;其他情況下C=1。 對(duì)于包含移位操作的非加堿運(yùn)算指令,C中包含最后一次溢出的的位的數(shù)值 對(duì)于其他非加減運(yùn)算指令,C位的值通常不受影響 V對(duì)于加減運(yùn)算指令,當(dāng)操作數(shù)和運(yùn)算結(jié)果為二進(jìn)制的補(bǔ)碼表示的帶符號(hào)數(shù)時(shí),V=1表示符號(hào)為溢出;通常其他指令不影響V位。 *Q標(biāo)識(shí)位* 在ARM V5的E系列處理器中,CPSR的bit27稱為q標(biāo)識(shí)位,主要用于指示增強(qiáng)的dsp指令是否發(fā)生了溢出。同樣的spsr的bit27位也稱為q標(biāo)識(shí)位,用于在異常中 斷發(fā)生時(shí)保存和恢復(fù)CPSR中的Q標(biāo)識(shí)位。 在ARM V5以前的

8、版本及ARM V5的非E系列的處理器中,Q標(biāo)識(shí)位沒(méi)有被定義。 *CPSR中的控制位* CPSR的低八位I、F、T、M4:0統(tǒng)稱為控制位。當(dāng)異常中斷發(fā)生時(shí)這些位發(fā)生變化。在特權(quán)級(jí)的處理器模式下,軟件可以修改這些控制位。 *中斷禁止位:當(dāng)I=1時(shí)禁止IRQ中斷,當(dāng)F=1時(shí)禁止FIQ中斷 *T控制位:T控制位用于控制指令執(zhí)行的狀態(tài),即說(shuō)明本指令是ARM指令還是Thumb指令。對(duì)于ARM V4以更高版本的T系列ARM處理器,T控制位含義如下: T=0表示執(zhí)行ARM指令 T=1表示執(zhí)行Thumb指令 對(duì)于ARM V5以及更高版本的非T系列處理器,T控制位的含義如下 T=0表示執(zhí)行ARM指令 T=1表示強(qiáng)

9、制下一條執(zhí)行的指令產(chǎn)生未定指令中斷 *M控制位* M控制位控制處理器模式,具體含義如下: M4:0 處理器模式 可訪問(wèn)的寄存器 ob10000 user pc,r14r0,CPSR 0b10001 FIQ PC,R14_FIQ-R8_FIQ,R7R0,CPSR,SPSR_FIQ 0b10010 IRQ PC,R14_IRQ-R13_IRQ,R12R0,CPSR,SPSR_IRQ 0B10011 SUPERVISOR PC,R14_SVC-R13_SVC,R12R0,CPSR,SPSR_SVC 0b10111 ABORT PC,R14_ABT-R13_ABT,R12R0,CPSR,SPSR_AB

10、T 0b11011 UNDEFINEED PC,R14_UND-R8_UND,R12R0,CPSR,SPSR_UND 0b11111 SYSTEM PC,R14-R0,CPSR(ARM V4以及更高版本) *CPSR中的其他位* 這些位用于將來(lái)擴(kuò)展。應(yīng)用軟件不要操作這些位。ARM基礎(chǔ)知識(shí)三在ARM體系中通常有以下3種方式控制程序的執(zhí)行流程: *在正常執(zhí)行過(guò)程中,每執(zhí)行一條ARM指令,程序計(jì)數(shù)器(PC)的值加4個(gè)字節(jié);每執(zhí)行一條Thumb指令,程序計(jì)數(shù)器寄存器(PC)加2個(gè)字節(jié)。整個(gè)過(guò)程是按順序執(zhí)行 *跳轉(zhuǎn)指令,程序可以跳轉(zhuǎn)到特定的地址標(biāo)號(hào)處執(zhí)行,或者跳轉(zhuǎn)到特定的子程序處執(zhí)行。其中,B指令用于執(zhí)

11、行跳轉(zhuǎn)操作;BL指令在執(zhí)行跳轉(zhuǎn)操作同時(shí),保存子程 序的返回地址;BX指令在執(zhí)行跳轉(zhuǎn)操作同時(shí),根據(jù)目標(biāo)地址為可以將程序切換到Thumb狀態(tài);BLX指令執(zhí)行3個(gè)操作,跳轉(zhuǎn)到目標(biāo)地址處執(zhí)行,保存子程序的返回 地址,根據(jù)目標(biāo)地址為可以將程序切換到Thumb狀態(tài)。 *當(dāng)異常中斷發(fā)生時(shí),系統(tǒng)執(zhí)行完當(dāng)前指令后,將跳轉(zhuǎn)到相應(yīng)的異常中斷處理程序處執(zhí)行。當(dāng)異常中斷處理程序執(zhí)行完成后,程序返回到發(fā)生中斷指令的下條指 令處執(zhí)行。在進(jìn)入異常中斷處理程序時(shí),要保存被中斷程序的執(zhí)行現(xiàn)場(chǎng),從異常中斷處理程序退出時(shí),要恢復(fù)被中斷程序的執(zhí)行現(xiàn)場(chǎng)。ARM基礎(chǔ)知識(shí)四ARM中異常中斷的種類 *復(fù)位(RESET)* 當(dāng)處理器復(fù)位引腳有效

12、時(shí),系統(tǒng)產(chǎn)生復(fù)位異常中斷,程序跳轉(zhuǎn)到復(fù)位異常中斷處理程序處執(zhí)行。復(fù)位異常中斷通常用在下面幾種情況下:系統(tǒng)加電時(shí);系統(tǒng)復(fù)位時(shí);跳轉(zhuǎn)到復(fù)位中斷向量處執(zhí)行成為軟復(fù)位。 *未定義的指令* 當(dāng)ARM處理器或者是系統(tǒng)中的協(xié)處理器認(rèn)為當(dāng)前指令未定義時(shí),產(chǎn)生未定義的指令異常中斷,可以通過(guò)改異常中斷機(jī)制仿真浮點(diǎn)向量運(yùn)算。 *軟件中斷* 這是一個(gè)由用戶定義的中斷指令??捎糜谟脩裟J较碌某绦蛘{(diào)用特權(quán)操作指令。在實(shí)時(shí)操作系統(tǒng)中可以通過(guò)該機(jī)制西線系統(tǒng)功能調(diào)用。 *指令及取終止(PrefechAbort)* 如果處理器預(yù)取的指令的地址不存在,或者該地址不允許當(dāng)前指令訪問(wèn),當(dāng)被預(yù)取的指令執(zhí)行時(shí),處理器產(chǎn)生指令預(yù)取終止異常中

13、斷。 *數(shù)據(jù)訪問(wèn)終止(DATAABORT) 如果數(shù)據(jù)訪問(wèn)指令的目標(biāo)地址不存在,或者該地址不允許當(dāng)前指令訪問(wèn),處理器產(chǎn)生數(shù)據(jù)訪問(wèn)終止異常中斷 *外部中斷請(qǐng)求(IRQ)* 當(dāng)處理器的外部中斷請(qǐng)求引腳有效,而且CPSR的寄存器的I控制位被清除時(shí),處理器產(chǎn)生外部中斷請(qǐng)求異常中斷。系統(tǒng)中個(gè)外設(shè)通過(guò)該異常中斷請(qǐng)求處理服務(wù)。 *快速中斷請(qǐng)求(FIQ)* 當(dāng)處理器的外部快速中斷請(qǐng)求引腳有效,而且CPSR的F控制位被清除時(shí),處理器產(chǎn)生外部中斷請(qǐng)求異常中斷 異常中斷向量表及異常中斷優(yōu)先級(jí) 中斷向量表指定了個(gè)異常中斷及其處理程序的對(duì)應(yīng)關(guān)系。他通常存放在存儲(chǔ)地址的低端。在ARM體系中,異常中斷向量表的大小為32字節(jié),

14、其中每個(gè)異常中斷占據(jù)4個(gè)字節(jié)大小,保留了4個(gè)字節(jié)空間。 每個(gè)異常中斷對(duì)應(yīng)的中斷向量表中的4個(gè)字節(jié)的空間中存放了一個(gè)跳轉(zhuǎn)指令或者一個(gè)向PC寄存器中賦值的數(shù)據(jù)訪問(wèn)指令。通過(guò)這兩種指令,程序?qū)⑻D(zhuǎn)到相應(yīng)的異常中斷處理程序處執(zhí)行。當(dāng)幾個(gè)異常中斷同時(shí)發(fā)生時(shí),就必須按照一定的次序來(lái)處理這些異常中斷。 各個(gè)異常中斷的中斷向量地址以及中斷的處理優(yōu)先級(jí) 中斷向量地址 異常中斷類型 異常中斷模式 優(yōu)先級(jí)(6最低) 0x00 復(fù)位 特權(quán)模式 1 0x04 未定義的指令 未定義指令終止模式 6 0x08 軟件中斷 特權(quán)模式 6 0x0C 指令預(yù)取終止 終止模式 5 0x10 數(shù)據(jù)訪問(wèn)終止 終止模式 2 0x14 保留

15、 未使用 未使用 0x18 外部中斷請(qǐng)求 IRQ模式 4 0x1C 快速中斷請(qǐng)求 FIQ模式 3ARM基礎(chǔ)知識(shí)五在應(yīng)用程序中安裝異常中斷處理程序 1.使用跳轉(zhuǎn)指令:可以在異常中斷對(duì)應(yīng)異常向量表中特定位置放置一條跳轉(zhuǎn)指令,直接跳轉(zhuǎn)到該異常中斷的處理程序。這種方法有一個(gè)缺點(diǎn),即只能在32M空間范圍內(nèi)跳轉(zhuǎn)。 2.使用數(shù)據(jù)讀取指令LDR:使用數(shù)據(jù)讀取指令LDR向程序計(jì)數(shù)器PC中直接賦值。這種方法分為兩步:先將異常中斷處理程序的絕對(duì)地址存放在存放在距離向量表4KB范圍內(nèi)的一個(gè)存儲(chǔ)單元中;再使用數(shù)據(jù)讀取指令LDR將該單元的內(nèi)容讀取到程序計(jì)數(shù)器PC中。 *在系統(tǒng)復(fù)位時(shí)安裝異常中斷處理程序* 1.地址0x00

16、處為ROM的情況 使用數(shù)據(jù)讀取指令LDR示例如下所示: Vector_Init_Block LDR PC, Reset_Addr LDR PC, Undefined_Addr LDR PC, SW_Addr LDR PC, Prefeth_Addr LDR PC, Abort_Addr NOP LDR PC, IRQ_Addr LDR PC, FIQ_Addr Reset_Addr DCD Start_Boot Undefined_Addr DCD Undefined_Handle SW_Addr DCD SWI_Handle Prefeth_Addr DCD Prefeth_Handle A

17、bort_Addr DCD Abort_Handle DCD 0 IRQ_Addr DCD IRQ_Handle FIQ_Addr DCD FIQ_Handle 使用跳轉(zhuǎn)指令的示例如下所示: Vector_Init_Block BL Reset_Handle BL DCD Undefined_Handle BL SWI_Handle BL Prefeth_Handle BL Abort_Handle NOP BL IRQ_Handle BL FIQ_Handle 2.地址0x00處為RAM的情況 地址0x00處為RAM時(shí),中斷向量表必須使用數(shù)據(jù)讀取指令直接指向PC中賦值的形式。而且,必須使用下

18、面的代碼巴中斷向量表從ROM中復(fù)制到RAM中地址0x00開始處的存儲(chǔ)空間中: MOV r8,#0 ADR r9,Vector_Init_Block ;復(fù)制中斷向量表(8字) LDMIA r9!,(r0-r7) STMIA r8!,(r0-r7) ;復(fù)制保存各中斷處理函數(shù)地址的表(8字words) LDMIA r9!,(r0-r7) STMIA r8!,(r0-r7)ARM基礎(chǔ)知識(shí)六ARM存儲(chǔ)系統(tǒng)概述 ARM存儲(chǔ)系統(tǒng)的體系結(jié)構(gòu)適應(yīng)不同的嵌入式應(yīng)用系統(tǒng)的需要差別很大。最簡(jiǎn)單的存儲(chǔ)系統(tǒng)使用平辦事的地址映射機(jī)制,就像一些簡(jiǎn)單的彈片機(jī)系統(tǒng)中一樣,地址空間的分配方式是固定的,系統(tǒng)各部分都使用物理地址。而一

19、些復(fù)雜系統(tǒng)可能包括下面的一種或幾種技術(shù),從而提供更為強(qiáng)大的存儲(chǔ)系統(tǒng)。 *系統(tǒng)中可能包含多種類型的存儲(chǔ)器,如FLASH,ROM,RAM,EEPROM等,不同類型的存儲(chǔ)器的速度和寬度等各不相同。 *通過(guò)使用CACHE及WRITE BUFFER技術(shù)縮小處理器和存儲(chǔ)系統(tǒng)速度差別,從而提高系統(tǒng)的整體性能。 *內(nèi)存管理部件通過(guò)內(nèi)存映射技術(shù)實(shí)現(xiàn)虛擬空間到物理空間的映射。在系統(tǒng)加電時(shí),將ROM/FLASH影射為地址0,這樣可以進(jìn)行一些初始化處理;當(dāng)這些初始化完成后將RAM地址影射為0,并把系統(tǒng)程序加載到RAM中運(yùn)行,這樣很好地解決了嵌入式系統(tǒng)的需要。 *引入存儲(chǔ)保護(hù)機(jī)制,增強(qiáng)系統(tǒng)的安全性。 *引入一些機(jī)制保證

20、I/O操作應(yīng)設(shè)成內(nèi)存操作后,各種I/O操作能夠得到正確的結(jié)果。 *及存儲(chǔ)系統(tǒng)相關(guān)的程序設(shè)計(jì)指南* 本節(jié)從外部來(lái)看ARM存儲(chǔ)系統(tǒng),及ARM存儲(chǔ)系統(tǒng)提供的對(duì)外接口。本節(jié)介紹用戶通過(guò)這些接口來(lái)訪問(wèn)ARM存儲(chǔ)系統(tǒng)時(shí)需要遵守的規(guī)則。 1.地址空間 ARM體系使用單一的和平板地址空間。該地址空間大小為232個(gè)8位字節(jié),這些字節(jié)的單元地址是一個(gè)無(wú)符號(hào)的32位數(shù)值,其取值范圍為0232-1。ARM地址空間也可以看作是230個(gè)32位的字單元。這些字單元的地址可以被4整除,也就是說(shuō)該地址低兩位為0b00。地址為A的字?jǐn)?shù)據(jù)包括地址為A、A+1、A+3、A+3 4個(gè)字節(jié)單元的內(nèi)容。 各存儲(chǔ)單元的地址作為32為無(wú)符號(hào)數(shù)

21、,可以進(jìn)行常規(guī)的整數(shù)運(yùn)算。這些運(yùn)算的結(jié)果進(jìn)行232取模。 程序正常執(zhí)行時(shí),每執(zhí)行一條ARM指令,當(dāng)前指令計(jì)數(shù)器加4個(gè)字節(jié);每執(zhí)行一條Thumb指令,當(dāng)前指令計(jì)數(shù)器加2個(gè)字節(jié)。但是,當(dāng)?shù)刂飞习l(fā)生溢出時(shí),執(zhí)行結(jié)果將是不可預(yù)知的。 2.存儲(chǔ)器格式 在ARM中,如果地址A是字對(duì)齊的,有下面幾種: *地址為A的字單元包括字節(jié)單元A,A+1,A+2,A+3。 *地址為A的班子單元包括字節(jié)單元A,A+1。 *地址為A+2的半字單元包括字節(jié)單元A+2,A=3. *地址為A的字單元包括半字節(jié)單元A,A+2。 在big-endian格式中,對(duì)于地址為a的字單元其中字節(jié)單元由高位到低位字節(jié)順序?yàn)锳,A+1,A=2,

22、A+3;這種存儲(chǔ)器格式如下所示: 31 24 23 16 15 8 7 0 字單元A | 半字單元A | 半字單元A+2 | 字節(jié)單元A | 字節(jié)單元A+1 | 字節(jié)單元A+2 | 字節(jié)單元A+3| 在little-endian格式中,對(duì)于地址為A的字單元由高位到低位字節(jié)順序?yàn)锳+3,A+2,A+1,A,這種存儲(chǔ)格式如下所示 31 24 23 16 15 8 7 0 字單元A | 半字單元A+2 | 半字單元A | 字節(jié)單元A+3 |字節(jié)單元A+2 | 字節(jié)單元A+1 | 字節(jié)單元A | 在ARM系統(tǒng)中沒(méi)有提供指令來(lái)選擇存儲(chǔ)器格式。如果系統(tǒng)中包含標(biāo)準(zhǔn)的ARM控制協(xié)處理器CP15,則CP15的寄

23、存器C1的位7決定系統(tǒng)中存儲(chǔ)器的格式。當(dāng)系統(tǒng)復(fù)位時(shí),寄存器C1的7值為零,這時(shí)系統(tǒng)中存儲(chǔ)器格式為little-endian格式。如果系統(tǒng)中采用的是big-endian格式,則復(fù)位異常中斷處理程序中必須設(shè)置c1寄存器的7位。 3.非對(duì)齊的存儲(chǔ)訪問(wèn)操作 非對(duì)齊:位于arm狀態(tài)期間,低二位不為0b00;位于Thumb狀態(tài)期間,最低位不為0b0。 3.1非對(duì)齊的指令預(yù)取操作 如果系統(tǒng)中指定當(dāng)發(fā)生非對(duì)齊的指令預(yù)取操作時(shí),忽略地址中相應(yīng)的位,則由存儲(chǔ)系統(tǒng)實(shí)現(xiàn)這種忽略。 3.2非對(duì)齊的數(shù)據(jù)訪問(wèn)操作 對(duì)于LOAD/STORE操作,系統(tǒng)定義了下面3中可能的結(jié)果: *執(zhí)行結(jié)果不可預(yù)知 *忽略字單元地址低兩位的值,

24、即訪問(wèn)地址為字單元;忽略半字單元最低位的值,即訪問(wèn)地址為半字單元。 *由存儲(chǔ)系統(tǒng)忽略字單元地址中低兩位的值,半字單元地址最低位的值。 4.指令預(yù)取和自修改代碼 當(dāng)用戶讀取PC計(jì)數(shù)器的值時(shí),返回的是當(dāng)前指令下面的第二條指令的地址。對(duì)于ARM指令來(lái)說(shuō),返回當(dāng)前指令地址值加8個(gè)字節(jié);對(duì)于Thumb指令來(lái)說(shuō),返回值為當(dāng)前指令地址值加4個(gè)字節(jié)。 自修改代碼指的是代碼在執(zhí)行過(guò)程中修改自身。應(yīng)盡量避免使用。 5.存儲(chǔ)器映射的I/O空間 在ARM中,I/O操作通常被影射為存儲(chǔ)器操作。通常需要將存儲(chǔ)器映射的I/O空間設(shè)置成非緩沖的。ARM基礎(chǔ)知識(shí)七ARM編譯器支持的數(shù)據(jù)類型 數(shù)據(jù)類型 長(zhǎng)度(位) 對(duì)齊特性 Ch

25、ar 8 1(字節(jié)對(duì)齊) short 16 2(百字對(duì)齊) Int 32 4(字對(duì)齊) Long 32 4(字對(duì)齊) Longlong 64 4(字對(duì)齊) Float 32 4(字對(duì)齊) Double 64 4(字對(duì)齊) Long double 64 4(字對(duì)齊) All pointers 32 4(字對(duì)齊) Bool(C+ only) 32 4(字對(duì)齊) 1.整數(shù)類型 在ARM體系中,整數(shù)類型是以2的補(bǔ)碼形式存儲(chǔ)的。對(duì)于long long類型來(lái)說(shuō),在little endian內(nèi)存模式下,其低32位保存在低地址的字單元中,高32為保存在高地址的字單元中;在big endian模式下,其低32位

26、保存在高地址的字單元中,高32為保存在低地址的字單元中。對(duì)于整型數(shù)據(jù)的操作遵守下面的規(guī)則: *所有帶符號(hào)的整型書的運(yùn)算是按照二進(jìn)制的補(bǔ)碼進(jìn)行的。 *帶符號(hào)的整型數(shù)的運(yùn)算不進(jìn)行符號(hào)的擴(kuò)展。 *帶符號(hào)的整型數(shù)的右移操作是算數(shù)移位。 *制定的移位位數(shù)的數(shù)是8位的無(wú)符號(hào)數(shù)。 *進(jìn)行移位操作的數(shù)被作為32位數(shù)。 *超過(guò)31位的邏輯左移的結(jié)果為0。 *對(duì)于無(wú)符號(hào)數(shù)和有符號(hào)的正數(shù)來(lái)說(shuō),超過(guò)32位的右移操作結(jié)果為0;對(duì)于有符號(hào)的負(fù)數(shù)來(lái)說(shuō),超過(guò)32位的右移操作結(jié)果為-1。 *整數(shù)除法運(yùn)算的余數(shù)和除數(shù)有相同的符號(hào)。 *當(dāng)把一個(gè)整數(shù)截?cái)喑晌粩?shù)更短的整數(shù)類型的數(shù)時(shí),并不能保證所得到的結(jié)果的最高位的符號(hào)位的正確性。 *

27、整型數(shù)據(jù)之間的類型轉(zhuǎn)換不會(huì)產(chǎn)生異常中斷。 *整型數(shù)據(jù)的溢出不會(huì)產(chǎn)生異常中斷。 *整型數(shù)據(jù)除以0將會(huì)產(chǎn)生異常中斷。 2.浮點(diǎn)數(shù) 在ARM體系中,浮點(diǎn)數(shù)是按照IEEE標(biāo)準(zhǔn)存儲(chǔ)的。 *float類型的數(shù)是按照IEEE的單精度數(shù)表示的。 *double和long double 是用IEEE的雙精度數(shù)表示的。 對(duì)于浮點(diǎn)數(shù)的操作遵守下面的規(guī)則: *遵守正常的IEEE754規(guī)則。 *當(dāng)默認(rèn)情況下禁止浮點(diǎn)數(shù)運(yùn)算異常中斷。 *當(dāng)發(fā)生卷繞時(shí),用最接近的數(shù)據(jù)來(lái)表示。 3.指針類型的數(shù)據(jù) 下面的規(guī)則適用于處數(shù)據(jù)成員指針以外的其他指針: *NULL被定義為0。 *相鄰的兩個(gè)存儲(chǔ)單元地址相差一。 *在指向函數(shù)的指針和指向

28、數(shù)據(jù)的指針進(jìn)行數(shù)據(jù)轉(zhuǎn)換時(shí),編譯器將會(huì)產(chǎn)生警告信息。 *類型size_t被定義為unsigned int. *類型ptrdiff_t被定義為signed int。 *兩個(gè)指針類型的數(shù)據(jù)相減時(shí),結(jié)果可以按照下面的公式得到。 (int)a-(int)b)/(int)sizeof(type pointed to) 這時(shí),只要指針?biāo)傅膶?duì)象不是pack的,其對(duì)齊特性能夠滿足整除的要求。ARM基礎(chǔ)知識(shí)八ARM編譯器中預(yù)定義的宏 ARM編譯器預(yù)定義了一些宏,這些預(yù)定義宏對(duì)應(yīng)一定的數(shù)值,有些預(yù)定義宏沒(méi)有對(duì)應(yīng)數(shù)值,見(jiàn)下表: _arm _ 使用編譯器armcc,tcc,armcpp,tcpp時(shí) _ARMCC_VE

29、RSION Ver 代表編譯器版本號(hào),其格式為: PVtbbb,其中: P為產(chǎn)品編號(hào)(1代表ADS) V為副版本號(hào)(1代表1.1) T為補(bǔ)丁版本號(hào)(0代表1.1) bbb為build號(hào)(比如650) _APCS_INTERWORK _ 使用編譯選項(xiàng)-apcs/interwork時(shí) _APCS_ROPI _ 使用編譯選項(xiàng)apcs/ropi時(shí) _RWPI _ 使用編譯選項(xiàng)-apcs/rwpi時(shí) _APCS_SWST _ 使用編譯選項(xiàng)-apcs/swst時(shí) _BIG_ENDIAN _ 編譯器針對(duì)目標(biāo)系統(tǒng)使用big-endian內(nèi)存模式時(shí) _cplusplus _ 編譯器工作及C+模式時(shí) _CC_AR

30、M _ 返回編譯器的名稱 _DATE_ date 編譯源文件的日期 _embedded_cplusplus 編譯器工作于EC+模式時(shí) _FEATURE_SINGED_CHAE 使用編譯設(shè)置選項(xiàng)-zc時(shí)設(shè)置該預(yù)定義宏 _FILE_ name 包含全路徑的當(dāng)前被編譯的源文件名稱 _func_ name 當(dāng)前被編譯的函數(shù)名稱 _LINE_ num 當(dāng)前被編譯的代碼行號(hào)名稱 _MOUDLE_ mod 預(yù)定義宏_FILE_的文件名稱部分 _OPTIMISE_SPACE _ 使用編譯選項(xiàng)-OSPACE時(shí) _OPTIMISE_TIME _ 使用編譯選項(xiàng)-Otime時(shí) _pretty_func name un

31、mangled的當(dāng)前函數(shù)名稱 _sizeof_int 4 sizeof(int),在預(yù)處理表達(dá)式中可以使用 _sizeof_long 4 sizeof(long),在預(yù)處理表達(dá)式中可以使用 _sizeof_ptr 4 sizeof(void*)在預(yù)處理表達(dá)式中可以使用 _SOFTFP _ 編譯時(shí)使用浮點(diǎn)數(shù) _ _ 在各種編譯器模式下 _STDC_VERSION _ 標(biāo)準(zhǔn)的版本信息 _STRICT_ANSI_ _ 使用編譯選項(xiàng)-STRICT時(shí) _TARGET_ARCH_xx _ xx代表ARM體系編號(hào) _TARGET_CPU_xx _ xx代表CPU編號(hào) _TARGET_FEATURE_ 當(dāng)AR

32、M體系支持指令PLD,LDRD,STRD,MCRR,MRRC時(shí) DOUBLEWORD _ 設(shè)置該定義宏 _TARGET_FEATURE_ 當(dāng)系統(tǒng)中包含DSP乘法處理器時(shí),設(shè)置該 DSPMUL _ 預(yù)定義宏 _TARGET_FEATURE_ 如果目標(biāo)ARM體系支持半字訪問(wèn)以及有符號(hào)的字節(jié)數(shù)據(jù) HALFWORD _ ,設(shè)置該預(yù)定義宏 _TARGET_FEATURE_ 如果目標(biāo)ARM體系支持長(zhǎng)乘法指令MULL和 MULTIPLY _ MUAL,設(shè)置該預(yù)定義宏 _TARGET_FEATURE_ 如果目標(biāo)ARM體系支持THUMB指令 THUMB _ _TARGET_FPU_xx _ 表示FPU選項(xiàng),可能

33、取值如下所示: _TARGET_FPU_VFP _TARGET_FPU_FPA _TARGET_FPU_SOFTVFP _TARGET_FPU_SOFTVFP_VFP _TARGET_FPU_SOFTFPA _TARGET_FPU_NONE _thumb _ 編譯器為tcc或tcpp時(shí),設(shè)置該預(yù)定義宏 _TIME 源文件編譯時(shí)間ARM基礎(chǔ)知識(shí)九ARM映像文件 1.ELF格式文件的結(jié)構(gòu) 1.1映像文件組成部分 *一個(gè)映像文件有一個(gè)或多個(gè)域組成 *每個(gè)域包含一個(gè)或多個(gè)輸出段 *每個(gè)輸出段包含一個(gè)或多個(gè)輸入段 *各輸入段中包含了目標(biāo)文件中的代碼和數(shù)據(jù) 輸入段中包含了四類內(nèi)容:代碼、已經(jīng)初始化的數(shù)據(jù)、

34、未經(jīng)初始化的存儲(chǔ)區(qū)域、內(nèi)容初始化成0的存儲(chǔ)區(qū)域。每個(gè)輸入段有相應(yīng)的屬性,可以為只讀的(RO)、可讀寫的(RW)以及初始化成0的(ZI)。ARM連接器根據(jù)個(gè)輸入段的屬性將這些輸入段分組,再組成不同的輸出段及域。 一個(gè)輸出段中包含了一系列的具有相同的RO、RW和ZI屬性的輸入段。輸出段的屬性及其中包含的輸入段的屬性相同。在一個(gè)輸出段的內(nèi)部,各輸入段是按照一定的規(guī)則排序的,這將在1.3節(jié)油詳細(xì)地介紹。 一個(gè)域中包含1-3個(gè)輸出段,其中個(gè)輸出段的屬性各不相同。各輸出段的排列順序是由其屬性決定的。其中RO屬性的輸出段排在最前面,其次是RW屬性的輸出段,最后是ZI屬性的輸出段。一個(gè)域通常映射到一個(gè)物理存儲(chǔ)

35、器上,如ROM或RAM。 1.2ARM映像文件各組成部分的地址影射 ARM映像文件各組成部分在存儲(chǔ)系統(tǒng)中的地址有兩種:一種是映像文件位于存儲(chǔ)器中時(shí)(也就是該映像文件運(yùn)行之前)的地址,稱之為加載地址;一種是映像文件運(yùn)行時(shí)的地址,稱之為運(yùn)行時(shí)地址。之所以有這兩種地址,是因?yàn)橛诚裎募谶\(yùn)行時(shí),其中的有些域是可以移動(dòng)的新的存儲(chǔ)區(qū)域。比如,已經(jīng)初始化的RW屬性的數(shù)據(jù)所在的段運(yùn)行之前可能保存系統(tǒng)的ROM中,在運(yùn)行時(shí),他被移動(dòng)至RAM中。 通常,一個(gè)映像文件包含若干個(gè)域,各域又包含若干的輸出段。ARM連接器需要知道如下的信息,已決定如何生成相應(yīng)的映像文件。 *分組信息 決定如何將個(gè)輸入段組織成相應(yīng)的輸出段和

36、域。 *定位信息 決定個(gè)域在存儲(chǔ)空間地址中的起始地址。 根據(jù)映像文件中地址映射的復(fù)雜程度,有兩種方法來(lái)告訴arm連接器這些相關(guān)信息。對(duì)于映像文件中地址映射關(guān)系比較簡(jiǎn)單的情況,可以使用命令行選項(xiàng);對(duì)于映像文件中地址映射關(guān)系比較復(fù)雜的情況,可以使用一個(gè)配置文件。 2.arm映像文件的入口點(diǎn) 2.1arm映像文件的入口點(diǎn)有兩種類型:一種是映像文件運(yùn)行時(shí)的入口點(diǎn),稱為初始入口點(diǎn)(initial entry point),另一種是普通入口點(diǎn)(entry point). 初始入口點(diǎn)是映像文件運(yùn)行時(shí)的入口點(diǎn),每個(gè)映像文件只有一個(gè)唯一的初始入口點(diǎn),它保存在ELF頭文件中。如果映像文件是被操作系統(tǒng)加載的,操作系

37、統(tǒng)是通過(guò)跳轉(zhuǎn)到該初始入口點(diǎn)處來(lái)加載該映像文件。 普通的入口點(diǎn)是在匯編中用ENTRY偽操作定義。他通常用于標(biāo)志該段代碼是通過(guò)異常中斷處理程序進(jìn)入的。這樣連接器刪除無(wú)用的段時(shí)不會(huì)將該段代碼刪除。一個(gè)映像文件中可以定義多個(gè)普通入口點(diǎn)。 應(yīng)該注意的是,初始入口點(diǎn)可以使普通入口點(diǎn),但也可以不是普通入口點(diǎn)。 2.2定義初始入口點(diǎn) 初始入口點(diǎn)必須滿足下面兩個(gè)條件: *初始入口點(diǎn)必須位于映像文件的運(yùn)行時(shí)域內(nèi)。 *飽含初始入口點(diǎn)的運(yùn)行時(shí)域不能被覆蓋,他的加載地址和運(yùn)行地址必須是相同的。 可以使用連接選項(xiàng)-entry address來(lái)指定映像文件的初始入口點(diǎn)。這時(shí),address指定了映像文件的初始入口點(diǎn)的地址值

38、。 對(duì)于地址0x0處為rom的嵌入式應(yīng)用系統(tǒng),可以使用-entry 0x0來(lái)指定映像文件的初始入口點(diǎn)。這樣當(dāng)系統(tǒng)復(fù)位后,自動(dòng)跳轉(zhuǎn)到該入口開始執(zhí)行。 如果映像文件是被一個(gè)加載器加載的,該映像文件該映像文件必須包含一個(gè)初始化入口點(diǎn)。這種映像文件通常還包含了其他普通入口點(diǎn),這些普通入口點(diǎn)一般為異常中斷處理程序的入口地址。 當(dāng)用戶沒(méi)有指定-entry address時(shí),連接器根據(jù)下面的規(guī)則決定映像文件的初始入口點(diǎn)。 *如果輸入的目標(biāo)文件中只有一個(gè)普通入口點(diǎn),該普通入口點(diǎn)被連接器當(dāng)成映像文件的初始入口點(diǎn)。 *如果輸入的目標(biāo)文件中沒(méi)有一個(gè)普通入口點(diǎn),或者其中的普通入口點(diǎn)多于一個(gè),則連接器生成的映像文件中不

39、包含初始入口點(diǎn),并產(chǎn)生警告信息。 2.3普通入口點(diǎn)的用法 普通入口點(diǎn)是在匯編中用ENTRY 偽操作定義。在嵌入式應(yīng)用中,各異常中斷的處理程序入口使用普通入口點(diǎn)標(biāo)示。這樣連接器在刪除無(wú)用段時(shí)不會(huì)將該段代碼刪除。 一個(gè)映像文件中可以定義多個(gè)普通入口點(diǎn)。沒(méi)有指定連接選項(xiàng)-entry addres時(shí),如果輸入的目標(biāo)文件中只有一個(gè)普通入口點(diǎn),該入口點(diǎn)被連接器當(dāng)成映像文件的初始入口點(diǎn)。3輸入段的排序規(guī)則 連接器根據(jù)輸入段的屬性來(lái)組織這些輸入段,具有相同屬性的輸入段被放到域中一段連續(xù)的空間中,組成一個(gè)輸出段。在一個(gè)輸出段中,各輸入段的起始地址及 輸出段的起始地址和該輸出段中個(gè)輸入段的排列順序有關(guān)。 通常情況下,一個(gè)輸出段中個(gè)輸入段的排列順序由下面幾個(gè)因素決定的。用戶可以通過(guò)連接選項(xiàng)-fir

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論