版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、ARM基礎(chǔ)知識(強(qiáng)烈推薦).txt 有誰會對著自己的褲襠傻笑。不敢跟他說話卻一遍一遍打開他的資料又關(guān)上。用了心旳感情,真旳能讓人懂得很多事。、如果有一天,我的簽名不再頻 繁更新,那便證明我過的很好。 ARM基礎(chǔ)知識(強(qiáng)烈推薦)ARM基礎(chǔ)知識一ARM處理器共有37個(gè)寄存器。其中包括:*31個(gè)通用寄存器,包括程序計(jì)數(shù)器( PC在內(nèi)。這些寄存器都是32位寄存器。*6個(gè)狀態(tài)寄存器。這些寄存器都是32位寄存器。(PC。ARM處理器共有7種不同的處理器模式,每一種模式中都有一組相應(yīng)的寄存器組。在任何時(shí) 刻,可見的寄存器包括15個(gè)通用寄存器(R0-R14), 個(gè)或兩個(gè)狀態(tài)寄存器及程序計(jì)數(shù)器 在所有的寄存器中
2、,有些是各模式公用一個(gè)物理寄存器,有一些寄存器各模式擁有自己獨(dú)立 的物理寄存器。通用寄存器PC*8通用寄存器分為以下三類:備份寄存器、未備份寄存器、程序計(jì)數(shù)器 未備份寄存器未備份寄存器包括R0-R7。對于每一個(gè)未備份寄存器來說,所有處理器模式下都是使用同一個(gè)物理寄存器。未備份寄存器沒有被系統(tǒng)用于特別的用途,任何可采用通用寄存器的場合都 可以使用未備份寄存器。備份寄存器對于R8-R12備份寄存器來說,每個(gè)寄存器對應(yīng)兩個(gè)不同的物理寄存器。系統(tǒng)為將備份寄存器用于任何的特殊用途,但是當(dāng)中斷處理非常簡單,僅僅使用R8-R14寄存器時(shí),F(xiàn)IQ處理程序可以不必執(zhí)行保存和恢復(fù)中斷現(xiàn)場的指令,從而可以使中斷處理
3、非常迅速。對于R13,R14備份寄存器來說,每個(gè)寄存器對應(yīng)六個(gè)不同的物理寄存器,其中的一個(gè)是系統(tǒng) 模式和用戶模式共用的;另外的五個(gè)對應(yīng)于其他的五種處理器模式。采用下面的記號來區(qū)分 各個(gè)物理寄存器:R13_<M0DE>其中MOD可以是下面幾種模式之一:usr,svc,abt,und,irq,fiq程序計(jì)數(shù)器PC可以作為一般的通用寄存器使用,但有一些指令在使用R15時(shí)有一些限制。由于 ARM采用了流水線處理器機(jī)制,當(dāng)正確讀取了 PC的值時(shí),該值為當(dāng)前指令地址值加上 8個(gè)字節(jié)。也就是 說,對于ARM指令集來說,PC指向當(dāng)前指令的下兩條指令的地址。由于ARM指令是字對齊的,PC值的第0位和
4、第一位總為 0。需要注意的是,當(dāng)使用 str/stm 保存R15時(shí),保存的可能是當(dāng)前指令地址值加 8個(gè)字節(jié),也 可能保存的是當(dāng)前指令地址值加 12個(gè)字節(jié)。到底哪種方式取決于芯片的具體設(shè)計(jì)。 對于用戶 來說,盡量避免使用 STR/STM指令來保存R15的值。入R15的值應(yīng)滿足 bits1:0*對于arm3以及更低的版本,與0xFFFF FFFC做與操作。*對于ARM4以及更高的版本, 生不可預(yù)知的后果。對于Thumb指令集來說,指令是班子對齊的,處理器將忽略bit0。ARM基礎(chǔ)知識二*當(dāng)成功的向R15寫入一個(gè)數(shù)值時(shí),程序?qū)⑻D(zhuǎn)到該地址執(zhí)行。由于ARM指令是字對齊的,寫為0b00,具體要求arm個(gè)
5、版本有所不同:寫入R15的地址值bits1:0 被忽略,即寫入r15的地址值將程序必須保證寫入R15的地址值bits1:0 為ObOO,否則將產(chǎn)程序狀態(tài)寄存器CP SR當(dāng)前程序狀態(tài)寄存器)在任何處理器模式下被訪問。 它包含了條件標(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來恢復(fù)CPSR由于用戶模式和系統(tǒng)模式不是異常中斷模式,所以他沒有SPSR當(dāng)用戶在用戶模式或系統(tǒng)模式訪問SPSR將
6、產(chǎn)生不可預(yù)知的后果。CPSR格式如下所示。SPSF和CPSR格式相同。31 30 29 28 27 26 7 6 5 4 3 2 1 0N Z C V Q DNM(RAZ) IF T M4 M3 M2 M1 MO*條件標(biāo)志位*N本位設(shè)置成當(dāng)前指令運(yùn)算結(jié)果的bit31的值。當(dāng)兩個(gè)表示的有符號整數(shù)運(yùn)算時(shí),n=1表示運(yùn)算結(jié)果為負(fù)數(shù),n=0表示結(jié)果為正書或零。zz=1表示運(yùn)算的結(jié)果為零;z=0表示運(yùn)算的結(jié)果不為零。對于CMP旨令,Z=1表示進(jìn)行比較的兩個(gè)數(shù)大小相等。C下面分四種情況討論 C的設(shè)置方法:在加法指令中(包括比較指令 CMP,當(dāng)結(jié)果產(chǎn)生了進(jìn)位,則C=1,表示無符號運(yùn)算發(fā)生上溢出; 其他情況C
7、=0。在減法指令中(包括減法指令 CMP,當(dāng)運(yùn)算中發(fā)生錯(cuò)位,則 C=0,表示無符號運(yùn)算數(shù)發(fā)生下 溢出;其他情況下 C=1o對于包含移位操作的非加堿運(yùn)算指令,C中包含最后一次溢出的的位的數(shù)值對于其他非加減運(yùn)算指令,C位的值通常不受影響V=1表示V對于加減運(yùn)算指令, 當(dāng)操作數(shù)和運(yùn)算結(jié)果為二進(jìn)制的補(bǔ)碼表示的帶符號數(shù)時(shí), 符號為溢出;通常其他指令不影響V位。*Q標(biāo)識位*在ARW5的E系列處理器中,CPSR的 bit27稱為q標(biāo)識位,主要用于指示增強(qiáng)的dsp指令是否發(fā)生了溢出。同樣的 spsr的bit27位也稱為q標(biāo)識位,用于在異常中斷發(fā)生時(shí)保存和恢復(fù) CPSF中的Q標(biāo)識位。在ARM V5以前的版本及
8、ARM V5的非E系列的處理器中,Q標(biāo)識位沒有被定義。*CPSR中的控制位*CPSR的低八位I、F、T、M4:0統(tǒng)稱為控制位。當(dāng)異常中斷發(fā)生時(shí)這些位發(fā)生變化。在特權(quán) 級的處理器模式下,軟件可以修改這些控制位。*中斷禁止位:當(dāng)1=1時(shí)禁止IRQ中斷,當(dāng)F=1時(shí)禁止FIQ中斷即說明本指令是ARM指令還是Thumb指令。T控制位含義如下:T控制位的含義如下*T控制位:T控制位用于控制指令執(zhí)行的狀態(tài), 對于ARM V4以更高版本的T系列ARM處理器,T=0表示執(zhí)行ARM指令T=1表示執(zhí)行Thumb指令對于ARM V5以及更高版本的非 T系列處理器,T=0表示執(zhí)行ARM指令T=1表示強(qiáng)制下一條執(zhí)行的指令
9、產(chǎn)生未定指令中斷 *M控制位*M控制位控制處理器模式,具體含義如下:M4:0處理器模式可訪問的寄存器ob10000 user pc,r14r0,C PSR0b10001 FIQ P C,R14_FIQ-R8_FIQ,R7R0,C PSR,S PSR_FIQ0b10010 IRQ P C,R14_IRQ-R13_IRQ,R12R0,C PSR,S PSR_IRQ0B10011 SUP ERVISOR P C,R14_SVC-R13_SVC,R12R0,C PSR,S PSR_SVC0b10111 ABORT P C,R14_ABT-R13_ABT,R12R0,C PSR,S PSR_ABT0b1
10、1011 UNDEFINEED P C,R14_UND-R8_UND,R12R0,C PSR,S PSR_UND0b11111 SYSTEM P C,R14-R0,C PSR(ARM V4以及更高版本)*CPSR中的其他位如果處理器預(yù)取的指令的地址不存在,或者該地址不允許當(dāng)前指令訪問,當(dāng)被預(yù)取的指令執(zhí) 行時(shí),處理器產(chǎn)生指令預(yù)取終止異常中斷。這些位用于將來擴(kuò)展。應(yīng)用軟件不要操作這些位。ARM基礎(chǔ)知識三在ARM體系中通常有以下 3種方式控制程序的執(zhí)行流程:*在正常執(zhí)行過程中,每執(zhí)行一條ARM指令,程序計(jì)數(shù)器(PC)的值加4個(gè)字節(jié);每執(zhí)行一條Thumb指令,程序計(jì)數(shù)器寄存器 (PC)加2個(gè)字節(jié)。整個(gè)
11、過程是按順序執(zhí)行。*跳轉(zhuǎn)指令,程序可以跳轉(zhuǎn)到特定的地址標(biāo)號處執(zhí)行,或者跳轉(zhuǎn)到特定的子程序處執(zhí)行。其 中,B指令用于執(zhí)行跳轉(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)場,從異常中斷處理程 序退出
12、時(shí),要恢復(fù)被中斷程序的執(zhí)行現(xiàn)場。ARM基礎(chǔ)知識四ARM中異常中斷的種類 * 復(fù)位(RESET)指令與取終止(PrefechAbort)*當(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ù)位。*未定義的指令*產(chǎn)生未定義的指令異常中斷,當(dāng)ARM處理器或者是系統(tǒng)中的協(xié)處理器認(rèn)為當(dāng)前指令未定義時(shí), 可以通過改異常中斷機(jī)制仿真浮點(diǎn)向量運(yùn)算。*軟件中斷*這是一個(gè)由用戶定義的中斷指令??捎糜谟脩裟J较碌某绦蛘{(diào)用特權(quán)操作指令。在實(shí)時(shí)操作 系統(tǒng)中可以通過該機(jī)制西線系統(tǒng)功能調(diào)用。*數(shù)據(jù)
13、訪問終止(DATAABORT如果數(shù)據(jù)訪問指令的目標(biāo)地址不存在,或者該地址不允許當(dāng)前指令訪問,處理器產(chǎn)生數(shù)據(jù)訪問終止異常中斷*外部中斷請求(IRQ)在系統(tǒng)復(fù)位時(shí)安裝異常中斷處理程序*1. 地址0x00處為ROM勺情況使用數(shù)據(jù)讀取指令 LDR示例如下所示:Vectorni t_BlockLDR PC, Reset_AddrLDR PC, Un defi ned_Addr當(dāng)處理器的外部中斷請求引腳有效,而且CPSR勺寄存器的I控制位被清除時(shí),處理器產(chǎn)生外部中斷請求異常中斷。系統(tǒng)中個(gè)外設(shè)通過該異常中斷請求處理服務(wù)。*快速中斷請求(FIQ)*當(dāng)處理器的外部快速中斷請求引腳有效,而且CPSR的 F控制位被
14、清除時(shí),處理器產(chǎn)生外部中斷請求異常中斷 異常中斷向量表及異常中斷優(yōu)先級中斷向量表指定了個(gè)異常中斷及其處理程序的對應(yīng)關(guān)系。他通常存放在存儲地址的低端。在ARM體系中,異常中斷向量表的大小為32字節(jié),其中每個(gè)異常中斷占據(jù) 4個(gè)字節(jié)大小,保留了 4個(gè)字節(jié)空間。PC每個(gè)異常中斷對應(yīng)的中斷向量表中的4個(gè)字節(jié)的空間中存放了一個(gè)跳轉(zhuǎn)指令或者一個(gè)向I寄存器中賦值的數(shù)據(jù)訪問指令。通過這兩種指令,程序?qū)⑻D(zhuǎn)到相應(yīng)的異常中斷處理程序處 執(zhí)行。當(dāng)幾個(gè)異常中斷同時(shí)發(fā)生時(shí),就必須按照一定的次序來處理這些異常中斷。各個(gè)異常中斷的中斷向量地址以及中斷的處理優(yōu)先級中斷向量地址 異常中斷類型 異常中斷模式 優(yōu)先級(6最低)0x0
15、00x040x080x0C0x100x140x180x1C復(fù)位特權(quán)模式1未定義的指令未定義指令終止模式 6 軟件中斷特權(quán)模式6指令預(yù)取終止 數(shù)據(jù)訪問終止 保留未使用 外部中斷請求 快速中斷請求終止模式 終止模式 未使用IRQ模式 FIQ模式ARM基礎(chǔ)知識五在應(yīng)用程序中安裝異常中斷處理程序1. 使用跳轉(zhuǎn)指令:可以在異常中斷對應(yīng)異常向量表中特定位置放置一條跳轉(zhuǎn)指令,直接跳轉(zhuǎn)到該異常中斷的處理程序。這種方法有一個(gè)缺點(diǎn),即只能在32M空間范圍內(nèi)跳轉(zhuǎn)。2. 使用數(shù)據(jù)讀取指令 LDR使用數(shù)據(jù)讀取指令 LDR向程序計(jì)數(shù)器PC中直接賦值。這種方法分4KB范圍內(nèi)的一個(gè)存儲PC中。為兩步:先將異常中斷處理程序的絕
16、對地址存放在存放在距離向量表 單元中;再使用數(shù)據(jù)讀取指令LDR將該單元的內(nèi)容讀取到程序計(jì)數(shù)器LDR PC, SW_AddrLDR PC, P refeth_AddrLDR PC, Abort_AddrNOPLDR P C, IRQ_AddrLDR PC, FIQ_AddrReset Addr DCD Start BootUn defi ned_Addr DCD Un defi ned_Ha ndleSW_Addr DCD SWI_Ha ndlePrefeth Addr DCD Prefeth HandleAbort Addr DCD Abort HandleDCD 0IRQ_Addr DCD
17、IRQ_Ha ndle FIQ_Addr DCD FIQ_Ha ndle 使用跳轉(zhuǎn)指令的示例如下所示:Vectorni t_BlockBL Reset_Ha ndleBL DCD Un defi ned Han dieBL SWI Han dieBL P refeth Han dieBL Abort Han dieNOPBL IRQ_Ha ndleBL FIQ_Ha ndle2. 地址0x00處為RAM的情況PC中賦值的形式。而且, ROM中復(fù)制到RAM中地址0x00開始處的存儲空間中:地址0x00處為RAM時(shí),中斷向量表必須使用數(shù)據(jù)讀取指令直接指向 必須使用下面的代碼巴中斷向量表從MOV r
18、8,#0ADR r9,Vector_I ni t_Block;復(fù)制中斷向量表(8字)LDMIA r9!,(r0-r7)8 字 words)STMIA r8!,(r0-r7);復(fù)制保存各中斷處理函數(shù)地址的表(LDMIA r9!,(r0-r7)STMIA r8!,(r0-r7)ARM基礎(chǔ)知識六*ARM存儲系統(tǒng)概述卄*卄*卄*卄*卄*卄*卄*卄*卄*卄*卄*卄*卄*卄*ARM存儲系統(tǒng)的體系結(jié)構(gòu)適應(yīng)不同的嵌入式應(yīng)用系統(tǒng)的需要差別很大。最簡單的存儲系統(tǒng)使 用平辦事的地址映射機(jī)制,就像一些簡單的彈片機(jī)系統(tǒng)中一樣,地址空間的分配方式是固定 的,系統(tǒng)各部分都使用物理地址。而一些復(fù)雜系統(tǒng)可能包括下面的一種或幾種
19、技術(shù),從而提 供更為強(qiáng)大的存儲系統(tǒng)。*系統(tǒng)中可能包含多種類型的存儲器,如FLASH,ROM,RAM,EEPROM不同類型的存儲器的速度和寬度等各不相同。*通過使用CACHED WRIT田UFFE敲術(shù)縮小處理器和存儲系統(tǒng)速度差別,從而提高系統(tǒng)的整體性能。*內(nèi)存管理部件通過內(nèi)存映射技術(shù)實(shí)現(xiàn)虛擬空間到物理空間的映射。在系統(tǒng)加電時(shí),將ROM/FLAS影射為地址0,這樣可以進(jìn)行一些初始化處理;當(dāng)這些初始化完成后將 RAM地址影射為0,并把系統(tǒng)程序加載到RAM中運(yùn)行,這樣很好地解決了嵌入式系統(tǒng)的需要。*引入存儲保護(hù)機(jī)制,增強(qiáng)系統(tǒng)的安全性。*引入一些機(jī)制保證I/O操作應(yīng)設(shè)成內(nèi)存操作后,各種I/O操作能夠得到
20、正確的結(jié)果。*與存儲系統(tǒng)相關(guān)的程序設(shè)計(jì)指南 *本節(jié)從外部來看 ARM存儲系統(tǒng),及 ARM存儲系統(tǒng)提供的對外接口。本節(jié)介紹用戶通過這些接 口來訪問ARM存儲系統(tǒng)時(shí)需要遵守的規(guī)則。1. 地址空間ARM體系使用單一的和平板地址空間。該地址空間大小為 2人32個(gè)8位字節(jié),這些字節(jié)的單元地址是一個(gè)無符號的 32位數(shù)值,其取值范圍為 02人32-1。ARM地址空間也可以看作是2人30個(gè)32位的字單元。這些字單元的地址可以被4整除,也就是說該地址低兩位為0b00。地址為A的字?jǐn)?shù)據(jù)包括地址為 A、A+1、A+3 A+3 4個(gè)字節(jié)單元的內(nèi)容。各存儲單元的地址作為32為無符號數(shù),可以進(jìn)行常規(guī)的整數(shù)運(yùn)算。這些運(yùn)算的
21、結(jié)果進(jìn)行 2人32取模。程序正常執(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. 存儲器格式有下面幾種:A,A+1,A+2,A+3。A,A+1。A+2,A=3.A,A+2。a的字單元其中字節(jié)單元由高位到低位字節(jié)順序?yàn)樵贏RM中,如果地址 A是字對齊的,A的字單元包括字節(jié)單元A的班子單元包括字節(jié)單元A+2的半字單元包括字節(jié)單元A的字單元包括半字節(jié)單元*地址為*地址為*地址為*地址為在big-endian格式中,對于地址為A,A+1,A=2,A+3;這種存儲器格式如下所示: 31
22、24 23 16 15 8 7 0字單元A |半字單元 A |半字單元 A+2 |字節(jié)單元A |字節(jié)單元A+1 |字節(jié)單元A+2 |字節(jié)單元A+3|在little-endian格式中,對于地址為 A的字單元由高位到低位字節(jié)順序?yàn)锳+3,A+2,A+1,A ,這種存儲格式如下所示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)中沒有提供指令來選擇存儲器格式。如果系統(tǒng)中包含標(biāo)準(zhǔn)的ARM控制協(xié)處理器CP15,則CP15的寄存器C1的位7決定系統(tǒng)中存儲器的格式。當(dāng)系統(tǒng)復(fù)位時(shí),寄存器 C1
23、的 7值為零,這時(shí)系統(tǒng)中存儲器格式為little-endian格式。如果系統(tǒng)中采用的是 big-endian格式,則復(fù)位異常中斷處理程序中必須設(shè)置c1寄存器的7位。3. 非對齊的存儲訪問操作非對齊:位于arm狀態(tài)期間,低二位不為 ObOO;位于Thumb狀態(tài)期間,最低位不為 ObO。 3.1非對齊的指令預(yù)取操作如果系統(tǒng)中指定當(dāng)發(fā)生非對齊的指令預(yù)取操作時(shí),忽略地址中相應(yīng)的位,則由存儲系統(tǒng)實(shí)現(xiàn) 這種忽略。3.2非對齊的數(shù)據(jù)訪問操作對于LOAD/STOR操作,系統(tǒng)定義了下面 3中可能的結(jié)果:*執(zhí)行結(jié)果不可預(yù)知*忽略字單元地址低兩位的值,即訪問地址為字單元;忽略半字單元最低位的值,即訪問地址為半字單元
24、。*由存儲系統(tǒng)忽略字單元地址中低兩位的值,半字單元地址最低位的值。4. 指令預(yù)取和自修改代碼當(dāng)用戶讀取PC計(jì)數(shù)器的值時(shí),返回的是當(dāng)前指令下面的第二條指令的地址。 對于ARM旨令來 說,返回當(dāng)前指令地址值加 8個(gè)字節(jié);對于 Thumb指令來說,返回值為當(dāng)前指令地址值加 4 個(gè)字節(jié)。自修改代碼指的是代碼在執(zhí)行過程中修改自身。應(yīng)盡量避免使用。5. 存儲器映射的I/O空間I/O空間設(shè)置成非在ARM中,I/O操作通常被影射為存儲器操作。通常需要將存儲器映射的 緩沖的。ARM基礎(chǔ)知識七*ARM編譯器支持的數(shù)據(jù)類型數(shù)據(jù)類型長度(位)對齊特性Char 8 1(字節(jié)對齊)short 16 2( 百字對齊)Int
25、 32 4( 字對齊)Long 32 4(字對齊)Longlong 64 4( 字對齊)Float 32 4( 字對齊)Double 64 4( 字對齊)Long double 64 4( 字對齊)All pointers 32 4( 字對齊)Bool(C+ only) 32 4( 字對齊)1. 整數(shù)類型在ARM體系中,整數(shù)類型是以2的補(bǔ)碼形式存儲的。對于Iong long類型來說,在littleendian內(nèi)存模式下,其低32位保存在低地址的字單元中,高32為保存在高地址的字單元中;在bigendian模式下,其低32位保存在高地址的字單元中,高32為保存在低地址的字單元中。對于整型數(shù)據(jù)的操
26、作遵守下面的規(guī)則:*所有帶符號的整型書的運(yùn)算是按照二進(jìn)制的補(bǔ)碼進(jìn)行的。*帶符號的整型數(shù)的運(yùn)算不進(jìn)行符號的擴(kuò)展。*帶符號的整型數(shù)的右移操作是算數(shù)移位。*制定的移位位數(shù)的數(shù)是 8位的無符號數(shù)。*進(jìn)行移位操作的數(shù)被作為32位數(shù)。0。*超過31位的邏輯左移的結(jié)果為*對于無符號數(shù)和有符號的正數(shù)來說,超過32位的右移操作結(jié)果為 0;對于有符號的負(fù)數(shù)來說,超過32位的右移操作結(jié)果為-1。*整數(shù)除法運(yùn)算的余數(shù)和除數(shù)有相同的符號。*當(dāng)把一個(gè)整數(shù)截?cái)喑晌粩?shù)更短的整數(shù)類型的數(shù)時(shí),并不能保證所得到的結(jié)果的最高位的符 號位的正確性。*整型數(shù)據(jù)之間的類型轉(zhuǎn)換不會產(chǎn)生異常中斷。*整型數(shù)據(jù)的溢出不會產(chǎn)生異常中斷。*整型數(shù)據(jù)除
27、以0將會產(chǎn)生異常中斷。2. 浮點(diǎn)數(shù)在ARM體系中,浮點(diǎn)數(shù)是按照 IEEE標(biāo)準(zhǔn)存儲的。 *float 類型的數(shù)是按照IEEE的單精度數(shù)表示的。*double 和long double 是用IEEE的雙精度數(shù)表示的。 對于浮點(diǎn)數(shù)的操作遵守下面的規(guī)則:*遵守正常的IEEE754規(guī)則。*當(dāng)默認(rèn)情況下禁止浮點(diǎn)數(shù)運(yùn)算異常中斷。*當(dāng)發(fā)生卷繞時(shí),用最接近的數(shù)據(jù)來表示。3. 指針類型的數(shù)據(jù) 下面的規(guī)則適用于處數(shù)據(jù)成員指針以外的其他指針:*NULL被定義為0。*相鄰的兩個(gè)存儲單元地址相差一。*在指向函數(shù)的指針和指向數(shù)據(jù)的指針進(jìn)行數(shù)據(jù)轉(zhuǎn)換時(shí),編譯器將會產(chǎn)生警告信息。* 類型 size_t 被定義為 unsigned
28、 int.* 類型 ptrdiff_t被定義為 signed int。*兩個(gè)指針類型的數(shù)據(jù)相減時(shí),結(jié)果可以按照下面的公式得到。(i nt)a-(i nt)b)/(i nt)sizeof(t ype poin ted to)這時(shí),只要指針?biāo)傅膶ο蟛皇莗ack的,其對齊特性能夠滿足整除的要求。ARM基礎(chǔ)知識八*ARM編譯器中預(yù)定義的宏ARM編譯器預(yù)定義了一些宏,這些預(yù)定義宏對應(yīng)一定的數(shù)值,有些預(yù)定義宏沒有對應(yīng)數(shù)值, 見下表:arm _ 使用編譯器 armcc,tcc,armcpp,tcpp時(shí)代表ADS 代表1.1)0代表1.1)_ARMCC_VERSION Ve代表編譯器版本號,其格式為: PV
29、tbbb,其中:P為產(chǎn)品編號(1V為副版本號(1T為補(bǔ)丁版本號( bbb 為 build 號(比如 650)_APCS_INTERWORK 使用編譯選項(xiàng)-apcs/interwork時(shí)_AP CS_RO PI _ 使用編譯選項(xiàng) ap cs/ro pi _RWPI _使用編譯選項(xiàng)-apcs/rwpi時(shí)_APCS_SWST _使用編譯選項(xiàng)-apcs/swstBIG_ENDIAN _編譯器針對目標(biāo)系統(tǒng)使用big-e ndia n內(nèi)存模式時(shí)_cplus plus _編譯器工作與C+莫式時(shí).CC_ARM _返回編譯器的名稱DATE date編譯源文件的日期_embedded_cplus plus 編譯器
30、工作于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)前被編譯的代碼行號名稱MOUDLE_ mo(預(yù)定義宏_FILE_的文件名稱部分OPTIMISE SPACE使用編譯選項(xiàng)-OSPACE時(shí).OPTIMISE_TIME _使用編譯選項(xiàng)-Otime時(shí)_p retty_fu nc n ame unman gled的當(dāng)前函數(shù)名稱_sizeof_ int 4 sizeof( in t),在預(yù)處理表達(dá)式中可以使用_sizeof_ long 4 sizeof
31、( Ion g),在預(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體系編號.TARGET_CPU_xx _ xx代表 CPU編號 _TARGET_FEATUREi ARM體系支持指令 PLD,LDRD,STRD,MCRR,MRRCDOUBLEWORD設(shè)置該定義宏 _TARGET_FEATURE當(dāng)系統(tǒng)中包含DSP乘法處理器時(shí),設(shè)置該 DSP
32、MUL預(yù)定義宏 _TARGET_FEATURE如果目標(biāo)ARM體系支持半字訪問以及有符號的字節(jié)數(shù)據(jù)HALFWORD _設(shè)置該預(yù)定義宏 _TARGET_FEATURE如果目標(biāo)ARM體系支持長乘法指令 MULL和 MULTI PLY _ MUAL,設(shè)置該預(yù)定義宏_TARGET_FEATURE如果目標(biāo)ARM體系支持THUMB旨令 THUMB _TARGET_FPU_xx _表示FPU選項(xiàng),可能取值如下所示:_TARGET_F PU_VFP_TARGET_F PU_FPA_TARGET_ FPU _SOFTV FP_TARGET_ FPU _SOFTVFP_V FP_TARGET_ FPU _SOFT
33、FPA_TARGET_ FPU_N ONEthumb _編譯器為tcc或tcpp時(shí),設(shè)置該預(yù)定義宏 _TIME源文件編譯時(shí)間ARM基礎(chǔ)知識九卄*卄*卄*卄*卄*卄*卄*卄*卄*卄*卄*卄*卄*卄*卄*幵*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)初始化的存儲區(qū)域、內(nèi)容初始化成0的存儲區(qū)域。每個(gè)輸入段有相應(yīng)的屬性,可以為只讀的(RO、可讀寫的(Rvy以及初始化成0的(ZI)。ARM連接器根據(jù)個(gè)輸
34、入段的屬性將這些輸入段分組,再組成不同的輸出段及 域。一個(gè)輸出段中包含了一系列的具有相同的RO RW和ZI屬性的輸入段。輸出段的屬性與其中包含的輸入段的屬性相同。在一個(gè)輸出段的內(nèi)部,各輸入段是按照一定的規(guī)則排序的,這將 在1.3節(jié)油詳細(xì)地介紹。一個(gè)域中包含1-3個(gè)輸出段,其中個(gè)輸出段的屬性各不相同。各輸出段的排列順序是由其屬性決定的。其中RO屬性的輸出段排在最前面,其次是RW屬性的輸出段,最后是ZI屬性的輸出段。一個(gè)域通常映射到一個(gè)物理存儲器上,如ROM或 RAM1.2ARM映像文件各組成部分的地址影射ARM映像文件各組成部分在存儲系統(tǒng)中的地址有兩種:一種是映像文件位于存儲器中時(shí)(也 就是該映
35、像文件運(yùn)行之前)的地址,稱之為加載地址;一種是映像文件運(yùn)行時(shí)的地址,稱之 為運(yùn)行時(shí)地址。之所以有這兩種地址,是因?yàn)橛诚裎募谶\(yùn)行時(shí),其中的有些域是可以移動(dòng) 的新的存儲區(qū)域。比如,已經(jīng)初始化的RW屬性的數(shù)據(jù)所在的段運(yùn)行之前可能保存系統(tǒng)的ROMRAM中。中,在運(yùn)行時(shí),他被移動(dòng)至ARM連接器需要知道如下的通常,一個(gè)映像文件包含若干個(gè)域,各域又包含若干的輸出段。信息,已決定如何生成相應(yīng)的映像文件。*分組信息決定如何將個(gè)輸入段組織成相應(yīng)的輸出段和域。*定位信息 決定個(gè)域在存儲空間地址中的起始地址。根據(jù)映像文件中地址映射的復(fù)雜程度,有兩種方法來告訴arm連接器這些相關(guān)信息。對于映像文件中地址映射關(guān)系比較簡
36、單的情況,可以使用命令行選項(xiàng);對于映像文件中地址映射關(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)是通過跳轉(zhuǎn)到該初始入口點(diǎn) 處來加載該映像文件。普通的入口點(diǎn)是在匯編中用ENTRY偽操作定義。他通常用于標(biāo)志該段代碼是通過異常中斷處理程序進(jìn)入的。這樣連接器刪除無用
37、的段時(shí)不會將該段代碼刪除。一個(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來指定映像文件的初始入口點(diǎn)。這時(shí), address指定了映像文件的初始入口點(diǎn)的地址值。對于地址0x0處為rom的嵌入式應(yīng)用系統(tǒng),可以使用-entry 0x0來指定映像文件的初始入口點(diǎn)。這樣當(dāng)系統(tǒng)復(fù)位后,自動(dòng)跳轉(zhuǎn)到該入口開始執(zhí)行。如果映像文件是被一個(gè)加載器加
38、載的,該映像文件該映像文件必須包含一個(gè)初始化入口點(diǎn)。 這種映像文件通常還包含了其他普通入口點(diǎn),這些普通入口點(diǎn)一般為異常中斷處理程序的入口地址。當(dāng)用戶沒有指定-entry address 時(shí),連接器根據(jù)下面的規(guī)則決定映像文件的初始入口點(diǎn)。 *如果輸入的目標(biāo)文件中只有一個(gè)普通入口點(diǎn),該普通入口點(diǎn)被連接器當(dāng)成映像文件的初始 入口點(diǎn)。*如果輸入的目標(biāo)文件中沒有一個(gè)普通入口點(diǎn),或者其中的普通入口點(diǎn)多于一個(gè),則連接器 生成的映像文件中不包含初始入口點(diǎn),并產(chǎn)生警告信息。2.3普通入口點(diǎn)的用法普通入口點(diǎn)是在匯編中用ENTRY偽操作定義。在嵌入式應(yīng)用中,各異常中斷的處理程序入口使用普通入口點(diǎn)標(biāo)示。這樣連接器在刪除無用段時(shí)不會將該段代碼刪除。一個(gè)映像文件中可以定義多個(gè)普通入口點(diǎn)。沒有指定連接選項(xiàng)-e ntry addres時(shí),如果輸入的目標(biāo)文件中只有一個(gè)普通入口點(diǎn),該入口點(diǎn)被連接器當(dāng)成映像文件的初始入口點(diǎn)。3輸入段的排序規(guī)則連接器根據(jù)輸入段的屬性來組織這些輸入段,具有相同屬性的輸入段被放到域中一段連續(xù)的 空間中,組成一個(gè)輸出段。在一個(gè)輸出段中,各輸入段的起始地址與 輸出段的起始地址和該輸出段中個(gè)輸入段的排列順序有關(guān)。通常情況下,一個(gè)輸出段中個(gè)輸入段的排列順序由下面幾個(gè)因素決定的。用戶可以通過連接 選項(xiàng)-first 和-last來改變
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版嬰幼兒看護(hù)中心合伙人合作協(xié)議示范文本3篇
- 2025年度汽修廠高級技師勞務(wù)派遣合同
- 2025年度旅游資產(chǎn)經(jīng)營管理委托合同
- 二零二五年度精裝修家居裝修合同
- 2025年度主題餐飲商鋪?zhàn)赓U管理合同
- 二零二五年度邊境運(yùn)輸合同糾紛管轄權(quán)跨境協(xié)議
- 二零二五年度稻谷種植與鄉(xiāng)村旅游融合發(fā)展合同
- 2025年度白酒全國總代理合同-品牌授權(quán)與市場運(yùn)營協(xié)議
- 二零二五年度商業(yè)寫字樓租賃合同終止書
- 2025年度石材行業(yè)市場調(diào)研與咨詢合同
- 2024年供應(yīng)鏈安全培訓(xùn):深入剖析與應(yīng)用
- 飛鼠養(yǎng)殖技術(shù)指導(dǎo)
- 壞死性筋膜炎
- 整式的加減單元測試題6套
- 股權(quán)架構(gòu)完整
- 山東省泰安市2022年初中學(xué)業(yè)水平考試生物試題
- 注塑部質(zhì)量控制標(biāo)準(zhǔn)全套
- 銀行網(wǎng)點(diǎn)服務(wù)禮儀標(biāo)準(zhǔn)培訓(xùn)課件
- 二年級下冊數(shù)學(xué)教案 -《數(shù)一數(shù)(二)》 北師大版
- 晶體三極管資料
- 石群邱關(guān)源電路(第1至7單元)白底課件
評論
0/150
提交評論