1. 程式人生 > >Cortex-M3基本知識點(手冊)

Cortex-M3基本知識點(手冊)

cortex-M3核心簡單分析
1、cortex - M3核心:只是arm公司提供的一個核心
基於cortex - M3的MCU:包括核心+記憶體+外設等一些其他的器件。
2、cortex -M3架構的特點:
(1)處理器核心,資料路徑,暫存器,儲存器介面都是32位的。
(2)採用哈佛結構,資料匯流排和指令匯流排是獨立的,取指令和讀資料可以同時進行。
(3)支援大段模式和小端模式

3、暫存器R0-R12 通用暫存器 一般16位的thumb指令能訪問R0-R7 ;

4、異常的概念:
凡是打斷程式執行順的事件都被稱為異常。
5、CM3支援兩種操作模式:handler mode 和 thread mode
同時還是支援兩級特權操作: 特權級和使用者級
從使用者級切換到特權級唯一的途徑就是異常。
6、特權級執行緒模式和使用者級執行緒模式都可以觸發異常到特權級handler mode,並且會異常返回。
復位進入特權級執行緒模式,特權級執行緒模式通過修改控制暫存器進入到使用者級執行緒模式。

7、內建的巢狀中斷控制器
*可巢狀中斷支援
當異常發生時,硬體會自動比較異常的優先順序是否比當前的優先順序高,如果必當前的優先順序高就會服務新來的中斷,–立即強佔
*向量中斷支援
當中斷響應後,CM3會自動定位到一張向量表,並且根據中斷號從表中找出ISR的入口地址,跳轉過去執行。(節省時間延遲時間縮短)
*動態優先順序調整
軟體執行期間可以更改中斷的優先順序,如果修改了當前的優先順序,當前中斷是不會自己打斷自己的,從而沒有重入風險。
*中斷延遲大大縮短
*中斷可遮蔽
可以任意遮蔽中斷序號,也可以全部遮蔽。是為了讓時間關鍵的任務能在死線到來之前完成,而不被幹擾。

8、儲存器對映
儲存器大小是4G,分成6個區間,Cortex-M3內部擁有一個匯流排基礎設施,在此基礎上,甚至允許這些區間之間“越權使用”。
9、指令流水線
取指令(F)–解碼(D)–執行(X)三級指令,
pc指向預取指令,pc地址與執行的地址相差8 (pc-8=x)
0x1000 mov (執行此處)
0x1004 sub (解碼此處)
0x1008 mul (pc指向此時)
0x100c dev

當發生指令跳轉時:
跳轉到目的地後用LR記錄返回地址,並且將當前的D、X,清空,如果預取指令再一週期將LR的值減去4

10、復位發生後指向預設的MSP,而PC的值是4,

11、UAL(統一組合語言),但是仍然允許使用傳統的 Thumb 語法。不過有一項必須注意:如果
使用傳統的 Thumb 語法,有些指令會預設地更新 APSR,即使你沒有加上 S 字尾。如果使用
UAL 語法,則必須指定 S 字尾才會更新。

12、
在UAL 下,你可以讓彙編器決定用哪個,也可以手工指定是用 16 位的還是 32 位的:
ADDS R0, #1 ;彙編器將為了節省空間而使用 16 位指令
ADDS.N R0, #1 ;指定使用 16 位指令(N=Narrow)
ADDS.W R0, #1 ;指定使用 32 位指令(W=Wide)

13、指令集

