搜索
bottom↓
回复: 38

MCU的malloc用得不是很踏实,我的担心是不是多余?

[复制链接]

出45入88汤圆

发表于 2018-1-17 15:05:03 | 显示全部楼层 |阅读模式
我平时在未知道使用长度是多少的数组时喜欢用malloc和free来分配内存。但有个担心。万一运行时真是不够用怎么办?用定死了的方式好歹编译器会告诉你不够用。

出0入0汤圆

发表于 2018-1-17 15:10:02 来自手机 | 显示全部楼层
realloc才是真的不踏实。

出0入75汤圆

发表于 2018-1-17 15:12:26 | 显示全部楼层
malloc在申请不到足够内存的时候不是会返回NULL吗?

出0入0汤圆

发表于 2018-1-17 15:13:29 | 显示全部楼层
mcu 那点内存就不用动态分配了吧

出45入88汤圆

 楼主| 发表于 2018-1-17 15:14:01 | 显示全部楼层
Doding 发表于 2018-1-17 15:12
malloc在申请不到足够内存的时候不是会返回NULL吗?

但已经在运行了。此时功能已经不能正常使用了。

出45入88汤圆

 楼主| 发表于 2018-1-17 15:14:27 | 显示全部楼层
canopen 发表于 2018-1-17 15:13
mcu 那点内存就不用动态分配了吧

以16K为例。

出0入75汤圆

发表于 2018-1-17 15:16:23 | 显示全部楼层
Edesigner. 发表于 2018-1-17 15:14
但已经在运行了。此时功能已经不能正常使用了。

判断返回值,分配不成功减小申请,或者先释放不需要用的。

出0入0汤圆

发表于 2018-1-17 15:17:40 | 显示全部楼层

全是自己写的代码还好,小工程,自己控制好16k 没啥问题

移植个第三方协议栈就比较有风险了,一旦挂上第三方协议栈,一般会直接外扩sram,,,  2M的低延迟 sram 要60大洋一片,,, 坑爹

出0入0汤圆

发表于 2018-1-17 15:20:42 | 显示全部楼层
本帖最后由 passage110 于 2018-1-17 15:22 编辑

弱弱问下楼主什么功能要在MCU中用malloc
我公司的都习尽量惯静态分配,好多年前使用动态内存分配很多人不理解
好多年前用过一个开源的,效果还不错,用起来相对靠谱。
MCU编译器自带的那个应该是要设置较大的堆栈吧??

出45入88汤圆

 楼主| 发表于 2018-1-17 15:29:17 | 显示全部楼层
passage110 发表于 2018-1-17 15:20
弱弱问下楼主什么功能要在MCU中用malloc
我公司的都习尽量惯静态分配,好多年前使用动态内存分配很多人不理 ...

通信。。。。。

出0入362汤圆

发表于 2018-1-17 15:52:32 | 显示全部楼层
初始化过程可以考虑用malloc, 之后也不用free了
进入主循环以后再频繁malloc/free的话还有内存碎片的问题...

有个第三方的内存管理库, bget, 挺好用, lz可以试试.

出0入0汤圆

发表于 2018-1-17 15:55:39 | 显示全部楼层
考虑重入和线程安全,就没问题了

出0入0汤圆

发表于 2018-1-17 16:44:50 | 显示全部楼层
能不能分配的到,我觉得自己心里应该有数。
静态的能承受,完全没必要用动态的吧。

出0入0汤圆

发表于 2018-1-17 16:47:35 | 显示全部楼层
用什么malloc 自己做个内存池 自己管理啊。

出0入0汤圆

发表于 2018-1-17 16:50:42 来自手机 | 显示全部楼层
每次申请完要判断

出0入0汤圆

发表于 2018-1-17 16:57:41 | 显示全部楼层
你是对的。本来就不靠谱。高可靠性的mcu程序不能动态分配内容。

出45入88汤圆

 楼主| 发表于 2018-1-17 17:07:29 | 显示全部楼层
另外一个问题,KEIL编译器有个地方设置Heap_Size。如果分配了Heap_Size,那么静态变量和全局变量就不能分配这这里了。那么跟静态分配内存有什么区别?

出0入0汤圆

发表于 2018-1-17 17:15:48 来自手机 | 显示全部楼层
真需要内存动态分配,我都是用池分配,每个内存块一样大小,处理简单,高效,不怎么出错

出45入88汤圆

 楼主| 发表于 2018-1-17 17:19:13 | 显示全部楼层
xivisi 发表于 2018-1-17 17:15
真需要内存动态分配,我都是用池分配,每个内存块一样大小,处理简单,高效,不怎么出错 ...

有相关的资料不?

出0入0汤圆

发表于 2018-1-17 17:25:12 来自手机 | 显示全部楼层
Edesigner. 发表于 2018-1-17 17:19
有相关的资料不?

自己写的代码,用个链表就行了

出45入88汤圆

 楼主| 发表于 2018-1-17 17:31:20 | 显示全部楼层
有时候,写队列。各个元素长度相差比较大,如果把长度统一设定为最长那个,确实是浪费的。这时间用动态分配确实是省很多空间。

