ba_wang_mao 发表于 2009-4-21 08:46:41

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

 然而却没有发现入栈时的代码,为什么呢?

machao 发表于 2009-4-21 15:31:38

硬件堆栈是必要的,因为CALL语句,响应中断过程中的断点保护都必须依赖硬件堆栈,这是AVR的指令定死的。

但是中断现场保护不一定非使用硬件堆栈(PUSH、POP),使用其它RAM空间也是可以的。

ba_wang_mao 发表于 2009-4-22 08:59:19

谢谢。
  uC/OS-II中,每个任务都有一个栈,记录自己的堆栈的栈顶指针。
  我在想,如果ICC编译器允许中断嵌套,每个中断服务程序是如何记录自己的Y寄存器首地址的呢?(即:每个中断服务程序恢复现场时,是如何得到自己的软堆栈栈顶指针呢?)

machao 发表于 2009-4-23 11:29:29

软堆栈同硬堆栈的操作有什么区别吗?

Y寄存器的地址是固定的,里面就是软堆栈的栈顶指针,只要压几个,弹几个就可以了。

还是基础不扎实。

ba_wang_mao 发表于 2009-4-23 17:33:07

明白了。
  Y寄存器就是软堆栈栈顶指针。恢复现场时,只需要依次执行Y+即可(类似SP+)。
页: [1]
查看完整版本: ICC编译器编译的中断服务程序:为什么不使用硬件堆栈,而只使用软堆呢(Y寄存器)呢?