?? head.s
字號:
@******************************************************************************@ File:head.S@ 功能:初始化,設置中斷模式、系統模式的棧,設置好中斷處理函數@****************************************************************************** .extern main.text .global _start _start:@****************************************************************************** @ 中斷向量,本程序中,除Reset和HandleIRQ外,其它異常都沒有使用@****************************************************************************** b Reset@ 0x04: 未定義指令中止模式的向量地址HandleUndef: b HandleUndef @ 0x08: 管理模式的向量地址,通過SWI指令進入此模式HandleSWI: b HandleSWI@ 0x0c: 指令預取終止導致的異常的向量地址HandlePrefetchAbort: b HandlePrefetchAbort@ 0x10: 數據訪問終止導致的異常的向量地址HandleDataAbort: b HandleDataAbort@ 0x14: 保留HandleNotUsed: b HandleNotUsed@ 0x18: 中斷模式的向量地址 b HandleIRQ@ 0x1c: 快中斷模式的向量地址HandleFIQ: b HandleFIQReset: ldr sp, =4096 @ 設置棧指針,以下都是C函數,調用前需要設好棧 bl disable_watch_dog @ 關閉WATCHDOG,否則CPU會不斷重啟 msr cpsr_c, #0xd2 @ 進入中斷模式 ldr sp, =3072 @ 設置中斷模式棧指針 msr cpsr_c, #0xdf @ 進入系統模式 ldr sp, =4096 @ 設置系統模式棧指針, @ 其實復位之后,CPU就處于系統模式, @ 前面的“ldr sp, =4096”完成同樣的功能,此句可省略 bl init_led @ 初始化LED的GPIO管腳 bl init_irq @ 調用中斷初始化函數,在init.c中 msr cpsr_c, #0x5f @ 設置I-bit=0,開IRQ中斷 ldr lr, =halt_loop @ 設置返回地址 ldr pc, =main @ 調用main函數halt_loop: b halt_loopHandleIRQ: sub lr, lr, #4 @ 計算返回地址 stmdb sp!, { r0-r12,lr } @ 保存使用到的寄存器 @ 注意,此時的sp是中斷模式的sp @ 初始值是上面設置的3072 ldr lr, =int_return @ 設置調用ISR即EINT_Handle函數后的返回地址 ldr pc, =EINT_Handle @ 調用中斷服務函數,在interrupt.c中int_return: ldmia sp!, { r0-r12,pc }^ @ 中斷返回, ^表示將spsr的值復制到cpsr
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -