作为嵌入式的菜鸟一只,偶然发现代码中的一个小问题 (一段时间后,程序停止运行——),在这里与大家分享,我们来看一下国嵌的中断代码:
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"
:
:
);