OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7016|回复: 15

求教各位大佬,stm32运行一段时间后死机

[复制链接]

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-6-28
在线时间
22 小时
发表于 2021-6-24 19:22:33 | 显示全部楼层 |阅读模式
10金钱
我用库的malloc、free函数运行时间久了会出现死机,是不是内存溢出的原因啊?如果用原子哥的那个是不是不会存在这种情况啊?
哪位大佬赐教一下啊,困惑很久了?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2017-8-30
在线时间
141 小时
发表于 2021-6-24 22:34:29 | 显示全部楼层
若程序不复杂,建议尽量把所有变量都放到main里,其他子程序需要调用的话,用extern声明下,尽量减少程序调用的栈消耗,供参考。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2021-6-25 01:32:28 | 显示全部楼层
一般是没问题的,很可能是你使用的bug。我们的内存管理也很稳定的,没有问题。
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13100
金钱
13100
注册时间
2012-11-26
在线时间
3811 小时
发表于 2021-6-25 07:39:27 | 显示全部楼层
如果是有规律的,基本上是,你可以看下死机时间是不是基本固定的
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-6-28
在线时间
22 小时
 楼主| 发表于 2021-6-25 08:45:19 | 显示全部楼层
正点原子 发表于 2021-6-25 01:32
一般是没问题的,很可能是你使用的bug。我们的内存管理也很稳定的,没有问题。

我是用来接收串口信息的,接收一个malloc分配一个存储起来,用的时候再用free释放;跑了十来个小时应该就死机了?
不知道是不是时间久了内存碎片多了导致死机?
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-6-28
在线时间
22 小时
 楼主| 发表于 2021-6-25 08:45:52 | 显示全部楼层
jermy_z 发表于 2021-6-25 07:39
如果是有规律的,基本上是,你可以看下死机时间是不是基本固定的

基本十来个小时的样子,偶尔也会短一些
回复

使用道具 举报

9

主题

100

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2019-8-15
在线时间
425 小时
发表于 2021-6-25 09:46:24 | 显示全部楼层
据说,程序中反复malloc和free会造成内存碎片化,就是每次free,好像并不能真正free全部的内存,每次malloc和free都会造成一点额外碎片,后面好像就演变出内存池、和池式分配的概念了
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-6-28
在线时间
22 小时
 楼主| 发表于 2021-6-25 10:11:02 | 显示全部楼层
鲸鱼niko 发表于 2021-6-25 09:46
据说,程序中反复malloc和free会造成内存碎片化,就是每次free,好像并不能真正free全部的内存,每次malloc ...

哦哦,看来是真的有问题,那我还是不用链式队列了还是用顺序队列吧
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-6-28
在线时间
22 小时
 楼主| 发表于 2021-6-25 10:11:58 | 显示全部楼层
正点原子 发表于 2021-6-25 01:32
一般是没问题的,很可能是你使用的bug。我们的内存管理也很稳定的,没有问题。

关键是要运行一段时间才出错,不知道是不是内存碎片导致的内存溢出问题?
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-6-28
在线时间
22 小时
 楼主| 发表于 2021-6-25 10:13:11 | 显示全部楼层
jermy_z 发表于 2021-6-25 07:39
如果是有规律的,基本上是,你可以看下死机时间是不是基本固定的

是差不多,不过时间比较长可以跑快十个小时,所以没有准确过
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2021-6-25 10:14:52 | 显示全部楼层
应该是你程序上的BUG,malloc了以后发生某个中断或异常情况,程序没有区Free,然后又接着执行Malloc后,导致非法指针,程序自然挂掉了。你在每次malloc后,打印一个标记,每次Free后再打印一个标记,可以测试一下的。
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-6-28
在线时间
22 小时
 楼主| 发表于 2021-6-25 15:49:15 | 显示全部楼层
c2007s 发表于 2021-6-25 10:14
应该是你程序上的BUG,malloc了以后发生某个中断或异常情况,程序没有区Free,然后又接着执行Malloc后,导 ...

我是数据来了以后malloc进行存储,然后用了的数据取出free掉;之前测试free后打印消息是可以的;这个是时间久了会出现死机
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2021-6-25 16:36:48 | 显示全部楼层
lrchyh 发表于 2021-6-25 15:49
我是数据来了以后malloc进行存储,然后用了的数据取出free掉;之前测试free后打印消息是可以的;这个是时 ...

意思是你printf测试一下每次分配和释放是否都正常,看看死机前它在执行什么操作。
回复

使用道具 举报

0

主题

11

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2020-10-22
在线时间
16 小时
发表于 2021-6-25 16:52:41 | 显示全部楼层
建议静态分配,动态分配一般即用即释放。

不要盲目信任自己的内存分配能力,以前有被坑过,哈哈
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-6-28
在线时间
22 小时
 楼主| 发表于 2021-6-28 09:20:49 | 显示全部楼层
ysy999666 发表于 2021-6-25 16:52
建议静态分配,动态分配一般即用即释放。

不要盲目信任自己的内存分配能力,以前有被坑过,哈哈

只能这样了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2021-6-29 00:38:06 | 显示全部楼层
鲸鱼niko 发表于 2021-6-25 09:46
据说,程序中反复malloc和free会造成内存碎片化,就是每次free,好像并不能真正free全部的内存,每次malloc ...

碎片化是肯定的,但是正常使用,一般不会导致碎的那么彻底,导致你分配不到内存。
一般十有八九是使用方法的问题,比如内存溢出,申请了忘了释放之类的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 02:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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