
讀書筆記| ARM9 嵌入式學習
1、ARM處理器簡介
基于RISC,采用Load/Store
數(shù)據(jù)存取指令執(zhí)行時間遠大于寄存器內(nèi)部數(shù)據(jù)操作指令
-
ARM處理器工作模式
- 用戶模式(User mode)
- 速中斷模式(FIQ) ===> 高速數(shù)據(jù)傳輸及通道處理
- 外部中斷模式(IRQ)
- 特權模式(Supervisor)===> cpu上電后默認模式
- 用途: 系統(tǒng)初始化 & 軟中斷
- 數(shù)據(jù)訪問終止模式(Abort)
- 支持虛存或存儲器保護
- 訪問非法地址時進入該模式
- 未定義指令終止模式(Undefined)
- 識別不了指令操作時進入該模式
- 系統(tǒng)模式(System)
- 和用戶模式共用一套寄存器
-
ARM存儲器
- 4字節(jié)對齊
- 大端格式: 高字節(jié)低地址,低字節(jié)高地址
- 小端格式: 高字節(jié)高地址,低字節(jié)低地址
- 數(shù)據(jù)類型: 字節(jié)型數(shù)據(jù) / 半字 / 字
2、ARM寄存器
2.1 寄存器概況
- 37個,31通用,6個狀態(tài)寄存器
- 寄存器均為32位
- 修改寄存器某一位:采用“先與后或”的方式
2.2 r0-r15,CPSR/SPSR
各模式下公用寄存器存到堆棧中
-
r13堆棧指針寄存器(SP)
- 習慣用法,也可用其他寄存器做堆棧指針
- 每個模式都有自己的r13,指向相應的地址空間
-
R14鏈接寄存器(LR)
- 存放子程序的返回地址
- 調(diào)用子程序時,將當前r15保存到r14
- 執(zhí)行完子程序,r14的值復制回R15
-
r15程序計數(shù)器(PC)
- PC,不指向當前正在執(zhí)行的指令
- 總是指向“正在取指”的指令
- PC值=當前地址值+8
-
CPSR/SPSR
- 當前/備份程序狀態(tài)寄存器
- CPSR:公用寄存器
- SPSR: 獨立寄存器
- 標志位組成:
- 條件標志位
- 模式控制位
- IRQ、FIQ中斷響應位
- 當前/備份程序狀態(tài)寄存器
2.3 三級流水線: 馮諾依曼結構
- (1)取指:
從指令存儲器取指令
從存儲器裝載一條指令 - (2)譯碼:
識別將要被執(zhí)行的指令 - (3)執(zhí)行:
產(chǎn)生ALU運算結果或產(chǎn)生存儲器地址
2.4 五級流水線: 哈佛結構
- (4)訪存:
訪問數(shù)據(jù)存儲器 - (5)回寫:
完成結果寫寄存器
3、ARM指令集
3.1 ARM指令
- 存儲器訪問指令
- 數(shù)據(jù)處理指令
- 跳轉(zhuǎn)指令
- 程序狀態(tài)寄存器訪問指令
- 協(xié)處理器訪問指令
3.2 存儲器訪問指令
3.2.1 LDR/STR
- ldr r0, 0x12345678
- 把0x12345678這個地址中的值存放到r0中
- mov不能實現(xiàn)這個功能
- mov只能在寄存器之間移動數(shù)據(jù),或者把立即數(shù)移動到寄存器中
- ldr r0, =0x12345678
- 把0x12345678這個值寫到r0中
- 類似MOV,但mov長度不能超過8位
3.2.2 LDM/STM
- IA ----> Increment After
每次傳送后地址加4 - IB---->Increment Before
每次傳送前地址加4 - DA ----> Decrement After
每次傳送后地址減4 - DB ---->Decrement Before
每次傳送前地址減4 - FA ----> Full Ascending 滿遞增堆棧
- FD ----> Full Descending 滿遞減堆棧
- EA ----> Empty Ascending 空遞增堆棧
- ED ----> Empty Descending 空遞減堆棧
3.3 數(shù)據(jù)處理指令
- MOV
- ADD/SUB/BIC/CMP/ORR
- BIC:位清除
- ORR:邏輯或
- swp:內(nèi)存和寄存器之間字數(shù)據(jù)交換指令
3.4 跳轉(zhuǎn)指令
- b
- bl
3.5 程序狀態(tài)寄存器訪問指令
- MSR:寫狀態(tài)寄存器指令
- MRS:讀~
3.6 協(xié)處理器訪問指令
- MRC: 協(xié)處理器中寄存器的數(shù)據(jù)傳送到arm處理器寄存器中
- MCR: 反之
3.7 ARM偽操作
- GET
- 包含定義常量的源文件
- 相當于C的“include”
- GET 2440addr.inc
- AREA/ENTRY/END
- EXPORT/IMPORT
- E:聲明外部標號
- I:引用其他文件定義的標號
- EQU/LTORG/ALIGN
- MACRO/MEND
- MAP/FIELD
- ADRL/LDR
4、ARM宏指令
5、ARM尋址方式
-
立即尋址:
數(shù)據(jù)在指令中 -
寄存器尋址:
操作數(shù)在寄存器中,指令給出寄存器編號 -
寄存器移位尋址:
取寄存器的值,做移位運算 -
寄存器間接尋:
寄存器存操作數(shù)的內(nèi)存地址 -
基址尋址:
操作數(shù)地址=基址寄存器的值+指令給出的偏移量 - 多寄存器尋址
- 堆棧尋址
6、相關細節(jié)
- JTAG: 系統(tǒng)仿真、調(diào)試
- 串口: 數(shù)據(jù)一位一位地順序傳送
- 并口: 同時傳送8位數(shù)據(jù)
- RISC
- Reduced Instruction Set Computer
- 簡單指令硬件實現(xiàn)
- 復雜指令軟件實現(xiàn)
- CISC
Complex Instruction Set Computer
7、ARM C 語言基礎
7.1 typedef &#define
- T:編譯階段處理
- D:預處理階段處理
7.2 volatile:
每次讀寫數(shù)據(jù),都到內(nèi)存單元處讀取,而非寄存器
7.3 C語言源程序處理過程
- 預處理
- 編譯
- 匯編
- 鏈接
7.4 arm C擴展關鍵字
- __irq: 定義中斷處理函數(shù)
- __swi: 定義軟中斷
- __asm: 嵌入?yún)R編代碼 & 完成c代碼無法完成的工作
- __inline: 內(nèi)聯(lián)函數(shù) & 解決函數(shù)調(diào)用開銷太大的問題
- sizeof: 是一個關鍵字,非函數(shù)
8. 匯編&C混合編程
8.1 APCS: ARM Process Call Standard
- r0-r3:傳遞函數(shù)參數(shù)
- R4-R11:保存函數(shù)的局部變量
- 子程序參數(shù)大于4時,借助堆棧傳遞參數(shù)
- 函數(shù)返回值用R0傳遞(4字節(jié)),8字節(jié)用r0和r1傳遞
- 浮點數(shù)參數(shù)可以通過寄存器傳遞,也可以通過數(shù)據(jù)棧傳遞
8.2 在c程序中嵌入?yún)R編代碼的原因
- c代碼無法操作寄存器
- 嵌入?yún)R編代碼提高效率
PS:
FP寄存器
- 浮點參數(shù)會用到
- 幀指針寄存器,r11
- 函數(shù)局部變量被分配在連續(xù)存儲區(qū)中,它是通過一個指針訪問的
- 該連續(xù)存儲區(qū)稱為這個函數(shù)的存儲“幀”