ARM微處理器的編程模型之:ARM寄存器組織
1.未分組寄存器
未分組寄存器包括r0~r7。顧名思義,在所有處理器模式下對(duì)于每一個(gè)未分組寄存器來說,指的都是同一個(gè)物理寄存器。未分組寄存器沒有被系統(tǒng)用于特殊的用途,任何可采用通用寄存器的應(yīng)用場(chǎng)合都可以使用未分組寄存器。但由于其通用性,在異常中斷所引起的處理器模式切換時(shí),其使用的是相同的物理寄存器,所以也就很容易使寄存器中的數(shù)據(jù)被破壞。
2. 分組寄存器
r8~r14是分組寄存器,它們每一個(gè)訪問的物理寄存器取決于當(dāng)前的處理器模式。
對(duì)于這些分組寄存器r8~r12來說,每個(gè)寄存器對(duì)應(yīng)兩個(gè)不同的物理寄存器。一組用于除FIQ模式外的所有處理器模式,而另一組則專門用于FIQ模式。這樣的結(jié)構(gòu)設(shè)計(jì)有利于加快FIQ的處理速度。不同模式下寄存器的使用,要使用寄存器名后綴加以區(qū)分,例如,當(dāng)使用FIQ模式下的寄存器時(shí),寄存器r8和寄存器r9分別記做r8_fiq, r9_fiq;當(dāng)使用用戶模式下的寄存器時(shí),寄存器r8和r9分別記做r8_usr, r9_usr等。在ARM體系結(jié)構(gòu)中,r8~r12沒有任何指定的其他的用途,所以當(dāng)FIQ中斷到達(dá)時(shí),不用保存這些通用寄存器,也就是說FIQ處理程序可以不必執(zhí)行保存和恢復(fù)中斷現(xiàn)場(chǎng)的指令,從而可以使中斷處理過程非常迅速。所以FIQ模式常被用來處理一些時(shí)間緊急的任務(wù),如DMA處理。
對(duì)于分組寄存器r13和r14來說,每個(gè)寄存器對(duì)應(yīng)6個(gè)不同的物理寄存器。其中的一個(gè)是用戶模式和系統(tǒng)模式公用的,而另外5個(gè)分別用于5種異常模式。訪問時(shí)需要指定它們的模式。名字形式如下:
· r13_mode>
· r14_mode>
其中mode>可以是以下幾種模式之一:usr、svc、abt、und、irp及fiq。
r13寄存器在ARM中常用作堆棧指針,稱為SP。當(dāng)然,這只是一種習(xí)慣用法,并沒有任何指令強(qiáng)制性的使用r13作為堆棧指針,用戶完全可以使用其他寄存器作為堆棧指針。而在Thumb指令集中,有一些指令強(qiáng)制性的將r13作為堆棧指針,如堆棧操作指令。
每一種異常模式擁有自己的r13。異常處理程序負(fù)責(zé)初始化自己的r13,使其指向該異常模式專用的棧地址。在異常處理程序入口處,將用到的其他寄存器的值保存在堆棧中,返回時(shí),重新將這些值加載到寄存器。通過這種保護(hù)程序現(xiàn)場(chǎng)的方法,異常不會(huì)破壞被其中斷的程序現(xiàn)場(chǎng)。
寄存器r14又被稱為連接寄存器(Link Register,LR),在ARM體系結(jié)構(gòu)中具有下面兩種特殊的作用。
(1)每一種處理器模式用自己的r14存放當(dāng)前子程序的返回地址。當(dāng)通過BL或BLX指令調(diào)用子程序時(shí),r14被設(shè)置成該子程序的返回地址。在子程序返回時(shí),把r14的值復(fù)制到程序計(jì)數(shù)器PC。典型的做法是使用下列兩種方法之一。
· 執(zhí)行下面任何一條指令。
MOV PC, LR
BX LR
· 在子程序入口處使用下面的指令將PC保存到堆棧中。
STMFD SP!, {register>,LR}
在子程序返回時(shí),使用如下相應(yīng)的配套指令返回。
LDMFD SP!, {register>,PC}
(2)當(dāng)異常中斷發(fā)生時(shí),該異常模式特定的物理寄存器r14被設(shè)置成該異常模式的返回地址,對(duì)于有些模式r14的值可能與返回地址有一個(gè)常數(shù)的偏移量(如數(shù)據(jù)異常使用SUB PC, LR,#8返回)。具體的返回方式與上面的子程序返回方式基本相同,但使用的指令稍微有些不同,以保證當(dāng)異常出現(xiàn)時(shí)正在執(zhí)行的程序的狀態(tài)被完整保存。
R14也可以被用作通用寄存器使用。
注意 | 當(dāng)嵌套中斷被允許時(shí)(即異??芍厝耄?,r13和r14的使用要特別小心。例如,在用戶模式下一個(gè)IRQ中斷發(fā)生,這時(shí)兩種模式分別使用不同的r13和r14,換句話講,用戶模式使用r13_usr和r14_usr,而IRQ模式使用r13_irq和r14_irq,這樣不會(huì)造成寄存器使用沖突。但是,當(dāng)程序運(yùn)行在IRQ模式下,又有IRQ中斷進(jìn)入,此時(shí),第二級(jí)中斷使用r13_irq和r14_irq,沖掉了第一級(jí)IRQ的堆棧指針和返回地址,導(dǎo)致程序異常。 解決辦法是在第二級(jí)中斷發(fā)生前,將第一級(jí)中斷用到的寄存器壓棧。 |
3.3.2 程序計(jì)數(shù)器r15
程序計(jì)算器r15又被記為PC。它有時(shí)可以被和r0-r14一樣用作通用寄存器,但很多特殊的指令在使用r15時(shí)有些限制。當(dāng)違反了這些指令的使用限制時(shí),指令的執(zhí)行結(jié)果是不可預(yù)知的。
程序計(jì)數(shù)器在下面兩種情況下用于特殊的目的。
· 讀程序計(jì)數(shù)器。
· 寫程序計(jì)數(shù)器。
塵埃粒子計(jì)數(shù)器相關(guān)文章:塵埃粒子計(jì)數(shù)器原理
評(píng)論