名字 功能
ADC 帶進位加法
ADD 加法
AND 按位與(原文為邏輯與,有誤——譯註)。這裡的按位與和 C 的”&”功能相同
ASR 算術右移
BIC 按位清 0(把一個數跟另一個無符號數的反碼按位與)
CMN 負向比較(把一個數跟另一個數據的二進位制補碼相比較)
CMP 比較(比較兩個數並且更新標誌)
CPY 把一個暫存器的值拷貝到另一個暫存器中
EOR 近位異或
LSL 邏輯左移(如無其它說明,所有移位操作都可以一次移動多格——譯註)
LSR 邏輯右移
MOV 暫存器載入資料,既能用於暫存器間的傳輸,也能用於載入立即數
MUL 乘法
MVN 載入一個數的 NOT 值(取到邏輯反的值)
NEG 取二進位制補碼
ORR 按位或(原文為邏輯或,有誤——譯註)
ROR 圓圈右移
SBC 帶借位的減法
SUB 減法
TST 測試(執行按位與操作,並且根據結果更新 Z)
REV 在一個 32 位暫存器中反轉位元組序
REVH 把一個 32 位暫存器分成兩個 16 位數,在每個 16 位數中反轉位元組序
REVSH 把一個 32 位暫存器的低 16 位半字進行位元組反轉,然後帶符號擴充套件到 32 位
SXTB 帶符號擴充套件一個位元組到 32 位
SXTH 帶符號擴充套件一個半字到 32 位
UXTB 無符號擴充套件一個位元組到 32 位
UXTH 無符號擴充套件一個半字到 32 位
表 4.3 16 位轉移指令
名字 功能
B 無條件轉移
B 條件轉移
BL 轉移並連線。用於呼叫一個子程式,返回地址被儲存在 LR 中
BLX #im 使用立即數的 BLX 不要在 CM3 中使用
CBZ 比較,如果結果為 0 就轉移(只能跳到後面的指令——譯註)
CBNZ 比較,如果結果非 0 就轉移(只能跳到後面的指令——譯註)
IT If‐Then
55Cortex‐M3 權威指南 初稿 第 4 章
表 4.4 16 位儲存器資料傳送指令
名字 功能
LDR 從儲存器中載入字到一個暫存器中
LDRH 從儲存器中載入半字到一個暫存器中
LDRB 從儲存器中載入位元組到一個暫存器中
LDRSH 從儲存器中載入半字,再經過帶符號擴充套件後儲存一個暫存器中
LDRSB 從儲存器中載入位元組,再經過帶符號擴充套件後儲存一個暫存器中
STR 把一個暫存器按字儲存到儲存器中
STRH 把一個暫存器存器的低半字儲存到儲存器中
STRB 把一個暫存器的低位元組儲存到儲存器中
LDMIA 載入多個字,並且在載入後自增基址暫存器
STMIA 載入多個字,並且在載入後自增基址暫存器
PUSH 壓入多個暫存器到棧中
POP 從棧中彈出多個值到暫存器中
16 資料傳送指令沒有任何新內容,因為它們是 Thumb 指令,在 v4T 時就已經定格了——譯註
表 4.5 其它 16 位指令
名字 功能
SVC 系統服務呼叫
BKPT 斷點指令。如果除錯被使能,則進入除錯狀態(停機)。或者如果除錯監視器異常被
使能,則呼叫一個除錯異常,否則呼叫一個 fault 異常
NOP 無操作
CPSIE 使能 PRIMASK(CPSIE i)/ FAULTMASK(CPSIE f)——清 0 相應的位
CPSID 除能 PRIMASK(CPSID i)/ FAULTMASK(CPSID f)——置位相應的位
表 4.6 32 位資料操作指令
名字 功能
ADC 帶進位加法
ADD 加法
ADDW 寬加法(可以加 12 位立即數)
AND 按位與(原文是邏輯與,有誤——譯註)
ASR 算術右移
BIC 位清零(把一個數按位取反後,與另一個數邏輯與)
BFC 位段清零
BFI 位段插入
CMN 負向比較(把一個數和另一個數的二進位制補碼比較,並更新標誌位)
CMP 比較兩個數並更新標誌位
56Cortex‐M3 權威指南 初稿 第 4 章
CLZ 計算前導零的數目
EOR 按位異或
LSL 邏輯左移
LSR 邏輯右移
MLA 乘加
MLS 乘減
MOVW 把 16 位立即數放到暫存器的底 16 位, 高 16 位清 0
MOV 載入 16 位立即數到暫存器(其實彙編器會產生 MOVW——譯註)
MOVT 把 16 位立即數放到暫存器的高 16 位, 低 16 位不影響
MVN 移動一個數的補碼
MUL 乘法
ORR 按位或(原文為邏輯或,有誤——譯註)
ORN 把源運算元按位取反後,再執行按位或(原文為邏輯或,有誤——譯註)
RBIT 位反轉(把一個 32 位整數先用 2 進製表達,再旋轉 180 度——譯註)
REV 對一個 32 位整數做按位元組反轉
REVH/
REV16
對一個 32 位整數的高低半字都執行位元組反轉
REVSH 對一個 32 位整數的低半字執行位元組反轉,再帶符號擴充套件成 32 位數
ROR 圓圈右移
RRX 帶進位的邏輯右移一格(最高位用 C 填充,且不影響 C 的值——譯註)
SFBX 從一個 32 位整數中提取任意的位段,並且帶符號擴充套件成 32 位整數
SDIV 帶符號除法
SMLAL 帶符號長乘加(兩個帶符號的 32 位整數相乘得到 64 位的帶符號積,再把積加到另一
個帶符號 64 位整數中)
SMULL 帶符號長乘法(兩個帶符號的 32 位整數相乘得到 64 位的帶符號積)
SSAT 帶符號的飽和運算
SBC 帶借位的減法
SUB 減法
SUBW 寬減法,可以減 12 位立即數
SXTB 位元組帶符號擴充套件到 32 位數
TEQ 測試是否相等(對兩個數執行異或,更新標誌但不儲存結果)
TST 測試(對兩個數執行按位與,更新 Z 標誌但不儲存結果)
UBFX 無符號位段提取
UDIV 無符號除法
UMLAL 無符號長乘加(兩個無符號的 32 位整數相乘得到 64 位的無符號積,再把積加到另一
個無符號 64 位整數中)
UMULL 無符號長乘法(兩個無符號的 32 位整數相乘得到 64 位的無符號積)
USAT 無符號飽和操作(但是源運算元是帶符號的——譯註)
UXTB 位元組被無符號擴充套件到 32 位(高 24 位清 0——譯註)
UXTH 半字被無符號擴充套件到 32 位(高 16 位清 0——譯註)
57Cortex‐M3 權威指南 初稿 第 4 章
表 4.7 32 位儲存器資料傳送指令
名字 功能
LDR 載入字到暫存器
LDRB 載入位元組到暫存器
LDRH 載入半字到暫存器
LDRSH 載入半字到暫存器,再帶符號擴充套件到 32 位
LDM 從一片連續的地址空間中載入多個字到若干暫存器
LDRD 從連續的地址空間載入雙字(64 位整數)到 2 個暫存器
STR 儲存暫存器中的字
STRB 儲存暫存器中的低位元組
STRH 儲存暫存器中的低半字
STM 儲存若干暫存器中的字到一片連續的地址空間中
STRD 儲存 2 個暫存器組成的雙字到連續的地址空間中
PUSH 把若干暫存器的值壓入堆疊中
POP 從堆疊中彈出若干的暫存器的值
表 4.8 32 位轉移指令
名字 功能
B 無條件轉移
BL 轉移並連線(呼叫子程式)
TBB 以位元組為單位的查錶轉移。從一個位元組陣列中選一個 8 位前向跳轉地址並轉移
TBH 以半字為單位的查錶轉移。從一個半字陣列中選一個 16 位前向跳轉的地址並轉移
表 4.9 其它 32 位指令
LDREX 載入字到暫存器,並且在核心中標明一段地址進入了互斥訪問狀態
LDREXH 載入半字到暫存器,並且在核心中標明一段地址進入了互斥訪問狀態
LDREXB 載入位元組到暫存器,並且在核心中標明一段地址進入了互斥訪問狀態
STREX 檢查將要寫入的地址是否已進入了互斥訪問狀態,如果是則儲存暫存器的字
STREXH 檢查將要寫入的地址是否已進入了互斥訪問狀態,如果是則儲存暫存器的半字
STREXB 檢查將要寫入的地址是否已進入了互斥訪問狀態,如果是則儲存暫存器的位元組
CLREX 在本地的處理上清除互斥訪問狀態的標記(先前由 LDREX/LDREXH/LDREXB 做的標記)
MRS 載入特殊功能暫存器的值到通用暫存器
MSR 儲存通用暫存器的值到特殊功能暫存器
NOP 無操作
SEV 傳送事件
WFE 休眠並且在發生事件時被喚醒
WFI 休眠並且在發生中斷時被喚醒
ISB 指令同步隔離(與流水線和 MPU 等有關——譯註)
DSB 資料同步隔離(與流水線、 MPU 和 cache 等有關——譯註)
58Cortex‐M3 權威指南 初稿 第 4 章
DMB 資料儲存隔離(與流水線、 MPU 和 cache 等有關——譯註)

