最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

基于stm32mp157 linux開發(fā)板ARM裸機(jī)開發(fā)教程3:Cortex-A7 架構(gòu)與工作模式(連載中)

2023-03-29 15:31 作者:華清遠(yuǎn)見研發(fā)中心  | 我要投稿

前言:

目前針對(duì)ARM Cortex-A7裸機(jī)開發(fā)文檔及視頻進(jìn)行了二次升級(jí)持續(xù)更新中,使其內(nèi)容更加豐富,講解更加細(xì)致,全文所使用的開發(fā)平臺(tái)均為華清遠(yuǎn)見FS-MP1A開發(fā)板(STM32MP157開發(fā)板)

針對(duì)對(duì)FS-MP1A開發(fā)板,除了Cortex-A7裸機(jī)開發(fā)篇外,還包括其他多系列教程,包括Cortex-M4開發(fā)篇、FreeRTOS篇、Linux基礎(chǔ)及應(yīng)用開發(fā)篇、Linux系統(tǒng)移植篇、Linux驅(qū)動(dòng)開發(fā)篇、硬件設(shè)計(jì)篇、人工智能機(jī)器視覺篇、Qt應(yīng)用編程篇、Qt綜合項(xiàng)目實(shí)戰(zhàn)篇等。除此之外計(jì)劃針對(duì)Linux系統(tǒng)移植篇、Linux驅(qū)動(dòng)開發(fā)篇均會(huì)進(jìn)行文檔及視頻的二次升級(jí)更新敬請(qǐng)關(guān)注!

開發(fā)板更多資料領(lǐng)取可關(guān)注華清遠(yuǎn)見在線實(shí)驗(yàn)室領(lǐng)取~~~

Cortex-A7 架構(gòu)與工作模式

Cortex-A7 內(nèi)核工作模式

Cortex-A7 基于 ARMv7-A 架構(gòu),共有 9 種工作模式。

除用戶模式外的其他 8 種處理器模式稱為特權(quán)模式(Privileged Modes)。在特權(quán)模式下,程序可以訪問所有的系統(tǒng)資源,也可以任意地進(jìn)行處理器模式切換。

處理器模式可以通過軟件控制進(jìn)行切換,也可以通過外部中斷或異常處理過程進(jìn)行切換。

大多數(shù)的用戶程序運(yùn)行在用戶模式下。當(dāng)處理器工作在用戶模式時(shí),應(yīng)用程序不能夠訪問受操作系統(tǒng)保護(hù)的一些系統(tǒng)資源,應(yīng)用程序也不能直接進(jìn)行處理器模式切換。當(dāng)需要進(jìn)行處理器模式切換時(shí),應(yīng)用程序可以產(chǎn)生異常處理,在異常處理過程中進(jìn)行處理器模式切換。這種體系結(jié)構(gòu)可以使操作系統(tǒng)控制整個(gè)系統(tǒng)資源的使用。

當(dāng)應(yīng)用程序發(fā)生異常中斷時(shí),處理器進(jìn)入相應(yīng)的異常模式。在每一種異常模式中都有一組專用寄存器以供相應(yīng)的異常處理程序使用,這樣就可以保證在進(jìn)入異常模式時(shí)用戶模式下的寄存器(保存程序運(yùn)行狀態(tài))不被破壞。

寄存器組織

Cortex-A7 處理器寄存器組織概述

Cortex-A7 處理器共有 9 種不同的處理器模式,在每一種處理器模式中都有一組相應(yīng)的寄存器組,如下圖所示,列出了 Cortex-A7 處理器的寄存器組織和模式關(guān)系概要。

1、在寄存器組織的圖中,每個(gè)小方塊是一個(gè)寄存器,每個(gè)寄存器都是 32 位的。

2、寄存器沒有地址,訪問寄存器通過編號(hào)進(jìn)行訪問,r0-r15, cpsr, spsr。

3、banked 類型的寄存器屬于私有的寄存器,而非 banked 類型的寄存器屬于公有的寄存器。

