打印
[其他ST产品]

STM32局部变量的数组最大能到多少?

[复制链接]
487|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LLGTR|  楼主 | 2022-9-13 13:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当在一个函数中声明一个较大的局部数组变量时,程序可以编译通过,但运行时,老是进入hardfaulthandler,导致出现改问题的原因可能是栈溢出。因为局部变量是存放在栈区的,而全局变量在全局区(静态区),如果栈区较小,会产生溢出。
解决这种问题的方法:
方法1:启动文件里面对栈的大小有固定的值。函数里面的数组是在调用该函数的时候,才给你分配空间。将启动文件下的堆栈改大
Stack_Size      EQU     0x00000400  。

Stack Size,一般小工程0X400足够,大工程才设置0X1000就够用,所以默认无需设置太大。

方法2:用静态数组代替普通局部数组。
方法3:数组过大,栈溢出了,有可能覆盖了其他全局变量的值。如果使用很大的数组,可以定义成一个全局变量。如果使用的有os。就使用内存管理。



=================================================================================================

堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。{堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。}
栈是先进后出的,但是对于堆而言却没有这个特性,两者都是存放临时数据的地方。 对于堆,我们可以随心所欲的进行增加变量和删除变量,不要遵循什么次序,不管大小,只要你喜欢
*栈,用于存放局部变量,局部数组等
*堆,用于保存new 和malloc这些自定义的内存变量;
*全局静态区用于保存全局变量和静态变量;
*字符常量区,用于保存字符串;
*代码区,用于保存程序的二进制代码;

使用特权

评论回复
沙发
Bowclad| | 2022-9-13 19:51 | 只看该作者
经常用方法二

使用特权

评论回复
板凳
koala889| | 2022-9-13 20:26 | 只看该作者
这个值确实不会设置,都不知道大小怎么确定
每次都是瞎试,基本都用默认值

使用特权

评论回复
地板
Henryko| | 2022-9-13 20:43 | 只看该作者
嗯,一直默认值

使用特权

评论回复
5
LLGTR|  楼主 | 2022-9-15 13:10 | 只看该作者
koala889 发表于 2022-9-13 20:26
这个值确实不会设置,都不知道大小怎么确定
每次都是瞎试,基本都用默认值 ...

看MAP文件,大概就知道要设置成多少了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

65

主题

1615

帖子

2

粉丝