?? 71x_vect.s79
字號:
;-----------------------------------------------------------------------------
; ?RESET
; 復位向量。通常INTVEC段被連接到0地址,為程序調試方便,也可以將其放在其它地址。
;-----------------------------------------------------------------------------
MODULE ?RESET
COMMON INTVEC:CODE:NOROOT(2)
EXTERN __program_start
CODE32
EIC_base_addr DEFINE 0xFFFFF800; EIC 基地址
CICR_off_addr DEFINE 0x04 ; 當前中斷通道寄存器
IVR_off_addr DEFINE 0x18 ; 中斷向量寄存器
IPR_off_addr DEFINE 0x40 ; 中斷懸掛寄存器
;*******************************************************************************
; 導入異常句柄
;*******************************************************************************
IMPORT Undefined_Handler
IMPORT SWI_Handler
IMPORT Prefetch_Handler
IMPORT Abort_Handler
IMPORT FIQ_Handler
;*******************************************************************************
; 從71x_it.c文件導入IRQ異常句柄
;*******************************************************************************
IMPORT T0TIMI_IRQHandler ;Timer0 IRQ中斷句柄
;需要時可以在此加入其它IRQ中斷句柄
;*******************************************************************************
; 導出外設IRQ句柄表地址
;*******************************************************************************
EXPORT T0TIMI_Addr
EXPORT IRQHandler
;*******************************************************************************
; 異常向量
;*******************************************************************************
LDR PC, Reset_Addr
LDR PC, Undefined_Addr
LDR PC, SWI_Addr
LDR PC, Prefetch_Addr
LDR PC, Abort_Addr
NOP ;保留向量
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
;*******************************************************************************
; 異常句柄地址表
;*******************************************************************************
Reset_Addr DCD __program_start
Undefined_Addr DCD UndefinedHandler
SWI_Addr DCD SWIHandler
Prefetch_Addr DCD PrefetchAbortHandler
Abort_Addr DCD DataAbortHandler
DCD 0 ;保留向量
IRQ_Addr DCD IRQHandler
FIQ_Addr DCD FIQHandler
;*******************************************************************************
; 外設IRQ句柄地址表
;*******************************************************************************
T0TIMI_Addr DCD T0TIMIIRQHandler
;需要時可以在此定義其它外設IRQ句柄地址,如:FLASH_Addr DCD FLASHIRQHandler
;*******************************************************************************
; 異常句柄
;*******************************************************************************
;*******************************************************************************
;說明:SaveContext宏,用于進入異常句柄之前保存上下文(context)
;入口:需要保存的寄存器范圍
;出口:無
;*******************************************************************************
SaveContext MACRO reg1,reg2
STMFD sp!,{reg1-reg2,lr} ;將當前工作區(qū)和返回地址進棧保存
MRS r1,spsr ;將spsr_mode保存到r1
STMFD sp!,{r1} ;保存spsr
ENDM
;*******************************************************************************
;說明:RestoreContext宏,用于恢復異常句柄上下文,使程序繼續(xù)運行
;入口:需要恢復的寄存器范圍
;出口:無
;*******************************************************************************
RestoreContext MACRO reg1,reg2
LDMFD sp!,{r1} ;將保存的spsr_mode恢復到r1
MSR spsr_cxsf,r1 ;恢復spsr_mode.
LDMFD sp!,{reg1-reg2,pc}^ ;返回
ENDM
;*******************************************************************************
;說明:UndefinedHandler函數,該函數在發(fā)生未定義指令異常時調用
;入口:無
;出口:無
;*******************************************************************************
UndefinedHandler
SaveContext r0,r12 ;保存工作區(qū)和當前返回地址lr_und及spsr_und
BL Undefined_Handler ;跳轉到Undefined_Handler
RestoreContext r0,r12 ;恢復上下文,返回
;*******************************************************************************
;說明:SWIHandler函數,該函數在執(zhí)行SWI指令時調用
;入口:無
;出口:無
;*******************************************************************************
SWIHandler
SaveContext r0,r12 ;保存工作區(qū)和當前返回地址lr_svc及spsr_svc
BL SWI_Handler ;跳轉到SWI_Handler.
RestoreContext r0,r12 ;恢復上下文,返回
;*******************************************************************************
;說明:IRQHandler函數,該函數在進入IRQ異常時調用
;入口:無
;出口:無
;*******************************************************************************
IRQHandler
SUB lr,lr,#4 ;更新鏈接寄存器
SaveContext r0,r12 ;保存工作區(qū)和當前返回地址lr_irq及spsr_irq
LDR lr, =ReturnAddress ;讀取返回地址
LDR r0, =EIC_base_addr
LDR r1, =IVR_off_addr
ADD pc,r0,r1 ;跳轉到IRQ handler
ReturnAddress:
;清除EIC中的未決位(使用合適的IPRx)
LDR r0, =EIC_base_addr
LDR r2, [r0, #CICR_off_addr] ;獲得IRQ通道號
MOV r3,#1
MOV r3,r3,LSL r2
STR r3,[r0, #IPR_off_addr] ;清除相應的IPR位
RestoreContext r0,r12 ;恢復上下文,返回
;*******************************************************************************
;說明:PrefetchAbortHandler函數,該函數在進入預取中止異常時調用
;入口:無
;出口:無
;*******************************************************************************
PrefetchAbortHandler
SUB lr,lr,#4 ;更新鏈接寄存器
SaveContext r0,r12 ;保存工作區(qū)和當前返回地址lr_abt及spsr_abt
BL Prefetch_Handler ;跳轉到Prefetch_Handler.
RestoreContext r0,r12 ;恢復上下文,返回
;*******************************************************************************
;說明:DataAbortHandler函數,該函數在進入數據中止異常時調用
;入口:無
;出口:無
;*******************************************************************************
DataAbortHandler
SUB lr,lr,#8 ;更新鏈接寄存器
SaveContext r0,r12 ;保存工作區(qū)和當前返回地址lr_abt及spsr_abt
BL Abort_Handler ;跳轉到Abort_Handler.
RestoreContext r0,r12 ;恢復上下文,返回
;*******************************************************************************
;說明:FIQHandler,該函數在進入FIQ異常時調用
;入口:無
;出口:無
;*******************************************************************************
FIQHandler
SUB lr,lr,#4 ;更新鏈接寄存器
SaveContext r0,r7 ;保存工作區(qū)和當前返回地址lr_ fiq及spsr_fiq
BL FIQ_Handler ;跳轉到FIQ_Handler
RestoreContext r0,r7 ;恢復上下文,返回
;*******************************************************************************
;說明:IRQ_to_SYS宏,用于從IRQ模式切換到SYS模式
;入口:無
;出口:無
;*******************************************************************************
IRQ_to_SYS MACRO
MSR cpsr_c,#0x1F ;切換到SYS模式
STMFD sp!,{lr} ;保存鏈接寄存器
ENDM
;*******************************************************************************
;說明:SYS_to_IRQ宏,用于從SYS模式切換到IRQ模式,然后返回到IRQ句柄
;入口:無
;出口:無
;*******************************************************************************
SYS_to_IRQ MACRO
LDMFD sp!,{lr} ;恢復鏈接寄存器
MSR cpsr_c,#0xD2 ;切換到IRQ模式
MOV pc,lr ;返回到IRQHandler,清除未決位
ENDM
;*******************************************************************************
;說明:T0TIMIIRQHandler函數,用于在進入由71x_it.c文件定義的T0TIMI_IRQHandler
; 函數之前切換到SYS模式,當T0TIMI_IRQHandler結束時再返回到IRQ模式
;入口:無
;出口:無
;*******************************************************************************
T0TIMIIRQHandler
IRQ_to_SYS
BL T0TIMI_IRQHandler
SYS_to_IRQ
;*******************************************************************************
; 需要時在此定義其它函數
;*******************************************************************************
LTORG
ENDMOD
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -