完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我现在正在写裸机中断代码。
代码架构:用汇编初始化IO口(控制灯,蜂鸣器,作为提示),初始化与外部中断有关寄存器EINTMASK,INTMSK.GPGCON,(只用一个按键,不涉及优先级之类的东西,就没有初始化其他东西)。还有就是设置一下中断模式下的sp。中断服务程序用的是C语言。 问题:当中断服务程序也是汇编时,没有任何问题,但是当把中断服务程序改为C语言后,可以进入中断,也执行中断服务程序,但是一旦退出,就会立即重启。不知道是为什么。求大神指导一下。 代码如下: .extern ISR .text .global _start _start: b reset @ 0x04 handleUndef: b handleUndef handleSWI: b handleSWI handlePrefetchAbort: b handlePrefetchAbort handleDataAbort: b handleDataAbort handleNotUsed: b handleNotUsed b handleIRQ handleFIQ: b handleFIQ reset: bl init_io bl init_int ldr r1, =0x53000000 @关闭开门狗 ldr r2, =0xffffffdf @关闭开门狗 str r2, [r1] @关闭开门狗 ldr r1, =0x56000014 @GPBDAT ldr r2, =0xfffffEBf @指示灯亮,视为A情况。 str r2, [r1] msr cpsr_c, #0xd2 @中断模式 ldr sp, =3072 msr cpsr_c, #0x5f @系统模式 ldr lr, =loop loop: @如果正常运行的话,会在此处出现死循环,一旦触发中断,便会立即执行中断服务程序,然后再次返回这里 b loop @但现在问题是退出中断后,指示灯又为A情况(上文),也就是说,有重头开始了,是在头疼。 init_io: ldr r1, =0x56000010 @ GPBCON ldr r2, =0xfffd57fd str r2, [r1] ldr r1, =0x56000014 @GPBDAT ldr r2, =0xffffffff str r2, [r1] ldr r1, =0x56000060 @GPGCON ldr r2, =0xfffffffe str r2, [r1] ldr r1, =0x5600008c @EINT1设置触发方式 ldr r2, =0 str r2, [r1] mov pc, lr init_int: ldr r1, =0x4a000008 @INIMAK ldr r2, =0xffffffdf STR r2, [r1] ldr r1, =0x560000a4 @exinmak ldr r2, =0xfffffeff str r2, [r1] mov pc, lr handleIRQ: @中断入口地址 sub lr, lr, #4 stmdb sp!, {r0-r12,lr} ldr lr, =com ldr pc, =ISR @调用中断服务程序 com: ldmia sp!, {r0-r12,pc}^ #include"2440_addr.h" void ISR (void) { GPBDAT=0XFFFFFE7E; //改变指示灯 视为b情况; while(!(GPGDAT&0X00000001)); //松手检测(使用低电平触发) GPBDAT=0XFFFFFF9E; //改变指示灯。观察松手检测是否成功,视为C情况。 INTPND=INTPND; EINTPEND=EINTPEND; SRCPND=SRCPND; } 按理来说,退出中断后,应该为C情况,C才是最后被执行代码,但是现在问题就是总是重启,也关闭开门狗了,跪求大神赐教啊,此问题已经卡死4天了,一直找不到调不通啊,真心不知道哪里有问题啊。 以下是用汇编写的中断服务程序,运行正常。功能和C语言一模一样 handleIRQ: sub lr, lr, #4 stmdb sp!, {r0-r12,lr} ldr r1, =0x56000014 @GPBDAT ldr r2, =0x00000000 str r2, [r1] ldr r1, =0x56000064 @GPBDAT loopp: @松手检测 ldr r2, [r1] and r2, r2, #0x00000001 cmp r2, #0 beq loopp ldr r1, =0x56000014 @GPBDAT ldr r2, =0x00000f50 str r2, [r1] ldr r1, =0x4a000000 @清除中断标志位 ldr r2, [r1] str r2, [r1] ldr r1, =0x4a000010 ldr r2, [r1] str r2, [r1] ldr r1, =0x560000a8 ldr r2, [r1] str r2, [r1] ldmia sp!, {r0-r12,pc}^ makefile int.bin:int.o interrupt_isr.o ARM-linux-ld -Ttext 0x00000000 -o int_elf int.o interrupt_isr.o arm-linux-objcopy -O binary -S int_elf int.bin int.o:int.s arm-linux-gcc -c int.s -o int.o interrupt_isr.o:interrupt_isr.c arm-linux-gcc -c interrupt_isr.c -o interrupt_isr.o |
|
相关推荐
1个回答
|
|
又一天的调试,虽然没有解决问题,但是问题有所聚焦了,http://www.100ask.org/bbs/forum. ... id=12151&extra= 如果想一起讨论的可以进这里,这个是刚刚发的求助帖
|
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2156 浏览 6 评论
1964 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4521 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 08:09 , Processed in 0.581009 second(s), Total 76, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号