打印

MSP432 malloc分配不了内存

[复制链接]
2451|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
项目大概是用MSP432通过UA2串口输出数据,想输出几M的图片,我用的DMA串口发送。我看现在一般是一次最大1024字节,所以想的分多包发送。先想试一试,一次发10K,发个10次,看能不能发出去。数据的形式用的CJSON,问题就出现在CJSON里面的malloc上。发的时候,开始第一包和第二包都没有问题,但是第三包就发不出去了,我一查,CJSON里面不是有malloc申请内存吗,返回是0。然后接着查的RAM,堆根本就没满,比如下面这个动态堆从0x20001810开始的,我第一个包和第二包动态申请内存之后返回的值就在0x20001880左右。内存申请失败主要有RAM不够和内存碎片原因,第一个RAM不够,我这才是堆的开头,肯定不存在堆满了的情况;那有可能就是内存碎片了,但是我看我后面还有大片大片的空间没有使用,这难道也是内存碎片了吗?不是太懂,希望有朋友能出来看看~谢谢~PS:第一个图是RAM堆地址,第一包和第二包动态分配的首地址大概就在我划红线的地方;第二个图是栈的地址,当时也没有满;第三个图就是malloc返回失败的地方,给buffer申请的地址,前两次申请成功的时候就是第一个图我标红的附近,但是第三次突然就返回0了。
我看后面还有那么大片RAM,不像是内存不够和内存碎片啊,难道还要用个内存池?

11.png (887.15 KB )

11.png

22.png (361.24 KB )

22.png

33.png (357.77 KB )

33.png

相关帖子

沙发
dirtwillfly| | 2017-5-19 16:08 | 只看该作者
10K对mcu是个很大的存储空间了。
malloc申请的内存用完及时释放啊

使用特权

评论回复
板凳
dirtwillfly| | 2017-5-19 16:09 | 只看该作者
另外,你的工程优化选项是怎么设置的?

使用特权

评论回复
地板
ccczzzyyy|  楼主 | 2017-5-19 23:42 | 只看该作者
dirtwillfly 发表于 2017-5-19 16:08
10K对mcu是个很大的存储空间了。
malloc申请的内存用完及时释放啊

额,发10次嘛,而且我现在还没有用10k的数据往里写,一次最多就300个字节左右吧,然后就发不了。您这说的“是很大的存储空间”是什么意思呢?是指栈不够还是堆不够呢?我发送是for循环嘛,栈基本不会增加太多;CJSON是在GitHub上找的程序,比较严密,每次申请了都会释放的。

使用特权

评论回复
5
ccczzzyyy|  楼主 | 2017-5-19 23:43 | 只看该作者
dirtwillfly 发表于 2017-5-19 16:09
另外,你的工程优化选项是怎么设置的?

额,您说的这个工程优化选项是?我还没怎么配置过,就是在ccs里写的程序然后直接运行的。是运行前在IDE里面的设置吗?

使用特权

评论回复
6
dirtwillfly| | 2017-5-20 08:16 | 只看该作者
ccczzzyyy 发表于 2017-5-19 23:42
额,发10次嘛,而且我现在还没有用10k的数据往里写,一次最多就300个字节左右吧,然后就发不了。您这说的 ...

malloc申请的存储空间,不使用也是占用了的。

使用特权

评论回复
7
angerbird| | 2017-5-20 23:30 | 只看该作者
不是很明白这个函数是作何用的

使用特权

评论回复
8
ccczzzyyy|  楼主 | 2017-5-22 13:24 | 只看该作者
dirtwillfly 发表于 2017-5-20 08:16
malloc申请的存储空间,不使用也是占用了的。

这个我知道,但是现在是malloc申请都申请不出来,更谈不上占用了吧?

使用特权

评论回复
9
ccczzzyyy|  楼主 | 2017-5-22 13:24 | 只看该作者
angerbird 发表于 2017-5-20 23:30
不是很明白这个函数是作何用的

malloc这个函数吗?还是CJSON这个函数?

使用特权

评论回复
10
ccczzzyyy|  楼主 | 2017-5-22 13:27 | 只看该作者
我没用CJSON这种形式了。开始师兄说用CJSON的形式,可能是他们高级语言用多了习惯了,我也找了个CJSON的库来用。但是后来一直出不来,问了另一个用c的师兄,他说可以自己写,实现格式的问题。然后我自己写就没用malloc这个函数,实现功能了。但是就是不是很明白原来我的malloc为什么会申请不出来内存,感觉堆还有很多,这个地方比较困惑,不知道有没有大神可以解释下~

使用特权

评论回复
11
smilingangel| | 2017-5-22 21:50 | 只看该作者
这个是MCU的硬件资源制约了malloc的使用?

使用特权

评论回复
12
baimiaocun2015| | 2017-5-22 22:40 | 只看该作者
这个大部分就是硬件的内存资源不够分配了

使用特权

评论回复
13
ccczzzyyy|  楼主 | 2017-5-23 09:17 | 只看该作者
smilingangel 发表于 2017-5-22 21:50
这个是MCU的硬件资源制约了malloc的使用?

你这么说好像有点道理,但是总感觉不能这么少吧,256个字节都不行了?还是要用内存池,内存管理程序?

使用特权

评论回复
14
ccczzzyyy|  楼主 | 2017-5-23 15:24 | 只看该作者
baimiaocun2015 发表于 2017-5-22 22:40
这个大部分就是硬件的内存资源不够分配了

看起来是了,但是我看堆的位置应该才刚起步啊,这就不够用了,这个也有点不正常啊。

使用特权

评论回复
15
Prry| | 2017-5-23 23:21 | 只看该作者
将启动文件的堆栈大小设置大一些!stm32的是.s文件。

使用特权

评论回复
16
Prry| | 2017-5-23 23:31 | 只看该作者
准确来说是堆,C语言内存分配的问题,如stm32默认堆大小为512字节(Heap_Size   EQU   0x00000200),当然不用手动分配内存直接把堆设为0,单片机内存一个字节都是金贵呀。

使用特权

评论回复
评分
参与人数 2威望 +8 收起 理由
dirtwillfly + 6 很给力!
ccczzzyyy + 2 很给力!
17
chuntian2016| | 2017-5-24 20:14 | 只看该作者
这返回0的是何缘故的?

使用特权

评论回复
18
chuntian2016| | 2017-5-24 20:15 | 只看该作者
申请的内存没有被正确分配?

使用特权

评论回复
19
vibra2016| | 2017-5-24 20:37 | 只看该作者
这个是不是还跟MCU的硬件资源相关西的

使用特权

评论回复
20
ccczzzyyy|  楼主 | 2017-5-25 11:44 | 只看该作者
Prry 发表于 2017-5-23 23:31
准确来说是堆,C语言内存分配的问题,如stm32默认堆大小为512字节(Heap_Size   EQU   0x00000200),当然 ...

解决了,malloc申请的大小是之前自己可以设定的,之前设定的太小,就不能分配了。不是所有的堆都可以用来malloc的

使用特权

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

本版积分规则

10

主题

87

帖子

0

粉丝