请教匠人一个关于ARM7的问题!
1 软中断
__swi(0x00) void SwiHandle1(void);
这个指令当它触发软中断时,我怎么读取这个中断功能号?
还有就是这个功能号是24位,那是不是说,软中断最多可以有2的24次方个?
2 MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function
EXPORT $IRQ_Label ; The label for exports 输出的标号
IMPORT $IRQ_Exception_Function ; The imported labels 引用的外部标号
$IRQ_Label
SUB LR, LR, #4 ; Calculate the returning address 计算返回地址
STMFD SP!, {R0-R3, R12, LR} ; Protects the task environments 保存任务环境
MRS R3, SPSR ; Protects the status variable 保存状态
STMFD SP, {R3,LR}^ ; Protects SPSR and SP in user status, Notice: DO NOT write back.保存SPSR和用户状态的SP,注意不能回写
; If the SP is written back, it should be adjusted to its appropriate value later.如果回写的是用户的SP,所以后面要调整SP
NOP
SUB SP, SP, #4*2
MSR CPSR_c, #(NoInt | SYS32Mode) ; Switch to the System Mode 切换到系统模式
BL $IRQ_Exception_Function ; call the C interrupt handler funtion 调用c语言的中断处理程序
MSR CPSR_c, #(NoInt | IRQ32Mode) ; Switch bak to IRQ mode 切换回irq模式
LDMFD SP, {R3,LR}^ ; Recover SPSR and SP in user status, Notic: DO NOT write back. 恢复SPSR和用户状态的SP,注意不能回写
; If the SP is written back, it should be adjusted to its appropriate value later.如果回写的是用户的SP,所以后面要调整SP
MSR SPSR_cxsf, R3
ADD SP, SP, #4*2 ;
LDMFD SP!, {R0-R3, R12, PC}^ ;
MEND
这个宏的用法! 这个宏中,为什么有这句STMFD SP!, {R0-R3, R12, LR} ,为什么不是STMFD SP!, {R0-R12, LR}?我知道R0-R3是用来保存参数的,LR保存返回地址的,为什么有个R12,这个寄存器在此处是什么个用途呢? |