2.swi中軟處理過程
3.取出swi指令中的值
如何切換?發生異常即可:
/************************************=異常向量表****************************************===*/
_start:
b reset //vector 0: reset(0位址對應reset)
ldr pc, und_addr //vector 4: und (發生未定義指令異常,則進入「處理未定義異常函式」)絕對跳轉,跳轉至sdram中
ldr pc, swi_addr //vector 8: swi
und_addr:
.word do_und //存放位址,確保這一位址存放在記憶體的前4k中
swi_addr:
.word do_swi
/*******************************===處理軟中斷異常****************************************=*/
do_swi:
/*執行到這裡之前:
*2.spsr_svc儲存被中斷模式cpsr
*3.cpsr的[m4:m0]=[10011],進入到svc模式
*4.跳到0x08的模式執行程式,即跳到`b do_swi`這一指令
*//* 1.sp_svc 設定棧,因為後面函式需要棧 */
ldr sp,
=0x33e00000
/* 2.儲存現場 */
/* lr是異常處理完後的返回位址,也需要儲存 */
s***b sp!
,//在swi異常處理函式總有可能需要用到r0~r12,因此先儲存下來
mov r4,lr //將lr存放在r4中,呼叫c函式不會破壞r4
/* 3.處理swi異常 */
mrs r0,cpsr //把cpsr的值放入r0
ldr r1,
=swi_string
bl printexception
sub r0,r4,#4
bl printswival
/* 4.恢復現場 */
ldmia sp,
^//將lr的值賦給pc ,`^`會把spsr的值恢復到cpsr中
swi_string:
.string "swi exception"
.align 4
//確保4位元組對齊
ldr sp,
=0x33e00000
s***b sp!
,` //在swi異常處理函式總有可能需要用到r0~r12,因此先儲存下來
mrs r0,cpsr //把cpsr的值放入r0
、預先增加(increment before)、過後減少(decrement after)、。
ldmia sp,
^
用r0 = r4-4
傳給列印函式
ARM裸板 ARM模式 異常與狀態
3.arm的7種模式 mode 4.arm的2種狀態 state 5.異常的處理流程 6.程式以thumb指令集執行 2.中斷方式 常見的異常有 system sys a privileged user mode for the operating system irq irq used for g...
ARM裸板驅動開發之序列通訊協議
最新打算學習基於核心驅動開發方面的知識,在看書的過程中發現,除了要遵循核心的開發規則外,具體實現部分和裸機開發差異不大,由於研究生期間做過微控制器的開發,但畢竟arm裸機開發要比微控制器開發更複雜的多,因此打算從裸機開發開始重新學習一遍。接下來就三星的s3c2440a為平台開始接下來的學習過程,該晶...
ARM裸板程式中為什麼要使用重定位
重定位一般有兩個目的 程式檔案過大,這時候需要把超出儲存器 norflash或sram 部分的 放到 也即重定位 sdram中去執行 程式燒寫在norflash並且使用了全域性變數。這篇文章著重解析第二個目的,對於第乙個目的後續有時間再寫。如果你的程式是燒寫在norflash中,並且程式裡使用了全域...