[牛人杂谈]

动态分配内存问题

[复制链接]
688|9
手机看帖
扫描二维码
随时随地手机跟帖
jcky001|  楼主 | 2021-12-7 11:31 | 显示全部楼层 |阅读模式
我在用NUC122,发现malloc函数无法正常使用,所有变量和数组都定义成静态的就太浪费资源了。希望在这里找到解决方法。

使用特权

评论回复
cr315| | 2021-12-7 11:31 | 显示全部楼层
在keil 中使用malloc()函数经常会遇到不正常的情况,通常表现为不能正确分配内存空间,或者只能分配很小的空间。
出现这个问题的原因大概有三个:
1、所用的ARM芯片本身内存已经被其代码占用,所余空间不够malloc分配。
解决办法:A、释放其他代码浪费的RAM空间;B、扩容。
2、未进行堆的初始化:在KEIL中使用时,必需要对heap进行初始化,否则不能正常使用malloc。
解决办法:A、使用KEIL自带的启动代码,该汇编启动代码本身已经完成了对heap的初始化;(我们通常建立的工程都是使用KEIL自带的启动代码,或者在该基础上修改的代码,所以这个问题基本上不用考虑)
B、自己编写heap初始化汇编代码,该初始化代码必须放在调用C代码之前,最好放在启动代码中。
3、堆空间太小。
解决办法:在堆初始化代码中,将堆大小增加,一般0x400大小足够,如果不够的话,可根据实际调试情况进行增加。




另外,变量是不是定义成静态看实际需要。democode只验证某一功能,资源足够。如果做完整方案的时候是要考虑变量类型。

使用特权

评论回复
jasontu| | 2021-12-8 08:29 | 显示全部楼层
如果要用malloc及free函式,建议参考freertos下面的**体管理函式, 由代码管理stack分配。

用keil内建比较难debug heap区.

使用特权

评论回复
daichaodai| | 2021-12-8 08:39 | 显示全部楼层
MCU应用程序还是少用

使用特权

评论回复
aple0807| | 2021-12-8 10:48 | 显示全部楼层
启动文件里的heap配置多少?malloc申请内存就是在heap里分配的,heap小了自然申请失败。

使用特权

评论回复
ufbycd| | 2021-12-8 11:04 | 显示全部楼层
本帖最后由 ufbycd 于 2021-12-8 11:06 编辑

malloc用得多芯片运行得久了会有内存碎片问题从而可能导致系统死机,不要怕资源浪费,在裸机应用上能不用malloc就不要用。
或者只malloc不free,但这其实跟static分配没区别了。

使用特权

评论回复
sadicy| | 2021-12-8 15:41 | 显示全部楼层
ufbycd 发表于 2021-12-8 11:04
malloc用得多芯片运行得久了会有内存碎片问题从而可能导致系统死机,不要怕资源浪费,在裸机应用上能不用ma ...

就是malloc之后,要FREE一下是吧,
这个没怎么用过

使用特权

评论回复
ufbycd| | 2021-12-8 18:24 | 显示全部楼层
sadicy 发表于 2021-12-8 15:41
就是malloc之后,要FREE一下是吧,
这个没怎么用过

频繁malloc、free,如果内存管理算法不好会出现较多的内存碎片从而导致系统死机。

使用特权

评论回复
linred| | 2021-12-9 10:09 | 显示全部楼层
单片机裸机不建议用malloc,除非带系统的

使用特权

评论回复
sadicy| | 2021-12-9 11:05 | 显示全部楼层
ufbycd 发表于 2021-12-8 18:24
频繁malloc、free,如果内存管理算法不好会出现较多的内存碎片从而导致系统死机。 ...

恩,当初学C++的时候,确实说过这个
后来写嵌入式,没怎么用过这里了,也忘的差不多了

使用特权

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

本版积分规则

1407

主题

3754

帖子

5

粉丝