ARM基礎(chǔ)知識(shí)資料_第1頁(yè)
ARM基礎(chǔ)知識(shí)資料_第2頁(yè)
ARM基礎(chǔ)知識(shí)資料_第3頁(yè)
已閱讀5頁(yè),還剩10頁(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ō)話卻一遍一遍打開(kāi)他的資料又關(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), 一

2、個(gè)或兩個(gè)狀態(tài)寄存器及程序計(jì)數(shù)器( PC)。在所有的寄存器中,有些是各模式公用一個(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í), FI

3、Q 處理程序可以不必執(zhí)行保存和恢復(fù)中斷現(xiàn)場(chǎng)的指令,從而可以使中斷處理非常迅速。對(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ì)于

4、 ARM指令集來(lái)說(shuō), PC指向當(dāng)前指令的下兩條指令的地址。由于 ARM指令是字對(duì)齊的,PC值的第 0 位和第一位總為 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被忽

5、略, 即寫入 r15 的地址值將與 0xFFFF FFFC 做與操作。* 對(duì)于 ARM4以及更高的版本, 程序必須保證寫入 R15的地址值 bits1: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)容。在異常中斷退出

6、時(shí),可以用 SPSR來(lái)恢復(fù) CPSR。由于用戶模式和系統(tǒng)模式不是異常中斷模式, 所以他沒(méi)有SPSR。當(dāng)用戶在用戶模式或系統(tǒng)模式訪問(wèn)SPSR,將產(chǎn)生不可預(yù)知的后果。CPSR格式如下所示。SPSR和CPSR格式相同。31302928272676543210NZCVQDNM(RAZ)IFTM4M3M2M1M0* 條件標(biāo)志位*N本位設(shè)置成當(dāng)前指令運(yùn)算結(jié)果的bit31的值。當(dāng)兩個(gè)表示的有符號(hào)整數(shù)運(yùn)算時(shí),表示運(yùn)算結(jié)果為負(fù)數(shù),n=0 表示結(jié)果為正書或零。n=1z z=1表示運(yùn)算的結(jié)果為零;z=0表示運(yùn)算的結(jié)果不為零。對(duì)于CMP指令, Z=1 表示進(jìn)行比較的兩個(gè)數(shù)大小相等。''C下面分四種情況

7、討論C的設(shè)置方法:在加法指令中 (包括比較指令 CMP),當(dāng)結(jié)果產(chǎn)生了進(jìn)位 , 則 C=1, 表示無(wú)符號(hào)運(yùn)算發(fā)生上溢出;其他情況 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í)位 *在 ARMV5 的 E 系列處理器中, CPSR的 bit27 稱為 q 標(biāo)識(shí)位, 主要用于指示增

8、強(qiáng)的dsp 指令是否發(fā)生了溢出。同樣的spsr 的 bit27 位也稱為 q 標(biāo)識(shí)位,用于在異常中斷發(fā)生時(shí)保存和恢復(fù) CPSR中的 Q標(biāo)識(shí)位。在 ARM V5以前的版本及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 系列 A

9、RM處理器, T 控制位含義如下:T=0 表示執(zhí)行ARM指令T=1 表示執(zhí)行Thumb指令對(duì)于 ARM V5以及更高版本的非 T 系列處理器, T 控制位的含義如下 T=0 表示執(zhí)行 ARM指令T=1 表示強(qiáng)制下一條執(zhí)行的指令產(chǎn)生未定指令中斷*M 控制位 *M控制位控制處理器模式,具體含義如下:M4:0處理器模式可訪問(wèn)的寄存器ob10000 user pc,r14r0,CPSR0b10001 FIQ PC,R14_FIQ-R8_FIQ,R7R0,CPSR,SPSR_FIQ0b10010 IRQ PC,R14_IRQ-R13_IRQ,R12R0,CPSR,SPSR_IRQ0B10011 SUPE

10、RVISOR PC,R14_SVC-R13_SVC,R12R0,CPSR,SPSR_SVC0b10111 ABORT PC,R14_ABT-R13_ABT,R12R0,CPSR,SPSR_ABT0b11011 UNDEFINEED PC,R14_UND-R8_UND,R12R0,CPSR,SPSR_UND0b11111 SYSTEM PC,R14-R0,CPSR(ARM V4以及更高版本)''*CPSR 中的其他位 *這些位用于將來(lái)擴(kuò)展。應(yīng)用軟件不要操作這些位。ARM基礎(chǔ)知識(shí)三在 ARM體系中通常有以下3 種方式控制程序的執(zhí)行流程:* 在正常執(zhí)行過(guò)程中,每執(zhí)行一條ARM指令,程