4、user 模式和 system 模式最多可以訪問 17 個(gè)寄存器, HYP 模式最多可以訪問 19 個(gè)寄存器,其他的模式可以訪問 18 個(gè)寄存器。

5、寄存器組織中只有 43 個(gè)寄存器,共計(jì) 172 字節(jié),因此在開發(fā)中盡量不要定義 register 類型的變量,原因就是寄存器個(gè)數(shù)有限,寄存器類型的變量不可以進(jìn)行取地址的操作,原因是寄存器沒有地址。

6、當(dāng)前處理器的模式?jīng)Q定著哪組寄存器可操作,任何模式都可以存取下列寄存器。

1) 相應(yīng)的 R0~R12、相應(yīng)的 R13(Stack Pointer,SP,棧指向)和 R14(the Link Register,LR,鏈路寄存器)。

2) 相應(yīng)的 R15(PC)、相應(yīng)的 CPSR。特權(quán)模式(除 System 模式外)還可以存取相應(yīng)的 SPSR。只有HYP 模式可以存取 ELR_hyp。

7、通用寄存器根據(jù)其分組與否可分為以下兩類:

1) 未分組寄存器(Unbanked Register),包括 R0~R7。對(duì)應(yīng)下圖的 Low Registers。

2) 分組寄存器(Banked Register),包括 R8~R12。對(duì)應(yīng)下圖的 High Register。

未分組寄存器包括 R0~R7。顧名思義,在所有處理器模式下,對(duì)于每一個(gè)未分組寄存器來說,指的都是同一個(gè)物理寄存器。未分組寄存器沒有被系統(tǒng)用于特殊的用途,任何可采用通用寄存器的應(yīng)用場合都可以使用未分組寄存器。但由于其通用性,在異常中斷所引起的處理器模式切換時(shí),其使用的是相同的物理寄存器,所以也就很容易使寄存器中的數(shù)據(jù)被破壞。需要考慮保護(hù)會(huì)恢復(fù)。

分組寄存器包括 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í),不用保存這些通用寄存器,也就是說,F(xiàn)IQ 處理程序可以不必執(zhí)行針對(duì) R8~R12 保存和恢復(fù)中斷現(xiàn)場

的指令,從而可以使中斷處理過程非常迅速。所以 FIQ 模式常被用來處理一些時(shí)間緊急的任務(wù)。

R13(棧指針)寄存器

對(duì)于分組寄存器 R13 來說,每個(gè)寄存器對(duì)應(yīng) 8 個(gè)不同的物理寄存器。其中的一個(gè)是 User 模式和 Sys模式公用的,而另外 7 個(gè)分別用于 7 種異常模式。文檔中描述時(shí),根據(jù)需要會(huì)指定它們的模式(編碼過程中不需要)。名字形式為:R13_。其中,可以是以下幾種模式之一:usr、svc、abt、und、irq、fiq、mon、hyp。

R13 寄存器在 ARM 處理器中常用做堆棧指針,稱為 SP。當(dāng)然,這只是一種習(xí)慣用法,并沒有任何指令強(qiáng)制性的使用 R13 作為堆棧指針,用戶完全可以使用其他寄存器作為堆棧指針。而在 Thumb 指令集中,有一些指令強(qiáng)制性地將 R13 作為堆棧指針,如堆棧操作指令。

每一種異常模式擁有自己的 R13。異常處理程序負(fù)責(zé)初始化自己的 R13,使其指向該異常模式專用的棧地址。在異常處理程序入口處,將用到的其他寄存器的值保存在堆棧中,返回時(shí),重新將這些值加載到寄存器。通過這種保護(hù)程序現(xiàn)場的方法,異常不會(huì)破壞被其中斷的程序現(xiàn)場。

SP 棧指針寄存器中存放的是棧指針指向的??臻g的地址。此棧是用來壓棧保存現(xiàn)場的,特點(diǎn)是先進(jìn)后出。

