Cortex-M3基本知识点(手册)
cortex-M3內(nèi)核簡(jiǎn)單分析
1、cortex - M3內(nèi)核:只是arm公司提供的一個(gè)內(nèi)核
基于cortex - M3的MCU:包括內(nèi)核+內(nèi)存+外設(shè)等一些其他的器件。
2、cortex -M3架構(gòu)的特點(diǎn):
(1)處理器內(nèi)核,數(shù)據(jù)路徑,寄存器,存儲(chǔ)器接口都是32位的。
(2)采用哈佛結(jié)構(gòu),數(shù)據(jù)總線和指令總線是獨(dú)立的,取指令和讀數(shù)據(jù)可以同時(shí)進(jìn)行。
(3)支持大端模式和小端模式
3、寄存器R0-R12 通用寄存器, 一般16位的thumb指令能訪問R0-R7 ;
4、異常的概念:
凡是打斷程序執(zhí)行的事件都被稱為異常。
5、CM3支持兩種操作模式:handler mode 和 thread mode
同時(shí)還是支持兩級(jí)特權(quán)操作: 特權(quán)級(jí)和用戶級(jí)
從用戶級(jí)切換到特權(quán)級(jí)唯一的途徑就是異常。
6、特權(quán)級(jí)線程模式和用戶級(jí)線程模式都可以觸發(fā)異常到特權(quán)級(jí)handler mode,并且會(huì)異常返回。
復(fù)位進(jìn)入特權(quán)級(jí)線程模式,特權(quán)級(jí)線程模式通過修改控制寄存器進(jìn)入到用戶級(jí)線程模式。
7、內(nèi)建的嵌套中斷控制器
--*可嵌套中斷支持
當(dāng)異常發(fā)生時(shí),硬件會(huì)自動(dòng)比較異常的優(yōu)先級(jí)是否比當(dāng)前的優(yōu)先級(jí)高,如果必當(dāng)前的優(yōu)先級(jí)高就? 會(huì)服務(wù)新來(lái)的中斷,–立即強(qiáng)占
--*向量中斷支持
當(dāng)中斷響應(yīng)后,CM3會(huì)自動(dòng)定位到一張向量表,并且根據(jù)中斷號(hào)從表中找出ISR的入口地址,跳轉(zhuǎn)過去執(zhí)行。(節(jié)省時(shí)間延遲時(shí)間縮短)
--*動(dòng)態(tài)優(yōu)先級(jí)調(diào)整
軟件運(yùn)行期間可以更改中斷的優(yōu)先級(jí),如果修改了當(dāng)前的優(yōu)先級(jí),當(dāng)前中斷是不會(huì)自己打斷自己的,從而沒有重入風(fēng)險(xiǎn)。
--*中斷延遲大大縮短
--*中斷可屏蔽
可以任意屏蔽中斷序號(hào),也可以全部屏蔽。是為了讓時(shí)間關(guān)鍵的任務(wù)能在死線到來(lái)之前完成,而不被干擾。
8、存儲(chǔ)器映射
存儲(chǔ)器大小是4G,分成6個(gè)區(qū)間,Cortex-M3內(nèi)部擁有一個(gè)總線基礎(chǔ)設(shè)施,在此基礎(chǔ)上,甚至允許這些區(qū)間之間“越權(quán)使用”。
9、指令流水線
取指令(F)–解碼(D)–執(zhí)行(X)三級(jí)指令,
pc指向預(yù)取指令,pc地址與執(zhí)行的地址相差8 (pc-8=x)
0x1000 mov (執(zhí)行此處)
0x1004 sub (解碼此處)
0x1008 mul (pc指向此處)
0x100c dev
當(dāng)發(fā)生指令跳轉(zhuǎn)時(shí):
跳轉(zhuǎn)到目的地后用LR記錄返回地址,并且將當(dāng)前的D、X,清空,如果預(yù)取指令再一周期將LR的值減去4
10、復(fù)位發(fā)生后指向默認(rèn)的MSP,而PC的值是4,
11、UAL(統(tǒng)一匯編語(yǔ)言),但是仍然允許使用傳統(tǒng)的 Thumb 語(yǔ)法。不過有一項(xiàng)必須注意:如果
使用傳統(tǒng)的 Thumb 語(yǔ)法,有些指令會(huì)默認(rèn)地更新 APSR,即使你沒有加上 S 后綴。如果使用
UAL 語(yǔ)法,則必須指定 S 后綴才會(huì)更新。
12、在UAL 下,你可以讓匯編器決定用哪個(gè),也可以手工指定是用 16 位的還是 32 位的:
ADDS R0, #1 ;匯編器將為了節(jié)省空間而使用 16 位指令
ADDS.N R0, #1 ;指定使用 16 位指令(N=Narrow)
ADDS.W R0, #1 ;指定使用 32 位指令(W=Wide)
13、指令集
名字 功能
ADC 帶進(jìn)位加法
ADD 加法
AND 按位與(原文為邏輯與,有誤——譯注)。這里的按位與和 C 的”&”功能相同
ASR 算術(shù)右移
BIC 按位清 0(把一個(gè)數(shù)跟另一個(gè)無(wú)符號(hào)數(shù)的反碼按位與)
CMN 負(fù)向比較(把一個(gè)數(shù)跟另一個(gè)數(shù)據(jù)的二進(jìn)制補(bǔ)碼相比較)
CMP 比較(比較兩個(gè)數(shù)并且更新標(biāo)志)
CPY 把一個(gè)寄存器的值拷貝到另一個(gè)寄存器中
EOR 近位異或
LSL 邏輯左移(如無(wú)其它說明,所有移位操作都可以一次移動(dòng)多格——譯注)
LSR 邏輯右移
MOV 寄存器加載數(shù)據(jù),既能用于寄存器間的傳輸,也能用于加載立即數(shù)
MUL 乘法
MVN 加載一個(gè)數(shù)的 NOT 值(取到邏輯反的值)
NEG 取二進(jìn)制補(bǔ)碼
ORR 按位或(原文為邏輯或,有誤——譯注)
ROR 圓圈右移
SBC 帶借位的減法
SUB 減法
TST 測(cè)試(執(zhí)行按位與操作,并且根據(jù)結(jié)果更新 Z)
REV 在一個(gè) 32 位寄存器中反轉(zhuǎn)字節(jié)序
REVH 把一個(gè) 32 位寄存器分成兩個(gè) 16 位數(shù),在每個(gè) 16 位數(shù)中反轉(zhuǎn)字節(jié)序
REVSH 把一個(gè) 32 位寄存器的低 16 位半字進(jìn)行字節(jié)反轉(zhuǎn),然后帶符號(hào)擴(kuò)展到 32 位
SXTB 帶符號(hào)擴(kuò)展一個(gè)字節(jié)到 32 位
SXTH 帶符號(hào)擴(kuò)展一個(gè)半字到 32 位
UXTB 無(wú)符號(hào)擴(kuò)展一個(gè)字節(jié)到 32 位
UXTH 無(wú)符號(hào)擴(kuò)展一個(gè)半字到 32 位
表 4.3? ? ? ?16 位轉(zhuǎn)移指令
名字 功能
B 無(wú)條件轉(zhuǎn)移
B 條件轉(zhuǎn)移
BL 轉(zhuǎn)移并連接。用于呼叫一個(gè)子程序,返回地址被存儲(chǔ)在 LR 中
BLX #im 使用立即數(shù)的 BLX 不要在 CM3 中使用
CBZ 比較,如果結(jié)果為 0 就轉(zhuǎn)移(只能跳到后面的指令——譯注)
CBNZ 比較,如果結(jié)果非 0 就轉(zhuǎn)移(只能跳到后面的指令——譯注)
T If‐Then
表 4.4? ? ? ?16 位存儲(chǔ)器數(shù)據(jù)傳送指令
名字 功能
LDR 從存儲(chǔ)器中加載字到一個(gè)寄存器中
LDRH 從存儲(chǔ)器中加載半字到一個(gè)寄存器中
LDRB 從存儲(chǔ)器中加載字節(jié)到一個(gè)寄存器中
LDRSH 從存儲(chǔ)器中加載半字,再經(jīng)過帶符號(hào)擴(kuò)展后存儲(chǔ)一個(gè)寄存器中
LDRSB 從存儲(chǔ)器中加載字節(jié),再經(jīng)過帶符號(hào)擴(kuò)展后存儲(chǔ)一個(gè)寄存器中
STR 把一個(gè)寄存器按字存儲(chǔ)到存儲(chǔ)器中
STRH 把一個(gè)寄存器存器的低半字存儲(chǔ)到存儲(chǔ)器中
STRB 把一個(gè)寄存器的低字節(jié)存儲(chǔ)到存儲(chǔ)器中
LDMIA 加載多個(gè)字,并且在加載后自增基址寄存器
STMIA 加載多個(gè)字,并且在加載后自增基址寄存器
PUSH 壓入多個(gè)寄存器到棧中
POP 從棧中彈出多個(gè)值到寄存器中
16 數(shù)據(jù)傳送指令沒有任何新內(nèi)容,因?yàn)樗鼈兪?Thumb 指令,在 v4T 時(shí)就已經(jīng)定格了——譯注
表 4.5? ? ? ?其它 16 位指令
名字 功能
SVC 系統(tǒng)服務(wù)調(diào)用
BKPT 斷點(diǎn)指令。如果調(diào)試被使能,則進(jìn)入調(diào)試狀態(tài)(停機(jī))。或者如果調(diào)試監(jiān)視器異常被
使能,則調(diào)用一個(gè)調(diào)試異常,否則調(diào)用一個(gè) fault 異常
NOP 無(wú)操作
CPSIE 使能 PRIMASK(CPSIE i)/ FAULTMASK(CPSIE f)——清 0 相應(yīng)的位
CPSID 除能 PRIMASK(CPSID i)/ FAULTMASK(CPSID f)——置位相應(yīng)的位
表 4.6? ? ? ?32 位數(shù)據(jù)操作指令
名字 功能
ADC 帶進(jìn)位加法
ADD 加法
ADDW 寬加法(可以加 12 位立即數(shù))
AND 按位與(原文是邏輯與,有誤——譯注)
ASR 算術(shù)右移
BIC 位清零(把一個(gè)數(shù)按位取反后,與另一個(gè)數(shù)邏輯與)
BFC 位段清零
BFI 位段插入
CMN 負(fù)向比較(把一個(gè)數(shù)和另一個(gè)數(shù)的二進(jìn)制補(bǔ)碼比較,并更新標(biāo)志位)
CMP 比較兩個(gè)數(shù)并更新標(biāo)志位
CLZ 計(jì)算前導(dǎo)零的數(shù)目
EOR 按位異或
LSL 邏輯左移
LSR 邏輯右移
MLA 乘加
MLS 乘減
MOVW 把 16 位立即數(shù)放到寄存器的底 16 位, 高 16 位清 0
MOV 加載 16 位立即數(shù)到寄存器(其實(shí)匯編器會(huì)產(chǎn)生 MOVW——譯注)
MOVT 把 16 位立即數(shù)放到寄存器的高 16 位, 低 16 位不影響
MVN 移動(dòng)一個(gè)數(shù)的補(bǔ)碼
MUL 乘法
ORR 按位或(原文為邏輯或,有誤——譯注)
ORN 把源操作數(shù)按位取反后,再執(zhí)行按位或(原文為邏輯或,有誤——譯注)
RBIT 位反轉(zhuǎn)(把一個(gè) 32 位整數(shù)先用 2 進(jìn)制表達(dá),再旋轉(zhuǎn) 180 度——譯注)
REV 對(duì)一個(gè) 32 位整數(shù)做按字節(jié)反轉(zhuǎn)
REVH/
REV16
對(duì)一個(gè) 32 位整數(shù)的高低半字都執(zhí)行字節(jié)反轉(zhuǎn)
REVSH 對(duì)一個(gè) 32 位整數(shù)的低半字執(zhí)行字節(jié)反轉(zhuǎn),再帶符號(hào)擴(kuò)展成 32 位數(shù)
ROR 圓圈右移
RRX 帶進(jìn)位的邏輯右移一格(最高位用 C 填充,且不影響 C 的值——譯注)
SFBX 從一個(gè) 32 位整數(shù)中提取任意的位段,并且?guī)Х?hào)擴(kuò)展成 32 位整數(shù)
SDIV 帶符號(hào)除法
SMLAL 帶符號(hào)長(zhǎng)乘加(兩個(gè)帶符號(hào)的 32 位整數(shù)相乘得到 64 位的帶符號(hào)積,再把積加到另一
個(gè)帶符號(hào) 64 位整數(shù)中)
SMULL 帶符號(hào)長(zhǎng)乘法(兩個(gè)帶符號(hào)的 32 位整數(shù)相乘得到 64 位的帶符號(hào)積)
SSAT 帶符號(hào)的飽和運(yùn)算
SBC 帶借位的減法
SUB 減法
SUBW 寬減法,可以減 12 位立即數(shù)
SXTB 字節(jié)帶符號(hào)擴(kuò)展到 32 位數(shù)
TEQ 測(cè)試是否相等(對(duì)兩個(gè)數(shù)執(zhí)行異或,更新標(biāo)志但不存儲(chǔ)結(jié)果)
TST 測(cè)試(對(duì)兩個(gè)數(shù)執(zhí)行按位與,更新 Z 標(biāo)志但不存儲(chǔ)結(jié)果)
UBFX 無(wú)符號(hào)位段提取
UDIV 無(wú)符號(hào)除法
UMLAL 無(wú)符號(hào)長(zhǎng)乘加(兩個(gè)無(wú)符號(hào)的 32 位整數(shù)相乘得到 64 位的無(wú)符號(hào)積,再把積加到另一
個(gè)無(wú)符號(hào) 64 位整數(shù)中)
UMULL 無(wú)符號(hào)長(zhǎng)乘法(兩個(gè)無(wú)符號(hào)的 32 位整數(shù)相乘得到 64 位的無(wú)符號(hào)積)
USAT 無(wú)符號(hào)飽和操作(但是源操作數(shù)是帶符號(hào)的——譯注)
UXTB 字節(jié)被無(wú)符號(hào)擴(kuò)展到 32 位(高 24 位清 0——譯注)
UXTH 半字被無(wú)符號(hào)擴(kuò)展到 32 位(高 16 位清 0——譯注)
表 4.7? ? ? ?32 位存儲(chǔ)器數(shù)據(jù)傳送指令
名字 功能
LDR 加載字到寄存器
LDRB 加載字節(jié)到寄存器
LDRH 加載半字到寄存器
LDRSH 加載半字到寄存器,再帶符號(hào)擴(kuò)展到 32 位
LDM 從一片連續(xù)的地址空間中加載多個(gè)字到若干寄存器
LDRD 從連續(xù)的地址空間加載雙字(64 位整數(shù))到 2 個(gè)寄存器
STR 存儲(chǔ)寄存器中的字
STRB 存儲(chǔ)寄存器中的低字節(jié)
STRH 存儲(chǔ)寄存器中的低半字
STM 存儲(chǔ)若干寄存器中的字到一片連續(xù)的地址空間中
STRD 存儲(chǔ) 2 個(gè)寄存器組成的雙字到連續(xù)的地址空間中
PUSH 把若干寄存器的值壓入堆棧中
POP 從堆棧中彈出若干的寄存器的值
表 4.8? ? ? ?32 位轉(zhuǎn)移指令
名字 功能
B 無(wú)條件轉(zhuǎn)移
BL 轉(zhuǎn)移并連接(呼叫子程序)
TBB 以字節(jié)為單位的查表轉(zhuǎn)移。從一個(gè)字節(jié)數(shù)組中選一個(gè) 8 位前向跳轉(zhuǎn)地址并轉(zhuǎn)移
TBH 以半字為單位的查表轉(zhuǎn)移。從一個(gè)半字?jǐn)?shù)組中選一個(gè) 16 位前向跳轉(zhuǎn)的地址并轉(zhuǎn)移
表 4.9? ? ? ?其它 32 位指令
LDREX 加載字到寄存器,并且在內(nèi)核中標(biāo)明一段地址進(jìn)入了互斥訪問狀態(tài)
LDREXH 加載半字到寄存器,并且在內(nèi)核中標(biāo)明一段地址進(jìn)入了互斥訪問狀態(tài)
LDREXB 加載字節(jié)到寄存器,并且在內(nèi)核中標(biāo)明一段地址進(jìn)入了互斥訪問狀態(tài)
STREX 檢查將要寫入的地址是否已進(jìn)入了互斥訪問狀態(tài),如果是則存儲(chǔ)寄存器的字
STREXH 檢查將要寫入的地址是否已進(jìn)入了互斥訪問狀態(tài),如果是則存儲(chǔ)寄存器的半字
STREXB 檢查將要寫入的地址是否已進(jìn)入了互斥訪問狀態(tài),如果是則存儲(chǔ)寄存器的字節(jié)
CLREX 在本地的處理上清除互斥訪問狀態(tài)的標(biāo)記(先前由 LDREX/LDREXH/LDREXB 做的標(biāo)記)
MRS 加載特殊功能寄存器的值到通用寄存器
MSR 存儲(chǔ)通用寄存器的值到特殊功能寄存器
NOP 無(wú)操作
SEV 發(fā)送事件
WFE 休眠并且在發(fā)生事件時(shí)被喚醒
WFI 休眠并且在發(fā)生中斷時(shí)被喚醒
ISB 指令同步隔離(與流水線和 MPU 等有關(guān)——譯注)
DSB 數(shù)據(jù)同步隔離(與流水線、 MPU 和 cache 等有關(guān)——譯注)
DMB 數(shù)據(jù)存儲(chǔ)隔離(與流水線、 MPU 和 cache 等有關(guān)——譯注)
14、當(dāng)使用16位指令時(shí),會(huì)自動(dòng)更新APSR標(biāo)志位,在使用了“.w”指定的32位的指令后,就可以通過手動(dòng)的增加S進(jìn)行標(biāo)志位的更新。
15、寄存器立即數(shù)的種類大約有四種
使用偽指令 LDR Rn,=const
系統(tǒng)會(huì)自己根據(jù)const,自動(dòng)選擇賦值方法。
16、 Bl (保存返回地址)
BX rd(寄存器) ;轉(zhuǎn)移到由寄存器rd給出的地址
在 BX中,reg的最低位指示出在轉(zhuǎn)移后,將進(jìn)入的狀態(tài)是 ARM(LSB=0)還是 Thumb(LSB=1)。
既然 CM3 只在 Thumb 中運(yùn)行,就必須保證 reg 的 LSB=1
loop
?? ??? ??? ?add r1,r1,#1
?? ??? ??? ?add r2,r2,r1
?? ??? ??? ?subs r3,r1,#100
?? ??? ??? ?beq?? ?step
?? ??? ??? ?b?? ?loop
step
17、對(duì)特殊寄存器的操作含義
MRS Move to Register from State register
MSR Move from State registerto Register
18、對(duì)寄存器進(jìn)行串操作
STMIA.W R8!, {r0-R3} ; R8 值變?yōu)?0x8010,每存一次增一次,先存儲(chǔ)后自增
STMDB.W R8, {R0-R3} ; R8 值的“一個(gè)內(nèi)部復(fù)本”先自減后存儲(chǔ),但是 R8 的值不變
19、預(yù)索引和后索引
ldr r2, [r0, r3]! ;錯(cuò)誤,寄存器提供偏移量時(shí)不支持預(yù)索引
ldr r2, [r0], r3 ;錯(cuò)誤,寄存器提供偏移量時(shí)不支持后索引
20、在 CM3 中,下列指令可以更新 PSR 中的標(biāo)志:
16 位算術(shù)邏輯指令
32 位帶 S 后綴的算術(shù)邏輯指令
比較指令(如, CMP/CMN)和測(cè)試指令(如 TST/TEQ)
直接寫 PSR/APSR (MSR 指令)
21、大小端轉(zhuǎn)換
例如,記 R0=0x12345678,在執(zhí)行下列兩條指定后:
REV R1, R0
REVH R2, R0
REV16 R3, R0
則 R1=0x78563412, R2=0x12347856, R3=0x34127856。
比特轉(zhuǎn)換(翻轉(zhuǎn)180°)
例如,記 R1=0xB4E10C23(二進(jìn)制數(shù)值為 1011,0100,1110,0001,0000,1100,0010,0011),
RBIT.W R0, R1
執(zhí)行后,則 R0=0xC430872D(二進(jìn)制數(shù)值為 1100,0100,0011,0000,1000,0111,0010,1101)
22、數(shù)據(jù)段NOINIT
在數(shù)據(jù)段只是保留了內(nèi)存單元,并沒有將各個(gè)初始值寫入內(nèi)存單元,或是初始化為0
————————————————
版權(quán)聲明:本文為CSDN博主「Castle_in_sky」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_37689106/article/details/83016963
總結(jié)
以上是生活随笔為你收集整理的Cortex-M3基本知识点(手册)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SecureCRT脚本之WaitForS
- 下一篇: 定位ARM Hard Fault 的方法