11、序計(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í)行跳轉(zhuǎn)操作; BL 指令在執(zhí)行跳轉(zhuǎn)操作同時(shí),保存子程序的返回地址; BX指令在執(zhí)行跳轉(zhuǎn)操作同時(shí),根據(jù)目標(biāo)地址為可以將程序切換到BLX 指令執(zhí)行3 個(gè)操作,跳轉(zhuǎn)到目標(biāo)地址處執(zhí)行,保存子程序的返回Thumb狀態(tài);地址,根據(jù)目標(biāo)地址為可以將程序切換到Thumb狀態(tài)。* 當(dāng)異常中斷發(fā)生時(shí),系統(tǒng)執(zhí)行完當(dāng)前指令后,將跳轉(zhuǎn)到相應(yīng)的異常中斷處理程序處執(zhí)行。當(dāng)異常中斷處理程序執(zhí)行完成

12、后,程序返回到發(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ù)位引腳有效時(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í),可以通過(guò)改異常中斷機(jī)制仿真浮點(diǎn)向量運(yùn)算。產(chǎn)生未定義的指令異常中斷,* 軟件中斷 *這是一個(gè)由用戶定義的中斷指令??捎糜谟脩裟?/p>

13、式下的程序調(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ù)取終止異常中斷。''* 數(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)求( FI

14、Q) *當(dāng)處理器的外部快速中斷請(qǐng)求引腳有效,而且 CPSR的 F 控制位被清除時(shí), 處理器產(chǎn)生外部中斷請(qǐng)求異常中斷異常中斷向量表及異常中斷優(yōu)先級(jí)中斷向量表指定了個(gè)異常中斷及其處理程序的對(duì)應(yīng)關(guān)系。他通常存放在存儲(chǔ)地址的低端。在ARM體系中,異常中斷向量表的大小為32 字節(jié),其中每個(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è)異常中斷的中斷向量地址以及中斷

15、的處理優(yōu)先級(jí)中斷向量地址 異常中斷類型 異常中斷模式 優(yōu)先級(jí)( 6 最低)0x00復(fù)位 特權(quán)模式 10x04未定義的指令未定義指令終止模式60x08軟件中斷 特權(quán)模式 60x0C 指令預(yù)取終止終止模式 50x10數(shù)據(jù)訪問(wèn)終止終止模式 20x14保留 未使用未使用0x18外部中斷請(qǐng)求IRQ 模式 40x1C 快速中斷請(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向

16、程序計(jì)數(shù)器 PC中直接賦值。 這種方法分為兩步:先將異常中斷處理程序的絕對(duì)地址存放在存放在距離向量表4KB范圍內(nèi)的一個(gè)存儲(chǔ)單元中;再使用數(shù)據(jù)讀取指令LDR將該單元的內(nèi)容讀取到程序計(jì)數(shù)器PC中。* 在系統(tǒng)復(fù)位時(shí)安裝異常中斷處理程序*1. 地址 0x00 處為 ROM的情況使用數(shù)據(jù)讀取指令 LDR示例如下所示:Vector_Init_BlockLDR PC, Reset_AddrLDR PC, Undefined_Addr''LDR PC, SW_AddrLDR PC, Prefeth_AddrLDR PC, Abort_AddrNOPLDR PC, IRQ_AddrLDR PC,

17、 FIQ_AddrReset_Addr DCD Start_BootUndefined_Addr DCD Undefined_HandleSW_Addr DCD SWI_HandlePrefeth_Addr DCD Prefeth_HandleAbort_Addr DCD Abort_HandleDCD 0IRQ_Addr DCD IRQ_HandleFIQ_Addr DCD FIQ_Handle使用跳轉(zhuǎn)指令的示例如下所示:Vector_Init_BlockBL Reset_HandleBL DCD Undefined_HandleBL SWI_HandleBL Prefeth_HandleB

18、L Abort_HandleNOPBL IRQ_HandleBL FIQ_Handle2. 地址 0x00 處為 RAM的情況地址 0x00 處為 RAM時(shí),中斷向量表必須使用數(shù)據(jù)讀取指令直接指向PC中賦值的形式。 而且,必須使用下面的代碼巴中斷向量表從ROM中復(fù)制到 RAM中地址 0x00 開(kāi)始處的存儲(chǔ)空間中:MOV r8,#0ADR 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

19、)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)各部分都使用物理地址。而一些復(fù)雜系統(tǒng)可能包括下面的一種或幾種技術(shù),從而提供更為強(qiáng)大的存儲(chǔ)系統(tǒng)。* 系統(tǒng)中可能包含多種類型的存儲(chǔ)器, 如 FLASH,ROM,RAM,EEPROM等,不同類型的存儲(chǔ)器的速度和寬度等各不相同。* 通過(guò)使用 CACHE及 WRITEBUFFER技術(shù)縮小處理器和存儲(chǔ)系統(tǒng)速度差別, 從而提高系統(tǒng)的整體性能。* 內(nèi)存管理部件通過(guò)內(nèi)存映射技術(shù)實(shí)現(xiàn)虛擬

