一、arm啟動C語言
1. 配置異常向量表
2. 實現了軟件中斷的部分
注:
? ? ? ? ldmfd sp!, {r0-r12, lr}? ? ? ? ? ? ? ? ==???????????????? ldmfd sp!, {r0-r12, pc}^???
bx lr? ? ? ? ? ? ?
左半部分:
繁瑣易理解的返回方式:
先彈出所有通用寄存器和lr? ? ? ? =>? ? ? ? 再用bx lr指令返回
右半部分:
高效簡潔的返回方式:
一句指令實現回復所有通用寄存器(r0-r12),將保存的lr直接彈入pc實現返回跳轉(pc),恢復了中斷發生時的處理器狀態(^ 實現 程序狀態寄存器cpsr 的恢復)
軟件中斷需要:
主函數中調用軟中斷 => 觸發函數接口 => 執行軟中斷處理 => 返回主函數?
3. 配置start與main.c的鏈接
異常向量表設置0x00 為復位,直接進入start部分
分段解析
1. 初始化supervisor模式棧
ldr sp, =0x40001000 // 初始化棧指針,復位后默認為supervisor模式
? ? ? ??在進入主函數操作前,需要對當前默認的supervisor模式設置一個有效的棧空間,確保能夠進行函數調用和臨時數據存儲
通過ldr命令將預先分配的地址(0x40001000)存入到棧指針
2. 聲明主函數
import main // 聲明主函數
????????告知匯編器,符號main是在C語言文件中定義的,定義后可以調用
3. 切換至user模式
1. mrs,msr
手冊496
mrs r0, cpsr // 將當前狀態寄存器備份到r0中msr cpsr_c, r0 // 改寫后的值寫回cpsr的控制域,完成模式切換
mrs指令將整個cpsr的值備份到r0中
? ? ? ? MRS{cond} <Rd>, <PSR>
? ? ? ? mrs <目標寄存器>, <CPSR / SPSR>
msr指令將修改后的值寫回cpsr,完成CPU切換到user模式
? ? ? ? MSR{cond} <PSR>_<fields>, <Rm>
? ? ? ?msr? <CPSR / SPSR>_修改的部分, 源寄存器
<fields>:c:控制域,低8位包含模式位和中斷使能位
x:擴展域
s:狀態域,條件標志位NZCV
f:標志域,條件標志位NZCV
?
2. 工作模式配置
bic r0, r0, #(0x1F << 0)?? ?// 更改arm工作模式,手冊Label - ARM processor?// 低五位清零,準備更改模式
orr r0, r0, #(0x10 << 0)?? ?// 更改工作模式為10000,為user模式
arm工作模式:手冊Label - ARM processor
3. 響應中斷配置
bic r0, r0, #(1 << 7)
清除I位,確保在user模式下??開啟IRQ中斷??,否則user模式無法響應中斷
4. 初始化user模式下的棧指針
ldr sp, =0x40001000 // 初始化user模式下的棧指針
sub sp, sp, #1024 // 與spv模式的棧相隔一段距離
? ? ? ? 為即將運行的主函數設置獨立的棧空間
先與superviosr模式設置成同一個地址,在此基礎上位移一段字節防止相互覆蓋
5. 跳轉并調用執行main函數
b main // 執行主函數
4. 配置main.c
1. 主函數內容
????????目前只實現完成軟中斷的跳轉
2. 軟中斷處理
? ? ? ? 可通過 .s 的軟中斷跳轉到軟中斷處理函數部分并成功返回
3. 函數聲明
? ? ? ? 除了主函數與軟中斷處理函數的聲明外,還需聲明在 .s 文件中的軟中斷觸發響應部分
5. 魔術棒設置
Target:設置ROM1地址
Linker:勾選使用設置的地址 “Use Memory Layout from Target Dialog”
Debug :取消勾選 “run to main()” ,使運行時從.s開始
二、安裝環境
1. visual studio code
ARM插件:Chinese(Simplified)
Arm Assembly
C語言插件:Back & Forth
C / C++
C / C++ Extension Pack
C / C++ Themes
CMake
CMake Tools
highlight - words
Makefile Tools
2. Ubuntu下的編譯器
確認版本? ?arm-linux-gnueabihf-gcc?-v
3. filezilla上傳文件
上傳步驟:文件 => 站點管理器 => 新站點
右側win本地站點,左側Ubuntu遠程站點,選擇對應文件夾,右鍵點擊上傳文件夾上傳
復習
1、arm匯編調用c語言函數以及c語言函數調用匯編編寫的函數,函數的參數和返回值如何處理?
1. 匯編調用C語言
? ? ? ?1.?參數:
前四個參數通過寄存器r0,r1, r2,r3傳遞
后續參數通過棧傳遞,通過壓棧出棧實現傳參
2. 返回值:
通過寄存器r0返回
2. C語言調用匯編
? ? ? ? 1. 參數
調用規則與 匯編調用C語言一致
? ? ? ? 2. 返回值
匯編函數直接讀取寄存器或棧位置
需保存被調用的寄存器(r0-r12,lr)否則會破壞原狀態
2、arm內核中有幾種異常,分別是什么,會使內核切換到那種工作模式
異常中斷 | 含義 | 工作模式 |
reset | 復位中斷 | supervisor |
undefined | 未定義指令 | undifined |
sortware | 軟件中斷 | supervisor |
prefetch | 指令預取中止 | abort |
data | 數據訪問中止 | abort |
IRQ | 外部普通中斷請求 | IRQ |
FIQ | 外部快速中斷請求 | FIQ |