主题 : 国嵌代码的中断问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 113040
精华: 0
发帖: 7
金钱: 40 两
威望: 8 点
贡献值: 0 点
综合积分: 14 分
注册时间: 2015-02-28
最后登录: 2015-12-16
楼主  发表于: 2015-03-01 01:07

 国嵌代码的中断问题

作为嵌入式的菜鸟一只,偶然发现代码中的一个小问题 (一段时间后,程序停止运行——),在这里与大家分享,我们来看一下国嵌的中断代码:
1:在start.s中设置栈:
init_stack:
msr cpsr_c, #0xd2
ldr sp, =0x23000000 @此处实际设置的是r13_irq
msr cpsr_c, #0xd3
ldr sp, =0x24000000 @此处实际设置的是r13_svc
mov pc, lr
2:在中断处理函数中保护现场
__asm__(
"sub lr, lr, #4\n"
"stmfd sp!, {r0-r12, lr}\n"
:
:
);


/* 清除中断 */
EXT_INT_2_PEND = ~0x0;
VIC0ADDRESS = 0;

__asm__(
"ldmfd sp!, {r0-r12, pc}^ \n"
:
:
);

过嵌代码中在start.s中设置了中断模式下的栈,每次启动开发板,就会设置一次设置中断模式下的栈,注意,是只会设置一次,而在下面的中断处理函数中,代码只是简单的保存了一下寄存器的值,并没有更新中断模式下栈,也就是说,每次进入中断,sp都会不断的往下降,程序运行时间不长的话一般不会出问题,一旦程序 长时间运行,即使我们有再大的内存,也会有耗尽的一天,程序也会停止运行;
所以我们在中断处理函数中嵌入的汇编应该这样写:
__asm__(

"ldr sp, =0x23000000\n" //刷新中断模式下的栈
"sub lr, lr, #4\n"
"stmfd sp!, {r0-r12, lr}\n"
:
:
);


/* 清除中断 */
EXT_INT_2_PEND = ~0x0;
VIC0ADDRESS = 0;

__asm__(
"ldmfd sp!, {r0-r12, pc}^ \n"
:
:
);