搜索
bottom↓
回复: 0

请教个arm920t核心的中断嵌套问题

[复制链接]

出0入0汤圆

发表于 2011-1-20 11:07:30 | 显示全部楼层 |阅读模式
大家好!
      我使用的是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周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 23:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表