PIC硬件堆栈与软件堆栈
软件栈是你自己通过编码实现的。你在内存里划一块作栈区,用一个变量作栈指针。
本文引用地址:https://www.eepw.com.cn/article/201611/316247.htm软件堆栈:也可以说是用户堆栈。可以被定义在内部或外部RAM中。它是用户为任务建立的专用数据堆栈,与系统堆栈的数据区是隔开的。它可以保存用户想保存的任何寄存器和状态字。
MPLAB C18的软件堆栈是向上生长的堆栈数据结构,编译器把函数参数和auto存储类别的局部变量放入软件堆栈中。软件堆栈与PICmicro单片机用于保存函数调用返回地址的硬件堆栈不同。
栈指针(FSR1)始终指向下一个可用的堆栈地址。MPLAB C18使用FSR2作为帧指针,这样可以快速访问局部变量和参数。函数被调用时,其基于堆栈的参数以自右向左的顺序压入堆栈,然后再调用这个函数。进入函数时,最左端的函数参数位于软件堆栈的顶端。
帧指针指向堆栈中把基于堆栈的参数和基于堆栈的局部变量分隔开的地址。基于堆栈的参数位于帧指针的下方,而基于堆栈的局部变量位于帧指针的上方。刚进入C函数时,被调用函数把FSR2的值压入堆栈,并把FSR1的值复制到FSR2,从而保存了调用函数的现场并初始化了当前函数的帧指针。然后函数基于堆栈的局部变量的总长度被加到栈指针,并为这些变量分配堆栈空间。基于堆栈的局部变量和基于堆栈的参数则根据其相对于帧指针的偏移量来引用。
评论