载入中...

公告
载入中...

我的分类(专题)

载入中...


最新日志
载入中...

最新回复
载入中...

留言板
载入中...

统计
载入中...

链接

载入中...


<meta name="verify-v1" content="hSKR+iw6UvoD68VWdtcltdbdhWZenChrX9XGDxU33Y4=" />

ARM7 swi中断
net_hawk 发表于 2008-7-17 16:09:00

 

 MRS     R0 ,SPSR              ; Get SPSR
 TST     R0,#0x20          ; Check Thumb Bit
 LDRNEH  R0, [LR,#-2]          ; Thumb: Load Halfword
 BICNE   R0, R0, #0xFF00      ;        Extract SWI Number
 LDREQ   R0, [LR,#-4]          ; ARM:   Load Word
 BICEQ   R0, R0, #0xFF000000  ; 

 PRESERVE8
 
SWI_IRQ_DIS  EQU 0
SWI_IRQ_EN  EQU 1
SWI_FIQ_DIS  EQU 2
SWI_FIQ_EN  EQU 3

I_Bit   EQU 0x80
F_Bit   EQU 0x40
 
;The exported labels and functions
 EXPORT  SoftwareInterrupt
 EXPORT  SWI_Handler
 EXPORT  IntEnable
 EXPORT  IntDisable

 CODE32
 AREA  SWI_by_net_hawk,CODE,READONLY
 ENTRY
   
;********************************************************************
;*  SWI interrupt handler           *
;*  Function : SoftwareInterrupt(SWI_Number_      *
;*  The SWI_Number is 0 through 3        *
;*  See below "SwiFunction" table below       *
;*  Parameters:    None            *
;*  input  :       SWI_Number          *
;*  output :       None            *
;
; WI_Addr        DCD     SWI_Handler at 0x000000x
; IMPORT  SWI_Handler
;********************************************************************
SoftwareInterrupt
 stmfd sp!,{lr}
 swi 0
 ldmfd sp!,{pc}
 
SWI_Handler   
 CMP  R0, #4
 LDRLO PC, [PC, R0, LSL #2]
 MOVS PC, LR
 
SwiFunction
 DCD IRQDisable  ;0
 DCD IRQEnable  ;1
 DCD FIQDisable  ;2
 DCD FIQEnable  ;3

IRQDisable
 MRS  R0, SPSR
 ORR  R0, R0, #I_Bit
 MSR  SPSR_c, R0
 MOVS PC, LR

IRQEnable
 MRS  R0, SPSR
 BIC  R0, R0, #I_Bit 
 MSR  SPSR_c, R0
 MOVS PC, LR

FIQDisable
 MRS  R0, SPSR
 ORR  R0, R0, #F_Bit
 MSR  SPSR_c, R0
 MOVS PC, LR

FIQEnable
 MRS  R0, SPSR
 BIC  R0, R0, #F_Bit 
 MSR  SPSR_c, R0
 MOVS PC, LR

;**********************************************************************
;*  Call SWI to enable IRQ                                            *
;*  Function : void IntEnable(void)                                   *
;*  Parameters:      None                                             *
;*  input  :         None                                             *
;*  output :         None                                             *
;**********************************************************************
IntEnable
 SWI     SWI_IRQ_EN 
 BX      lr 
; end of IntEnable

;**********************************************************************
;*  Call SWI to disable IRQ                                           *
;*  Function : void IntDisable(void)                                  *
;*  Parameters     : None                                             *
;*  input          : None                                             *
;*  output         : None                                             *
;**********************************************************************
IntDisable
 SWI     SWI_IRQ_DIS  
 BX      lr
; end of IntDisable

 END


阅读全文 | 回复(0) | 引用通告 | 编辑

发表评论:
载入中...