搜索
bottom↓
回复: 20

STM32运行需不需要额外的RAM

[复制链接]

出0入0汤圆

发表于 2017-10-17 14:36:02 | 显示全部楼层 |阅读模式
如题,一个程序,没有动态分配内存等操作,但是函数的堆栈什么的肯定有。
现在问题是,如果芯片有64K RAM,编译时显示用了60K,那么运行时,有时会死机。。留多一点RAM,例如10K,就没事。
那么,怎么确定它到底需要多少RAM,或者,是程序的BUG引起的死机呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入442汤圆

发表于 2017-10-17 14:47:34 来自手机 | 显示全部楼层
死机你肯定是栈或ram用爆了。优化代码吧,开os,总能降下来。要不然就少声明ram,多用全局变量,不要递归。

出0入0汤圆

发表于 2017-10-17 14:48:23 | 显示全部楼层
换芯片,高规格ram的是首选

出0入8汤圆

发表于 2017-10-17 14:53:30 | 显示全部楼层
啦啦啦啦。。这个问题比较复杂。也期待有某种分析软件能分析出来峰值时需要的大的栈 。

出0入0汤圆

 楼主| 发表于 2017-10-17 14:53:37 | 显示全部楼层
谢谢楼上两位回复,换成ATMEL的了。。。

出0入0汤圆

发表于 2017-10-17 15:30:32 | 显示全部楼层
除了动态分配(动态分配是可控的)最大嵌套深度是可计算的,另外在还有富余情况下,优化局部转为全局,也可减少栈风险。

出0入0汤圆

发表于 2017-10-17 15:34:14 | 显示全部楼层
tongdayusu 发表于 2017-10-17 14:53
啦啦啦啦。。这个问题比较复杂。也期待有某种分析软件能分析出来峰值时需要的大的栈 。 ...

简单办法:把栈区间初值设一下。

出0入8汤圆

发表于 2017-10-17 16:18:00 | 显示全部楼层
styleno1 发表于 2017-10-17 15:34
简单办法:把栈区间初值设一下。

求教 :除了类似这个以外,还有其他的设置么?
Stack_Size      EQU     0x2000;
;1F00
;Stack_Size      EQU     0x400;
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size

出100入101汤圆

发表于 2017-10-17 16:24:30 | 显示全部楼层
软件BUG的可能性大。没有动态分配内存,一般来说就只用到了stack,stack的大小编译时就确定了。

出200入2554汤圆

发表于 2017-10-17 16:35:17 | 显示全部楼层
直接回复 LZ 的问题,用类似堆栈检查的办法进行测试,思路如下:

预留足够的 RAM 使程序不跑飞,未使用的位置填充特殊字符(例如0xAA)。
一段时间(程序各种分支尽量都走一走)后,查看没有被更改的位置。

ICCAVR 里边有个 _StackCheck() 函数就是这个原理,检测位于堆栈边缘的特定字符是否被更改。


出0入0汤圆

发表于 2017-10-17 16:42:39 | 显示全部楼层
栈运行中实际用量未知   貌似调试能设访问某地址的断点, 看看爆栈。

出0入31汤圆

发表于 2017-10-17 17:18:37 来自手机 | 显示全部楼层
把栈里塞满特殊字符,运行一圈下来,大致能够看到用了多少

出0入0汤圆

 楼主| 发表于 2017-10-17 17:20:57 | 显示全部楼层
t3486784401 发表于 2017-10-17 16:35
直接回复 LZ 的问题,用类似堆栈检查的办法进行测试,思路如下:

预留足够的 RAM 使程序不跑飞,未使用的 ...

这个思路很好,确实是堆栈溢出问题引起的。

出0入0汤圆

发表于 2017-10-17 17:37:53 来自手机 | 显示全部楼层
最好是不留RAM,全部用完,因为栈大小也是算在已使用的RAM里的

出0入0汤圆

 楼主| 发表于 2017-10-17 17:45:01 | 显示全部楼层
jianfengxixi 发表于 2017-10-17 17:37
最好是不留RAM,全部用完,因为栈大小也是算在已使用的RAM里的

不是的,在一些递归或嵌套的函数里,编译器是不会知道它到底需要多少栈空间来存放的。所以我才会问这样的问题。

出0入112汤圆

发表于 2017-10-17 18:02:03 | 显示全部楼层
CoolBird007 发表于 2017-10-17 14:53
谢谢楼上两位回复,换成ATMEL的了。。。

ATMEL那种芯片?性价比怎样?

出0入0汤圆

 楼主| 发表于 2017-10-17 19:47:26 | 显示全部楼层
xunke 发表于 2017-10-17 18:02
ATMEL那种芯片?性价比怎样?

SAM3X8,不是为了解决这个问题。只是刚好有这片子就用上了。天知道还能不能买到。

出0入0汤圆

发表于 2017-10-17 23:36:55 来自手机 | 显示全部楼层
希望这个可以帮到你 http://dlbeer.co.nz/oss/avstack.html

出0入0汤圆

发表于 2017-10-18 15:06:47 | 显示全部楼层
tongdayusu 发表于 2017-10-17 16:18
求教 :除了类似这个以外,还有其他的设置么?
Stack_Size      EQU     0x2000;
;1F00

我的意思同12楼,初始化整个区域。

出0入0汤圆

发表于 2017-10-20 12:17:40 | 显示全部楼层
我们是这样处理的,把某个大块全局内存时分复用给其它代码。当然必须保证内存的使用不冲突。我们是采用内存池的方式来用的

出0入8汤圆

发表于 2017-10-20 13:12:22 来自手机 | 显示全部楼层
styleno1 发表于 2017-10-17 15:34
简单办法:把栈区间初值设一下。

不用设的  默认一般是0   看站空间的内存范围内   有都是非0的   就溢出了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 02:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表