ARM 的堆棧屬于“滿減(FD)”棧,SP 棧中的最后一個(gè)有效數(shù)據(jù),有新數(shù)據(jù)入棧后,SP 的值減少。比如可以結(jié)合之前導(dǎo)入的工程 c_led,在 start.s 文件中,加入一段堆棧測試代碼(如果以前沒接觸過匯編,這個(gè)過程也可以等到匯編指令學(xué)習(xí)以后再做)

?

示例代碼 43-1 堆棧測試

將 R5、R6、R7、R8、SP 都加入到 Watch 列表中,這樣單步調(diào)試時(shí)可以實(shí)時(shí)更新。

為了方便觀察,可以把數(shù)據(jù)類型調(diào)整為 16 進(jìn)制顯示

設(shè)置好斷點(diǎn),對(duì)比 R5、R6 入棧之前,和入棧后,SP 指針的位置和內(nèi)容。下圖是入棧前的狀態(tài),SP指向的地址:0xc2001f4c,內(nèi)容是 0。

R5 和 R6 入棧后,SP 指向的地址:0xc2001f44,內(nèi)容是 0x11。如下圖所示。

SP 出棧兩個(gè)字到 R7、R8 后,SP 的值恢復(fù)。

(連接)寄存器

對(duì)于分組寄存器 R14 來說,每個(gè)寄存器對(duì)應(yīng) 7 個(gè)不同的物理寄存器。其中的一個(gè)是 User 模式、Sys模式、HYP 模式公用的,而另外 6 個(gè)分別用于其它 6 種異常模式。文檔中描述時(shí),根據(jù)需要會(huì)指定它們的模式(編碼過程中不需要)。名字形式為:R14_XXX。XXX 可以是以下幾種模式之一:usr、svc、abt、und、irp、fiq、mon。

寄存器 R14 又被稱為連接寄存器(Link Register,LR),可以被用做通用寄存器使用。在 ARM 體系結(jié)構(gòu)中具有下面兩種特殊的作用。每一種處理器模式用自己的 R14 存放當(dāng)前子程序的返回地址。當(dāng)通過BL 或 BLX 指令調(diào)用子程序時(shí),R14 被設(shè)置成該子程序的返回地址。在子程序返回時(shí),把 R14 的值復(fù)制到程序計(jì)數(shù)器(PC)。典型的做法是使用下列兩種方法之一。

方法 1:

執(zhí)行下面任何一條指令。

Mov? ?pc, ?lr

Bx? ?lr

方法 2:

在子程序入口處使用下面的指令將 PC 保存到堆棧中。

stmfd sp!, {,lr}

在子程序返回時(shí),使用如下相應(yīng)的配套指令返回。

ldmfd sp!, {,pc}

