The stack `XdataStack`()is outside the stack range

来源:互联网 发布:间接网络外部性 编辑:程序博客网 时间:2024/05/29 08:35

ZigBee在调试的时候有时候会出现The stack `XdataStack`()is outside the stack range的情况,出现这样的情况很多人都不知道该怎么办才好,上网搜索解决办法大多都是在Option->General Options->Stack/Heap里面XDATA数值,但是实际的情况是XDATA已经达到最大值,无法再设置XDATA,因此这个方法很多情况下是不可行的,下面我主要就出现这种情况的原因说明一下,大家可以根据这个原因查找自己代码可能出现的问题来解决该问题。

堆(Heap):堆是由程序员分配和释放的内存空间,比如使用malloc或者new申请了一块内存空间,则该空间需要有程序员主动释放,若没有释放,则内存会保留到程序结束。如果频繁申请内存而不释放则会造成堆溢出。

栈(Stack):栈空间时候系统自动分配和释放的内存空间,比如在编程过程中申请了一个局部变量,则该变量在函数调用完成后由系统自动收回。

Stack即为栈空间,出现[The stack `XdataStack`()is outside the stack range]则意味着栈空间溢出了。造成栈空间溢出的原因有这几个:一、函数在运行过程中由于定义的局部变量过多造成栈空间不够用溢出;二、函数中定义了大数组的局部变量,造成使用过程中栈空间不够用;三、多层函数调用造成频繁压栈导致栈空间使用不足;四、其他情况。   

归根结底,栈空间的溢出就是由局部变量使用过多造成的,由于局部变量不是始终使用的空间,因此造成栈溢出的原因主要局部变量定义了大数组的原因,加上大数组频繁压栈,CC2530的栈空间一共才七百多个字节,因此栈空间溢出的避免方法就是查找自己写的程序是否定义了很多的大数组,如果有,将它变为全局变量试试,也许这个情况就消失了。

同样,如果是堆空间不够用了,则相应的看看是否有申请的内存空间没有释放掉,比如说malloc了一块空间,在用完了后释放掉了,是否申请后一定会走到释放的地方去呢,中间有没有return等,或者干脆就没有释放等等,尤其是频繁申请内存的地方最容易出现堆溢出的情况。本来一个51的片子上内存空间就没有多大地方,因此在使用内存空间的时候一定要小心使用,局部变量定义的越少越好,能复用的尽量复用(切记不能复用的千万别这样整,使用了可能就影响到了其他的过程),申请的内存空间一定要释放掉,注意一定要走到释放的地方,写了释放过程没有走到也是徒然。

1 0