讀書筆記| (一)ARM9 嵌入式學習:基礎篇

讀書筆記| ARM9 嵌入式學習

讀書筆記| 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中斷響應位

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ù)的存儲“幀”
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容