當(dāng)異常中斷發(fā)生時(shí),該異常模式特定的物理寄存器 R14 被設(shè)置成該異常模式的返回地址,對(duì)于有些模式 R14 的值可能與返回地址有一個(gè)常數(shù)的偏移量(如數(shù)據(jù)異常使用 sub pc,lr,#8 返回)。具體的返回方式與上面的子程序返回方式基本相同,但使用的指令稍微有些不同,以保證當(dāng)異常出現(xiàn)時(shí)正在執(zhí)行的程序的狀態(tài)被完整保存。

大家可以結(jié)合之前導(dǎo)入的工程 c_led,使用反匯編功能,查看子函數(shù)調(diào)用時(shí)的出口部分。更具體的使用,會(huì)在 AAPCS 過程調(diào)用章節(jié)講解。

?

R15(程序計(jì)數(shù))寄存器

R15 又被稱為 PC 程序計(jì)數(shù)寄存器。PC 寄存器中存儲(chǔ)的時(shí)當(dāng)前取指指令(后續(xù)流水線章節(jié)會(huì)解釋取指指令的意思)的地址,當(dāng)完成取指操作之后,PC 中的值會(huì)自動(dòng)加 4 指向下一條指令。

可以仍然使用上面的測試程序,設(shè)置好斷點(diǎn),程序運(yùn)行到設(shè)定的斷點(diǎn)“mov r5,#0x11”處,此時(shí)PC=0xc20000ac,R5=0。

單步執(zhí)行后 PC 地址加 4,R5=0x11

程序狀態(tài)寄存器

CPSR 寄存器

當(dāng)前程序狀態(tài)寄存器(Current Program Status Register,CPSR)可以在任何處理器模式下被訪問,它包含下列內(nèi)容:

? ALU(Arithmetic Logic Unit,算術(shù)邏輯單元)狀態(tài)標(biāo)志的備份。

? 當(dāng)前的處理器模式。

? 中斷使能標(biāo)志。

? 設(shè)置處理器的狀態(tài)。

每一種處理器模式下都有一個(gè)專用的物理寄存器做備份程序狀態(tài)寄存器(Saved Program Status

Register,SPSR)。當(dāng)特定的異常中斷發(fā)生時(shí),這個(gè)物理寄存器負(fù)責(zé)存放當(dāng)前程序狀態(tài)寄存器的內(nèi)容。

當(dāng)異常處理程序返回時(shí),再將其內(nèi)容恢復(fù)到當(dāng)前程序狀態(tài)寄存器。

CPSR 寄存器(和保存它的 SPSR 寄存器)中的位分配如圖所示。

下面給出各個(gè)狀態(tài)位的定義。

8、標(biāo)志位

N(Negative)、Z(Zero)、C(Carry)和 V(oVerflow)通稱為條件標(biāo)志位。這些條件標(biāo)志位會(huì)根據(jù)程序中的算術(shù)指令或邏輯指令的執(zhí)行結(jié)果進(jìn)行修改,而且這些條件標(biāo)志位可由大多數(shù)指令檢測以決定指令是否執(zhí)行。

在 ARM 4T 架構(gòu)中,所有的 ARM 指令都可以條件執(zhí)行,而 Thumb 指令卻不能。各條件標(biāo)志位的具體含義如下。

3) N 標(biāo)志位

本位設(shè)置成當(dāng)前指令運(yùn)行結(jié)果的 bit[31]的值。當(dāng)兩個(gè)由補(bǔ)碼表示的有符號(hào)整數(shù)運(yùn)算時(shí),N=1 表示運(yùn)算的結(jié)果為負(fù)數(shù),N=0 表示結(jié)果為正數(shù)或零。

4) Z 標(biāo)志位

Z=1 表示運(yùn)算的結(jié)果為零

Z=0 表示運(yùn)算的結(jié)果不為零。

5) C 標(biāo)志位

下面分 4 種情況討論 C 的設(shè)置方法:

? 在加法指令中(包括比較指令 CMN),當(dāng)結(jié)果產(chǎn)生了進(jìn)位,則 C=1,表示無符號(hào)數(shù)運(yùn)算發(fā)生上

溢出;其他情況下 C=0。

? 在減法指令中(包括比較指令 CMP),當(dāng)運(yùn)算中發(fā)生錯(cuò)位(即無符號(hào)數(shù)運(yùn)算發(fā)生下溢出),則

C=0;其他情況下 C=1。

? 對(duì)于在操作數(shù)中包含移位操作的運(yùn)算指令(非加/減法指令),C 被設(shè)置成被移位寄存器最后移出去的位。

? 對(duì)于其他非加/減法運(yùn)算指令,C 的值通常不受影響

6) V 標(biāo)志位

下面分兩種情況討論 V 的設(shè)置方法。

對(duì)于加/減運(yùn)算指令,當(dāng)操作數(shù)和運(yùn)算結(jié)果都是以二進(jìn)制的補(bǔ)碼表示的帶符號(hào)的數(shù)時(shí),且運(yùn)算結(jié)果超出了有符號(hào)運(yùn)算的范圍是溢出。V=1 表示符號(hào)位溢出。

對(duì)于非加/減法指令,通常不改變標(biāo)志位 V 的值。

盡管以上 C 和 V 的定義看起來頗為復(fù)雜,但使用時(shí)在大多數(shù)情況下用一個(gè)簡單的條件測試指令即可,不需要程序員計(jì)算出條件碼的精確值即可得到需要的結(jié)果。

1)Q 標(biāo)志位