14、當使用16位指令時,會自動更新APSR標誌位,在使用了“.w”指定的32位的指令後,就可以通過手動的增加S進行標誌位的更新。

15、暫存器立即數的種類大約有四種
使用偽指令 LDR Rn,=const
系統會自己根據const,自動選擇賦值方法。

16、 Bl (儲存返回地址)
BX rd(暫存器) ;轉移到有暫存器rd給出的地址

在 BX中,reg的最低位指示出在轉移後,將進入的狀態是 ARM(LSB=0)還是 Thumb(LSB=1)。
既然 CM3 只在 Thumb 中執行,就必須保證 reg 的 LSB=1

loop

			add r1,r1,#1
			add r2,r2,r1
			subs r3,r1,#100
			beq	step
			b	loop

step

17、對特殊暫存器的操作含義
MRS Move to Register from State register
MSR Move from State registerto Register

18、對暫存器進行串操作
STMIA.W R8!, {r0-R3} ; R8 值變為 0x8010,每存一次曾一次,先儲存後自增
STMDB.W R8, {R0-R3} ; R8 值的“一個內部複本”先自減後儲存,但是 R8 的值不變

19、預索引和後索引
ldr r2, [r0, r3]! ;錯誤,暫存器提供偏移量時不支援預索引
ldr r2, [r0], r3 ;錯誤,暫存器提供偏移量時不支援後索引

20、
在 CM3 中,下列指令可以更新 PSR 中的標誌:

  • 16 位算術邏輯指令
  • 32 位帶 S 字尾的算術邏輯指令
  • 比較指令(如, CMP/CMN)和測試指令(如 TST/TEQ)
  • 直接寫 PSR/APSR (MSR 指令)

21、大小端轉換
例如,記 R0=0x12345678,在執行下列兩條指定後:
REV R1, R0
REVH R2, R0
REV16 R3, R0
則 R1=0x78563412, R2=0x12347856, R3=0x34127856。

位元轉換(翻轉180°)
例如,記 R1=0xB4E10C23(二進位制數值為 1011,0100,1110,0001,0000,1100,0010,0011),
RBIT.W R0, R1
執行後,則 R0=0xC430872D(二進位制數值為 1100,0100,0011,0000,1000,0111,0010,1101)

22、資料段NOINIT
在資料段只是保留了記憶體單元,並沒有將各個初始值寫入記憶體單元,或是初始化為0