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的片子上内存空间就没有多大地方,因此在使用内存空间的时候一定要小心使用,局部变量定义的越少越好,能复用的尽量复用(切记不能复用的千万别这样整,使用了可能就影响到了其他的过程),申请的内存空间一定要释放掉,注意一定要走到释放的地方,写了释放过程没有走到也是徒然。
- The stack `XdataStack`()is outside the stack range
- The stack pointer for stack 'IdataStack' (currently IData:0x6C) is outside
- the Stack
- Playing with the Stack
- Playing with the Stack
- Playing with the stack
- The Stack Data Structure
- The Full Stack
- The Linux Graphics Stack
- The using of stack
- The operate of stack
- The Twitter stack
- The Twitter stack
- The Linux Graphics Stack
- Installing the SciPy Stack
- Modifying the Navigation Stack
- 1002. The stack class
- Smashing The Stack
- movie
- 程序员面试题目总结--树(一)【重建二叉树、二叉树的深度、树的子结构、二叉树中和为某一值得路径、从上往下打印二叉树】
- Xshell自动断开连接解决办法
- Spring-SpringMVC-Mybatis整合
- emacs的org-mode模式的链接
- The stack `XdataStack`()is outside the stack range
- HDU 1856 More is better
- 插入排序(insert sort)
- HDU4035 Maze 概率DP+图
- 线段树zoj3635
- 数码视讯非研发类考题
- zoj 3818 2014牡丹江网赛
- HDU4706 根据题目读题写程序
- C#判断点在直线上的方法