在帶 DSP 指令擴(kuò)展的 ARM v5 及更高版本中,bit[27]被指定用于指示增強(qiáng)的 DAP 指令是否發(fā)生了溢出,因此也就被稱為 Q 標(biāo)志位。同樣,在 SPSR 中 bit[27]也被稱為 Q 標(biāo)志位,用于在異常中斷發(fā)生時(shí)保存和恢復(fù) CPSR 中的 Q 標(biāo)志位。在 ARM v5 以前的版本及 ARM v5 的非 E 系列處理器中,Q 標(biāo)志位沒有被定義,屬于待擴(kuò)展的位。

2)J 標(biāo)志位

在帶 Java 指令支持的 ARM v5 及更高版本中支持。T=0;J=1 表示處于 Jazelle 狀態(tài)

9、控制位

CPSR 的低 8 位(I、F、T 及 M[4:0])統(tǒng)稱為控制位。當(dāng)異常發(fā)生時(shí),這些位的值將發(fā)生相應(yīng)的變化。另外,如果在特權(quán)模式下,也可以通過軟件編程來修改這些位的值。

7) 中斷禁止位

I=1,IRQ 被禁止。

F=1,F(xiàn)IQ 被禁止。

8) 狀態(tài)控制位

T 位是處理器的狀態(tài)控制位。

T=0,處理器處于 ARM 狀態(tài)(即正在執(zhí)行 32 位的 ARM 指令)。

T=1,處理器處于 Thumb 狀態(tài)(即正在執(zhí)行 16 位的 Thumb 指令)。

10、模式控制位

M[4:0]作為位模式控制位,這些位的組合確定了處理器處于哪種狀態(tài)。如表所示列出了其具體含義。

只有下表中列出的組合是有效的,其他組合無效。

狀態(tài)控制位 M[4:0]

11、IF-THEN 標(biāo)志位

CPSR 中的 bits[15:10,26:25]稱為 if-then 標(biāo)志位,它用于對(duì) thumb 指令集中 if-then-else 這一類語句塊的控制。thumb 語言不是學(xué)習(xí)的重點(diǎn)(實(shí)際應(yīng)用中,基本都是編譯器完成 thumb 的生成),此處不細(xì)介紹,大家了解即可。

12、E 控制位

大小端控制位:E=1 設(shè)置為大端模式,E=0 為小端模式。

13、A 位

A=1 禁止不精確的數(shù)據(jù)異常

SPSR 寄存器

spsr:保存程序狀態(tài)寄存器 ----> Saved Program Statued Register

spsr 寄存器主要用于保存 cpsr 寄存器的。例如下圖,在中斷情況下的應(yīng)用。

注意:中斷過程中,是由處理器自動(dòng)將 cpsr 保持到 spsr_irq 的。后續(xù)在異常處理章節(jié)會(huì)有詳細(xì)講解。

可以結(jié)合之前導(dǎo)入的工程 c_led,在 start.s 文件中,堆棧初始化時(shí),會(huì)進(jìn)入到各個(gè)模式下,設(shè)置棧地址??梢钥吹?msr 指令(后續(xù)匯編指令章節(jié)會(huì)介紹)后,cpsr 的 M[4∶0]會(huì)變化,然后系統(tǒng)進(jìn)入到對(duì)應(yīng)的模式。


基于stm32mp157 linux開發(fā)板ARM裸機(jī)開發(fā)教程3:Cortex-A7 架構(gòu)與工作模式(連載中)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
菏泽市| 肥城市| 枞阳县| 建德市| 青川县| 茌平县| 天峻县| 松潘县| 巴林左旗| 报价| 梁山县| 罗城| 霸州市| 濮阳县| 马关县| 沙河市| 温州市| 新田县| 中江县| 仲巴县| 大埔区| 威宁| 朝阳市| 桦川县| 方正县| 信丰县| 汝南县| 南阳市| 金华市| 延寿县| 兖州市| 荆州市| 雷波县| 尼玛县| 荔波县| 泸州市| 曲阜市| 茌平县| 古田县| 张北县| 昆明市|