20、空間到物理空間的映射。在系統(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ī)制保證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é), 這

21、些字節(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ù), 可以進(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ì)齊的,

22、有下面幾種:* 地址為 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 , A+3; 這種存儲(chǔ)器格式如下所示:3124231615870-字單元 A|-半字單元 A |半字單元 A+2 |-字節(jié)單元 A |字節(jié)單元 A+1 | 字節(jié)單元 A+2 |字節(jié)單元 A+3|''-在 little-endian

23、格式中, 對(duì)于地址為 A 的字單元由高位到低位字節(jié)順序?yàn)锳+3,A+2,A+1,A ,這種存儲(chǔ)格式如下所示3124231615870-字單元 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的寄存器 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

24、寄存器的 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ù)知* 忽略字單元地址低兩位的值, 即訪問(wèn)地址為字單元; 忽略半字單元最低位的值, 即訪問(wèn)地址為半字單元。* 由存儲(chǔ)系統(tǒng)忽略字單元地址中低兩位的值,半字單元地址最低位的值。4. 指令預(yù)取和自修改代碼當(dāng)用戶讀取PC計(jì)數(shù)器的值時(shí),

25、返回的是當(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ì)齊特性Char 8 1(字節(jié)對(duì)齊 )short 16 2(百字對(duì)齊 )Int 32 4(字對(duì)齊 )Long 32 4(字對(duì)齊 )Longlong 64 4( 字對(duì)齊 )Fl

26、oat 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ō),在 littleendian內(nèi)存模式下, 其低 32位保存在低地址的字單元中,高 32 為保存在高地址的字單元中;在 bigendian 模式下,其低32 位保存在高地址的字單元中,高32 為保存在低地址的字單元中。對(duì)于整型數(shù)據(jù)的操作遵守下面的規(guī)則:* 所有帶符號(hào)的整型書的運(yùn)算是按照二進(jìn)制

27、的補(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)位的正確性。* 整型數(shù)據(jù)之間的類型轉(zhuǎn)換不會(huì)產(chǎn)生異常中斷。* 整型數(shù)據(jù)的溢出不會(huì)產(chǎn)生異常中斷。* 整型數(shù)據(jù)除以 0 將會(huì)產(chǎn)生異

28、常中斷。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ù)的指針和指向數(shù)據(jù)的指針進(jìn)行數(shù)據(jù)轉(zhuǎn)換時(shí),編譯器將會(huì)產(chǎn)生警告信息。* 類型 size_t 被定義

29、為 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_VERSION Ver代表編譯器版本號(hào),其格式為:PVtbbb,其中:P 為產(chǎn)品編

30、號(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_ARM _ 返回編譯器的名稱_DATE_ date編譯源文件的日期_embedded

31、_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 unmangled的當(dāng)前函數(shù)名稱_sizeof_int 4 sizeof(int),

32、在預(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) ARM體系支持指令 PLD,LDRD,STRD,MCRR,MRRC時(shí)DOUBLEWORD設(shè)置該定義宏_TA

33、RGET_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),可能取值如下所示:_TARGET_FPU_VFP_TARGET_FPU_FPA_TARGET_FPU_SOFTVF

34、P_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ù)、未經(jīng)初始化的存儲(chǔ)區(qū)域、內(nèi)容初始化成 0 的存儲(chǔ)區(qū)域。每個(gè)輸入段有相應(yīng)的屬性,可以為只讀的( RO)、可讀寫的( RW)以

35、及初始化成 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ǔ)器上,如 ROM或 RAM。''1.2ARM映像文件各組成部分的

36、地址影射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è)域,各域又包含若干的輸出段。信息,已決定如何生成相應(yīng)的映像文件。ARM連接器需要知道如下的* 分組信息 決定如何將個(gè)輸入段組織成相應(yīng)的輸出段和域。* 定位信息 決定個(gè)域在存儲(chǔ)空間地址中的起始地址。根據(jù)映像

37、文件中地址映射的復(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)加載的,操作系統(tǒng)是通過(guò)跳轉(zhuǎn)到該初始入口點(diǎn)處來(lái)加載該映像文件。普通的入口點(diǎn)是

38、在匯編中用 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)的地址值。對(duì)于地址 0x0 處為 rom 的嵌入式應(yīng)用系統(tǒng),可以使用-e

39、ntry 0x0 來(lái)指定映像文件的初始入口點(diǎn)。這樣當(dāng)系統(tǒng)復(fù)位后,自動(dòng)跳轉(zhuǎn)到該入口開(kāi)始執(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è),則連接器生成的映像文件中不包含初始入口點(diǎn),并產(chǎn)生警告信息。2.3

40、普通入口點(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ò)連接選

溫馨提示

  • 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)論