首页 理论教育 dsPIC器件的软件堆栈与堆栈溢出检测

dsPIC器件的软件堆栈与堆栈溢出检测

时间:2023-06-19 理论教育 版权反馈
【摘要】:dsPIC器件的寄存器W15专门用做软件堆栈指针。所有处理器堆栈操作,包括函数调用、中断和异常都使用软件堆栈。dsPIC器件也支持堆栈溢出检测。如果堆栈指针限制寄存器已被初始化,器件将对所有堆栈操作的溢出进行检测。如果发生溢出,处理器将启动一个堆栈错误异常处理,默认情况下,这将引起处理器复位。链接映射输出文件中给出堆栈的地址。__SPLIM_INIT的值应比物理堆栈限制小至少8个字节,以便允许堆栈错误异常处理。

dsPIC器件的软件堆栈与堆栈溢出检测

dsPIC器件的寄存器W15专门用做软件堆栈指针。所有处理器堆栈操作,包括函数调用、中断和异常都使用软件堆栈。堆栈是向上增长的,即向高存储地址增长。

dsPIC器件也支持堆栈溢出检测。如果堆栈指针限制寄存器(SPLIM)已被初始化,器件将对所有堆栈操作的溢出进行检测。如果发生溢出,处理器将启动一个堆栈错误异常处理,默认情况下,这将引起处理器复位。应用还可通过定义一个名为_StackError的中断函数来安装一个堆栈错误异常处理程序。

C运行时启动模块在启动和初始化过程中对堆栈指针(W15)和堆栈指针限制寄存器(SPLIM)进行初始化。初值通常由链接器提供,链接器尽可能在未使用的数据存储器中分配最大的堆栈。链接映射输出文件中给出堆栈的地址。通过-stack链接器命令行选项,应用可确保至少获得一个最小的堆栈。(www.xing528.com)

另外,可以通过自定义链接描述文件中的用户定义段来分配指定大小的堆栈。在下面的示例中,0x100字节的数据存储区保留给了堆栈,声明了用于C运行时启动模块的两个符号:__SP_init和__SPLIM_init。

其中__SP_init定义了堆栈指针(W15)的初值,而__SPLIM_init定义了堆栈指针限制寄存器(SPLIM)的初值。__SPLIM_INIT的值应比物理堆栈限制小至少8个字节,以便允许堆栈错误异常处理。如果安装了堆栈错误中断处理程序,由于要考虑到中断处理程序本身的堆栈使用,__SPLIM_INIT的值应该更小。默认的中断处理程序不需要额外使用堆栈。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