首页 理论教育 AVR单片机堆栈检查函数

AVR单片机堆栈检查函数

时间:2023-10-17 理论教育 版权反馈
【摘要】:用户调用_StackCheck函数来检查堆栈溢出,如果警戒线字节仍然保持正确的值,那么函数检查通过。如果堆栈溢出,那么警戒线字节将可能被破坏。当用户注意程序堆栈溢出的时候,程序将可能运行不正常或偶然崩溃,_StackCheck检查错误条件时,调用了函数_StackOverflowed,如果参数是1,那么硬件堆栈有过溢出。注意自堆栈溢出指示故障程序后,_StackOverflowed函数或许不能执行任何太复杂的事或实现程序的正常工作。

AVR单片机堆栈检查函数

有几个库函数是用于检查堆栈是否溢出的,内存图如图4-25所示。如果硬件堆栈增长到软件堆栈中,那么软件堆栈的内容将会被改变,也就是说局部变量和别的堆栈项目被改变。硬件堆栈是用做函数的返回地址,如果用户的函数调用层次太深偶然会发生这种情况。

同样的,软件堆栈溢出进数据区域将会改变全局变量或其他静态分配的项目,这种情况在用户定义了太多的局部变量或一个局部集合变量太大也会偶然发生。

978-7-111-35161-0-Chapter04-33.jpg

图4-25 堆栈内存图

启动代码写了一个正确的关于数据区的地址字节和一个类似的正确的关于软件堆栈的地址字节作为警戒线。(www.xing528.com)

注意:如果用户使用动态分配内存,那么必须跳过警戒线字节_bss_end来分配用户的堆栈。要参考内存来分配函数。

用户调用_StackCheck(void)函数来检查堆栈溢出,如果警戒线字节仍然保持正确的值,那么函数检查通过。如果堆栈溢出,那么警戒线字节将可能被破坏。

当用户注意程序堆栈溢出的时候,程序将可能运行不正常或偶然崩溃,_StackCheck检查错误条件时,调用了函数_StackOverflowed(char c),如果参数是1,那么硬件堆栈有过溢出。如果参数是0,那么软件堆栈曾经溢出。在_StackOverflowed执行起作用时,第二个调用不可以出现。作为例子,如果函数复位了CPU,那么将不能返回_StackCheck函数。

当默认的_StackOverflowed函数被调用时,库会跳转到0的位置。因此,复位CPU和程序时,用户可能希望用一个函数来代替它以指示更多的错误条件,作为一个例子,它可能切断所有的中断并且点亮LED。注意自堆栈溢出指示故障程序后,_StackOverflowed函数或许不能执行任何太复杂的事或实现程序的正常工作。这两个函数的原型在头文件macros.h.中。

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

我要反馈