儲存空間映射基本概念
ARM處理器產生的地址叫虛擬位址,把這個虛擬位址按照某種規則轉換到另一個物理地址去的方法稱為地址映射。這個物理地址表示了被訪問的儲存空間的位置。它是一個位址範圍,該範圍內可以寫入程式碼。
儲存空間映射控制的必要性
為了讓運行在不同儲存空間空間中的程式對異常進行控制。可以通過儲存空間映射控制,將位於不同儲存空間的異常向量表重新對應至固定地址0x00~0x3F處,以實現異常向量表的來源控制。
APCS規定了子程式調用的基本規則,這些規則包括子程式調用過程中寄存器、資料棧的使用規則以及參數的路由規則。
異常向量表
對於每一個例外狀況事件,都有一個與之相對應的處理常式,它們是關聯在一起的,並以一張一維表的格式儲存在儲存空間的固定單元中。這張指定了各異常中斷及其處理常式的對應關係的表,稱為異常向量表。
ARM處理器對異常中斷的響應過程
(1)儲存處理器目前狀態、中斷屏蔽位以及各條件標誌位。
(2)設定當前程式狀態寄存器CPSR中的相應的位。
(3)將寄存器lr_mode設定成返回地址。
(4)將程式計數器值(PC)設定成該中斷的中斷向量地址,從而跳轉到相應的異常中斷處理常式處執行。
異常的響應過程
除了複位異常外,當異常發生後,ARM核會儘可能執行完當前指令,然後自動執行如下動作:
(1)、儲存返回地址到LR_<mode>
(2)、複製CPSR到SPSR_<mode>中。
(3)、設定CPSR進入相應的處理器模式。
(4)、設定CPSR的第7位來禁止IRQ。如果異常為快速中斷和複位。則還要設定CPSR的第6位來禁止快速中斷。
(5)、給PC強制賦向量地址值。
進入異常
1.在適當的LR中儲存下一條指令的地址;2.將CPSR複製到適當的SPSR中;3. 將CPSR模式位強制設定為與異常類型相對應的值;4.強制PC從相關的異常向量處取指。
退出異常
1.將LR( R14 )中的值減去位移量後存入PC,位移量根據異常的類型而有所不同;2.將SPSR的值複製回CPSR;3.清零在入口置位的中斷禁止標誌。
ARM處理器異常分為①資料中止 ②快速插斷要求③普通插斷要求 ④預取指中止 ⑤軟體中斷 ⑥複位 ⑦未定義指令異常 7種。
異常向量表中程式跳轉使用LDR指令,而沒有使用B指令。原因:
1.LDR指令可以全位址範圍跳轉,而B指令只能在前後32MB範圍內跳轉;
2.晶片具有儲器重新對應(Remap)功能。當向量表位於內部RAM或外部儲存空間中,用B指令不能跳轉到正確的位置。
小端儲存空間系統:
在小端格式中,高位元字存放在高位位元組中。因此儲存空間系統位元組0串連到資料線7~0(低位對齊)。
大端儲存空間系統:
在大端格式中,高位元字存放在低位位元組中。因此儲存空間系統位元組0串連到資料線31~24(高位對齊) 。
STMFD sp!,{lr};儲存資料棧LDMFD sp!,{pc};恢複
複位:當nRESET訊號再次變為高電平時,ARM處理器執行下列操作:
1.強制CPSR中的M[4:0]變為b10011(管理員模式);2.置位CPSR中的I和F位;3.清零CPSR中的T位;4.強制PC從地址0x00開始對下一條指令進行取指;5.返回到ARM狀態並恢複執行 。
R14(LR)寄存器與子程式調用
1.程式A執行過程中調用程式B;
2.程式跳轉至標號Lable,執行程式B。同時硬體將“BL Lable”指令的下一條指令所在地址存入R14(LR);
3.程式B執行最後,將R14寄存器的內容放入PC,返回程式A;
ARM處理器共有7種工作模式:
①使用者模式 :非特權模式,也就是正常程式執行的模式,大部分任務在這種模式下執行。在使用者模式下,如果沒異常發生不允許應用程式自行改變處理器的工作模式,如果有異常發生,處理器會自動切換工作模式。
②FIQ模式 :也稱為快速中斷模式,支援高速資料轉送和通道處理,當一個高優先順序(fast)中斷產生時將會進入這種模式。
③IRQ模式 :也成為普通中斷模式,當一個低優先順序(normal)中斷產生時將會進入這種模式。在這種模式下按中斷的處理器方式有分為向量中斷和非向量中斷兩種。通常的中斷都在IRQ模式下進行。
④SVC模式 :稱之為管理員模式,它是一種作業系統保護模式。當複位或非強制中斷指令執行時處理器進入這種模式。
⑤中止模式 :當存取異常時將會進入中止模式,用來處理儲存空間故障、實現虛擬儲存或儲存保護。
⑥未定義指令異常模式:當執行未定義指令時會進入這種模式,主要是用來處理未定義的指令陷阱,支援硬體協處理的軟體模擬,因為未定義指令多發生在副處理器的操作上。
⑦系統模式:使用和User模式相同寄存器組的特權模式,用來運行特權級的操作作業系統任務。
區別:特權模式--程式可以訪問所有的系統資源,也可以任意地進行處理器模式的切換。
ARM9採用5級流水線:取指、解碼、執行、儲存空間訪問、寄存器回寫。
·取指:從指令Cache中讀取指令。
·解碼:對指令進行解碼,識別出對哪個寄存器進行操作並從通用寄存器中讀取運算元。
·執行:進行ALU運算和移位操作,如果是對儲存空間操作的指令,則在ALU中計算出要訪問的儲存空間地址。
·儲存空間訪問:如果是對儲存空間訪問的指令,用來實現資料緩衝功能(通過資料Cache);如果不是對儲存空間訪問的指令,本級流水線為一個空的刻度。
·寄存器回寫:將指令運算或操作結果寫回到目標寄存器中。
CISC:複雜指令集(Complex Instruction Set Computer)
具有大量的指令和定址方式,指令長度可變;8/2原則:80%的程式只使用20%的指令;大多數程式只使用少量的指令就能夠運行。
RISC:精簡指令集(Reduced Instruction SetComputer)
只包含最有用的指令,指令長度固定;確保資料通道快速執行每一條指令;使CPU硬體結構設計變得更為簡單
1.MOV指令與LDR指令都是往目標寄存器中傳送資料,但是它們有什麼區別嗎?
MOV指令用於將資料從一個寄存器傳送到另一個寄存器中,或者將一個常數傳送到一個寄存器中,但是不能訪問記憶體。LDR指令用於從記憶體中讀取資料放入寄存器中。
1、ARM7TDMI-S各字母代表的含義?核心特點?採用幾級流水線,分別是?
ARM{x}{y}{z}{T}{D}{M}{I}{E}{J}{F}{-S}
大括弧內的字母是可選的,各個字母的含義如下:
x ——系列號,例如ARM7中的“7”、ARM9中的“9”;
y ——內部儲存管理/保護單元,例如ARM72中的“2”、ARM94中的“4”;
z ——內含有快取Cache;
T ——技持16位的Thumb指令集;
D ——支援JTAG片上調試;
M ——支援用於長乘法操作(64位結果)的ARM指令,包含快速乘法器;
I ——帶有嵌入式追蹤宏單元ETM(Embedded Trace Macro),用來設定斷點和觀察點的調試硬體;
E ——增強型DSP指令(基於TDMI);
J ——含有Java加速器Jazelle,與Java虛擬機器相比,Java加速器Jazelle使Java代碼運行速度提高了8倍,功耗降低到原來的80%;
F ——向量浮點單位;
S——可綜合版本,意味著處理器核心是以原始碼形式提供的。這種原始碼形式又可以被編譯成一種易於EDA工具使用的形式。
核心特點:
32/16 位RISC架構(ARM v4T)。
具有最高效能和靈活性的32位ARM指令集。
代碼緊湊的16位Thumb指令集。
統一的匯流排介面,指令與資料都在32位匯流排上傳輸。
3級流水線。
32位算數邏輯單位(ALU)。
極小的核心尺寸以及低功耗。
副處理器介面。
擴充的調試裝置:·EmbeddedICE-RTJust-in-Time 偵錯單元。 ·JTAG介面單元。 ·與嵌入式跟蹤宏單元(ETM)直接連接的介面。
ARM7系列核心採用了三級流水線的核心結構,三級流水線分別為取指(Fetch)、解碼(Decode)、執行(Execute)
·取指:將指令從儲存空間中取出,放入指令Cache中。
·解碼:由解碼邏輯單元完成,是將在上一步指令Cache中的指令進行解釋,告訴CPU將如何操作。
·執行:這階段包括移位操作、讀通用寄存器內容、輸出結果、寫通用寄存器等。也就是將上一步中已被解碼的指令進行邏輯電路實現。
1、排序
AREA TEXT,CODE,READWRITE ENTRY MOV R0,#100 ;迴圈數目 MOV R1,#0 ;初始化資料 LOOP ADD R1,R1,R0 ;將資料進行相加,獲得最後的資料 SUBS R0,R0,#1 ;迴圈資料R0減去1 CMP R0,#0 ;將R0與0比較看迴圈是否結束 BNE LOOP ;判斷迴圈是否結束,接受則進行下面的步驟 LDR R2,=RESULT STR R1,[R2] RESULT DCD 0 STOP B STOP ;排列演算法:先將所有的資料與第一個進行比較,最後取出最小的資料放到第一個記憶體單元中 ;然後再從第二個記憶體單元開始進行比較,將第二小的資料放到第二個記憶體單元中, ;以此內推則能將十個資料進行排列。 AREA TEXT,CODE,READWRITE ENTRY LDR R0,=DATA ;獲得DATA資料的起始地址 MOV R1,R0 MOV R5,#9 ;開始的迴圈數目是10次,所以應該從9開始 MOV R6,R5 COMPARE ADD R0,R0,#4 ;將R0所儲存的地址+4表示為下一個要比較的數的地址 SUB R6,R6,#1 ;迴圈1次減1 LDR R2,[R1] ;將放在寄存器中的資料取出進行大小比較 LDR R3,[R0] CMP R3,R2 MOVCC R7,R2 ;如果後面的地址的數值比前一個小則交換他們的資料 MOVCC R2,R3 MOVCC R3,R7 STR R2,[R1] ;將資料存放區到相應的記憶體單元中 STR R3,[R0] CMP R6,#0 ;看每次的迴圈是否結束 BNE COMPARE ADD R1,R1,#4 ;每次迴圈結束以後將初始的指向的記憶體位址後移一個單元 MOV R0,R1 ;重新初始化上個迴圈中的寄存器中儲存的地址 SUB R5,R5,#1 ;每次迴圈以後上面在以後的迴圈中的次數都會減1 MOV R6,R5 CMP R5,#0 ;判斷所有的迴圈是否結束 BNE COMPARE DATA DCD 9,4,6,7,8,1,3,2,0,5 STOP B STOP
C語言代碼:
#include<stdio.h> extern void strcopy(char *d, const char *s); int main() { const char *srcstr="abcdefghi"; char dststr[]="ighfedcba"; strcopy(dststr,srcstr); return 0; }
ARM彙編代碼:
STACK_TOPEQU 0x40002000 PRESERVE8 AREA SCopy, CODE, READONLY EXPORT START EXPORT strcopy import main ENTRY START LDR R13,=STACK_TOP B main strcopy LDRB r2, [r1],#1 STRB r2, [r0],#1 CMP r2, #0 BNE strcopy MOV pc,lr END
stack_top equ0x40002000PRESERVE8export copyAREA copy,CODE,READONLYimport copystrexport startENTRYstartldr r13,=stack_topldr r0,=srcldr r1,=dstBL copystrsrc dcb "abcdefghij"dstdcb "helloworld"end
//C程式#include<stdio.h>voidcopystr(char *d,char *s){while((*d++=*s++)!='\0');}