|
大家好!
我使用的是mini2440的开发板子,s3c2440soc arm920t的核心,openjtag的在板子调试工具。我想做他的中断嵌套。其实arm920t是不支持中断嵌套的,但是我想
在进入中断后,切换到svc模式运行ISR,这是打开中断,是可以再次进入中断的这样来做中断嵌套。代码如下,基本上是对版主书附带中断程序进行修改而来。
_start:
b Reset
HandleUndef:
b HandleUndef
HandleSWI:
b HandleSWI
HandlePrefetchAbort:
b HandlePrefetchAbort
HandleDataAbort:
b HandleDataAbort
HandleNotUsed:
b HandleNotUsed
b HandleIRQ (这里中断处理第一条指令)
HandleFIQ:
b HandleFIQ
Reset:
ldr sp, =4096
bl disable_watch_dog 关看门狗
msr cpsr_c, #0xd2 设置中断栈的位置
ldr sp, =3072
msr cpsr_c, #0xd3 设置svc模式下的位置
ldr sp, =4096
bl init_led 初始化gpiob 为点灯作准备
bl init_irq 初始化中断控制器,为接受中断做准备 四个按键
msr cpsr_c, #0x53 开中断,准备接受按键触发的中断
ldr lr, =halt_loop main函数返回时候执行,永远不会执行
ldr pc, =main main函数主要是个死循环,等待按键中断它的执行
halt_loop:
b halt_loop
count: .word 0 设置记录进入中断次数的计数器,为了调试方便,因为这个程序会跑崩,基本上是中断控制器不能清空,处理完中断,从中断返回又再次
进入中断,但是不知道为什么,加了个变量看到这个问题。
count1: .word 1
HandleIRQ: 按键后要执行的代码在这里,cpu mode--> irq,使用上面设置的中断栈
sub lr, lr, #4
stmdb sp!, { r0-r12,lr } 在中断中保存环境
mrs r0, spsr
stmdb sp!, {r0}
ldr r0, count count += 1
ldr r1, =count
add r0,r0,#1
str r0, [r1]
ldr r0, count1 count1 += 1
ldr r1, =count1
add r0,r0,#1
str r0, [r1]
/* 这个是我嗡鸣器响 响一段时间 关掉 其实也是想看看进入中断多少次,但是这样一加就能清处 eintpend srcpend intpend 中相应位了
bl beep_on 也就不会再irq-->svc时继续产生刚才处理过的中断。
bl delay 但是如果去掉这个下面的清除 eintpend srcpend intpend寄存器的指令就好像没有执行过一样,实在不解!!!!!
bl beep_off
*/
ldr r0, =0x560000a8 清eintpend!!!!!!!!!!!!!
ldr r1, [r0]
str r1, [r0]
ldr r0, =0x4a000000 清srcpend !!!!!!!!!!!!!!
ldr r1, [r0]
str r1, [r0]
ldr r0, =0x4a000010 清 intpend!!!!!!!!!!!!
ldr r1, [r0]
str r1, [r0]
/*
looop:
b looop 我曾经在这里设置无限循环,用openjtag mdw 看enintpend srcpend intpend,发现如果不加 beep_on delay beep_off指令执行过去,就跟没有
*/ 执行一样,不解!!!!!!
msr cpsr_c, #0x53 开中断同时切换到svc模式,这样再来中断就可以处理了
ldr lr, =int_return
ldr pc, =EINT_Handle
int_return:
msr cpsr_c, #0xd2 关中断 svc-->irq
ldmia sp!, {r0} 从中断栈中恢复原来保存的处理机上下文
msr spsr, r0
ldmia sp!, { r0-r12,pc }^
清高手解答,可以留言,也可以qq联系我,谢谢
再次感谢 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|