[求助] CCS 4.1.2 关于堆栈的使用

15951757556   2016-3-16 16:15 楼主
CCS4.1.2 一个237K大小的工程,烧写到FLASH后程序一直跑飞,怀疑是堆栈溢出,于是我将默认的0x400增大为0x3000,debug后查看.map文件,发现堆栈已使用0x3000,请问这种情况是“堆栈溢出”么,如果是,通常是由于什么原因造成的?

回复评论 (11)

堆是堆,栈是栈,具体描述要分开説。
栈溢出,通常是局部变量过多,函数调用嵌套过深导致。例如在函数里面申请过大的数组,或者递归调用等等,会导致栈溢出。
点赞  2016-3-16 17:00
什么程序会用0X3000那么大的堆栈呢? 唾弃跑飞有多方面的原因,除程序问题外,外部干扰也会的。C2000在象电源方面的应用,调试时跑飞是正常现象。 本帖最后由 dontium 于 2016-3-16 17:55 编辑
点赞  2016-3-16 17:44
堆栈在子程序调用时使用,一般使用LCR,它也仅用两个字节,子程序内有临时变量时再用2~4个字节,算下来也不会用多少堆栈的。
点赞  2016-3-16 18:02
引用: lcofjp 发表于 2016-3-16 17:00
堆是堆,栈是栈,具体描述要分开説。
栈溢出,通常是局部变量过多,函数调用嵌套过深导致。例如在函数里面 ...

定义的局部变量时蛮多的,但是函数嵌套没有的啊,也没定义数组!而且我也想不明白,再大也不至于用了0x3000这么大的堆栈吧
点赞  2016-3-16 20:16
引用: dontium 发表于 2016-3-16 17:44
什么程序会用0X3000那么大的堆栈呢?
唾弃跑飞有多方面的原因,除程序问题外,外部干扰也会的。C2000在象 ...

嗯,我刚开始也以为是电源之类的硬件问题影响的,所以用了一个较小的程序进行试验,发现烧写后能成功运行的,请问这种可能是什么原因?
点赞  2016-3-16 20:17
引用: dontium 发表于 2016-3-16 18:02
堆栈在子程序调用时使用,一般使用LCR,它也仅用两个字节,子程序内有临时变量时再用2~4个字节,算下来也不 ...

嗯,那请问是不是会有一些程序的错误会造成堆栈的溢出?
点赞  2016-3-16 20:19
引用: 15951757556 发表于 2016-3-16 20:16
定义的局部变量时蛮多的,但是函数嵌套没有的啊,也没定义数组!而且我也想不明白,再大也不至于用了0x30 ...

你是设置了那么大,所以占用了那么多空间。
实际使用多少编译器并不能准确推断。
点赞  2016-3-17 10:04
引用: 15951757556 发表于 2016-3-16 20:19
嗯,那请问是不是会有一些程序的错误会造成堆栈的溢出?

堆栈溢出好象有提示的,----  我忘了。

你都设置了那么大的堆栈还出现错误,为什么还要怀疑是堆栈溢出呢?
点赞  2016-3-17 10:31
引用: dontium 发表于 2016-3-17 10:31
堆栈溢出好象有提示的,----  我忘了。

你都设置了那么大的堆栈还出现错误,为什么还要怀疑是堆栈溢出 ...

因为我通过.map文件查看堆栈使用情况,发现定义了3000大小的堆栈全部用完了,所以我怀疑是堆栈溢出
点赞  2016-3-22 14:53
引用: lcofjp 发表于 2016-3-17 10:04
你是设置了那么大,所以占用了那么多空间。
实际使用多少编译器并不能准确推断。

我刚开始也是这么觉得的,但是我查看我小程序的map文件,发现定义的400大小的堆栈,只使用了380
点赞  2016-3-22 14:55
我正在写一个程序,有很大的局部变量数据和很多函数嵌套调用(我觉得很大很多),然后程序会在某一行以上正常运行,这一行一下就胡乱运行,。我也觉得可能是栈的溢出的问题。。。。。。。但是,我观察map文件,仅仅看到的我栈空间设置的大小,没有看到使用的栈的大小(我都不知道还能看,栈的使用的空间大小。。。。。。。)。。。。。。后来我把栈大小调成了64M,然后就完全好了。。。。。。。。。。。。。。。。。。。。。。。。。
点赞  2017-7-16 10:17
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复