arm进入中断之前都需要保存那些寄存器
在周立功的模板里看到他保存了 R0-R3, R12, LR 这些寄存器 但是根据atpcs编码规则保存这些是不行的啊周立功为什么这么写啊
有什么原因吗 网上强人真多啊
这个是周立功ucos的中断模板很详细的解释啊
点击此处下载 ourdev_549302.txt(文件大小:4K) (原文件名:IRQ.C的中文解释.txt)
在这里这里看的解释非常感谢cxyang老师
http://blog.chinaunix.net/u1/52323/showart_415698.html 回复【楼主位】SHMI
-----------------------------------------------------------------------
同问,现在我也不太清楚到底要保存哪些寄存器,有时只保存一个,有时保存七八个,搞不懂,等待大牛指导啊。。。 周立功的中断处理程序
CODE32
AREA IRQ,CODE,READONLY
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
保存了r0-r3r12 lr但是编译器自动保存了 r4-r11 也就是说全部都保存了啊
是基于ads1.2支持atpcs编译规则 终于找到了 比较详细的介绍了啊
连接方式如下
http://tech.fuwuqi.com.cn/Development/embedded/2009-07-15/4762356812486.shtml 昨天看了一下周立功的模板和S3C44B0的模板
发现周立功的模板上进入中断子函数还要查找是发生了那个中断,应该是通过$IRQ_Label HANDLER $IRQ_Exception_Function来找的所以要用到r0-r3 继而先将这几个寄存器压栈
S3C44B0 的中断代码如下
IsrIRQ ;using I_ISPR register.
sub sp,sp,#4 ;reserved for PC
stmfd sp!,{r8-r9}
;IMPORTANT CAUTION
;if I_ISPC isn't' used properly, I_ISPR can be 0 in this routine.
ldr r9,AddrISPR;=I_ISPR
ldr r9,
cmp r9, #0x0 ;If the IDLE mode work-around is used,
;r9 may be 0 sometimes.
beq %F2
mov r8,#0x0
0
movs r9,r9,lsr #1
bcs %F1
add r8,r8,#4
b %B0
1
ldr r9,AddrHandleADC;=HandleADC
add r9,r9,r8
ldr r9,
str r9,
ldmfd sp!,{r8-r9,pc}
2
ldmfd sp!,{r8-r9}
add sp,sp,#4
subs pc,lr,#4
AddrISPR;There is no this phrases in original 44binit.s
DCD I_ISPR
AddrHandleADC
DCD HandleADC
IsrIRQEnd
它是通过偏移地址直接计算出是哪一个中断,因此不需要r0-r3所以也就不需要压栈了啊
有不正确的地方还请高手指出啊 !!!!!!!!!! mark mark
页:
[1]