出0入0汤圆

发表于 2018-1-17 17:38:10 | 显示全部楼层
个人推荐11楼方式,方便模块化库

出0入0汤圆

发表于 2018-1-17 17:45:00 来自手机 | 显示全部楼层
Edesigner. 发表于 2018-1-17 17:31
有时候,写队列。各个元素长度相差比较大,如果把长度统一设定为最长那个,确实是浪费的。这时间用动态分配 ...

长的按长的分配,短的按短的分配

出0入22汤圆

发表于 2018-1-17 18:01:03 | 显示全部楼层
Edesigner. 发表于 2018-1-17 17:07
另外一个问题,KEIL编译器有个地方设置Heap_Size。如果分配了Heap_Size,那么静态变量和全局变量就不能分配 ...

静态分配你只能当做一个大数组用,用heap来malloc可以当做n个数组用
当然,你也可以用静态分配一个大数组,然后用多个指针当n个数组用,这个就是所谓的不用malloc,自己管理内存

出0入25汤圆

发表于 2018-1-17 18:05:36 | 显示全部楼层

MCU上还是用静态分配吧

FreeRTOS最新版本也加入静态分配了,,Task的栈全都静态分配

出0入22汤圆

发表于 2018-1-17 19:57:53 来自手机 | 显示全部楼层
tomzbj 发表于 2018-1-17 15:52
初始化过程可以考虑用malloc, 之后也不用free了
进入主循环以后再频繁malloc/free的话还有内存碎片的问题.. ...

lwip里面好像有很多申请释放内存的操作,也没有发现问题啊?

出40入42汤圆

发表于 2018-1-17 20:11:44 | 显示全部楼层
zxq6 发表于 2018-1-17 19:57
lwip里面好像有很多申请释放内存的操作,也没有发现问题啊?

记得lwip的是静态分配好的,动态分配的接口是自己实现的内存池管理

出0入0汤圆

发表于 2018-1-17 20:19:12 | 显示全部楼层
用malloc没问题,但需要保证在长时间运行的场景下,有机会全部Free内存,否则内存碎片导致内存不好分出来。

自己根据实际需求实现伙伴算法或者纯Partition的内存分配器更好一点。

出0入0汤圆

发表于 2018-1-17 20:24:02 | 显示全部楼层
动态分配内存,如果内存的申请量恰好触发内存分配部分的碎片化,那么基本上会一路恶化下去,长时间运行总会GG的

出45入88汤圆

 楼主| 发表于 2018-1-17 20:25:03 | 显示全部楼层
dr2001 发表于 2018-1-17 20:19
用malloc没问题,但需要保证在长时间运行的场景下,有机会全部Free内存,否则内存碎片导致内存不好分出来。 ...

队列清空时应该会全部FREE了

出0入0汤圆

发表于 2018-1-17 23:26:39 | 显示全部楼层
如果是51,那丁点内存还要分?指针以及内存链的数据结构都占了1半了.

出0入0汤圆

发表于 2018-1-17 23:36:29 来自手机 | 显示全部楼层
C语言编程安全规范,以及MISRA-C,禁止在MCU上使用动态分配。

出45入88汤圆

 楼主| 发表于 2018-1-18 08:09:37 | 显示全部楼层
sbusr 发表于 2018-1-17 23:36
C语言编程安全规范,以及MISRA-C,禁止在MCU上使用动态分配。


为什么编译器不直接禁止使用?默认让用户掉坑里

出0入0汤圆

发表于 2018-1-18 08:15:29 来自手机 | 显示全部楼层
Edesigner. 发表于 2018-1-18 08:09
为什么编译器不直接禁止使用?默认让用户掉坑里

因为这是C语言的标准,而C语言最初不是只为MCU使用而开发的,当年PC软件有很多用C的。

出0入0汤圆

发表于 2018-1-19 14:32:13 来自手机 | 显示全部楼层
心里没底是系统没设计好 理解了分配机制以后就没什么好担心的了

出0入0汤圆

发表于 2018-1-19 20:39:03 | 显示全部楼层
动态分配内存,某些场合非常好用,例如某些函数需要用到比较大的临时内存,比共用变量可读性强,分配灵活,也不需要考虑堆栈溢出,维护起来很方便。

出0入0汤圆

发表于 2018-1-19 20:41:57 | 显示全部楼层
locky_z 发表于 2018-1-17 23:26
如果是51,那丁点内存还要分?指针以及内存链的数据结构都占了1半了.

就像有人用51跑操作系统那样。 这些都是消耗资源的,不是穷光蛋所能承受的。

出45入88汤圆

 楼主| 发表于 2018-1-19 21:12:20 | 显示全部楼层
我是用16K RAM 256K FLASH 是 CORTEX M0

出0入0汤圆

发表于 2018-1-29 21:57:07 | 显示全部楼层
Edesigner. 发表于 2018-1-18 08:09
为什么编译器不直接禁止使用?默认让用户掉坑里

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

本版积分规则

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

GMT+8, 2024-4-20 08:00

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

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