ICC编译器编译的中断服务程序:为什么不使用硬件堆栈,而只使用软堆呢(Y寄存器)呢?
以下是ICC的内存映像://////////////////////////////////////////////
硬件堆栈区 高地址
//////////////////////////////////////////////
软件堆栈区
//////////////////////////////////////////////
全局变量和字符串区
//////////////////////////////////////////////
I/O寄存器区
//////////////////////////////////////////////
CPU寄存器区 低地址
//////////////////////////////////////////////
以下是一个实际的程序,有关定时中断服务程序出栈时的代码:
1616 0990 ld R0,y+
1618 0FBE out 0x3f,R0
161A F991 ld R31,y+
161C E991 ld R30,y+
161E B991 ld R27,y+
1620 A991 ld R26,y+
1622 9991 ld R25,y+
1624 8991 ld R24,y+
1626 3991 ld R19,y+
1628 2991 ld R18,y+
162A 1991 ld R17,y+
162C 0991 ld R16,y+
162E 9990 ld R9,y+
1630 8990 ld R8,y+
1632 7990 ld R7,y+
1634 6990 ld R6,y+
1636 5990 ld R5,y+
1638 4990 ld R4,y+
163A 3990 ld R3,y+
163C 2990 ld R2,y+
163E 1990 ld R1,y+
1640 0990 ld R0,y+
1642 1895 reti
然而却没有发现入栈时的代码,为什么呢? 硬件堆栈是必要的,因为CALL语句,响应中断过程中的断点保护都必须依赖硬件堆栈,这是AVR的指令定死的。
但是中断现场保护不一定非使用硬件堆栈(PUSH、POP),使用其它RAM空间也是可以的。 谢谢。
uC/OS-II中,每个任务都有一个栈,记录自己的堆栈的栈顶指针。
我在想,如果ICC编译器允许中断嵌套,每个中断服务程序是如何记录自己的Y寄存器首地址的呢?(即:每个中断服务程序恢复现场时,是如何得到自己的软堆栈栈顶指针呢?) 软堆栈同硬堆栈的操作有什么区别吗?
Y寄存器的地址是固定的,里面就是软堆栈的栈顶指针,只要压几个,弹几个就可以了。
还是基础不扎实。 明白了。
Y寄存器就是软堆栈栈顶指针。恢复现场时,只需要依次执行Y+即可(类似SP+)。
页:
[1]