搜索
bottom↓
回复: 27

大家怎么malloc数据?自己写malloc,还是库的?

[复制链接]

出0入4汤圆

发表于 2021-11-9 11:09:07 | 显示全部楼层 |阅读模式
如题,一些国际认证上(如某V)单片机不让用IAR 自带的malloc,必须自己写,要么经过认证的(使用第三方要花钱)。

抛开认证和OS自带的malloc,大家的malloc是从哪里调用的? 自己写、第三方、编译器自带?

之前都是自己写,不会频繁malloc、free,内存体量上能控制住内存的调用度,也没出过问题,但是用上NET、文件系统、GUI三者后,频繁申请、释放不定大小的空间,怕出事。
所以咨询下大伙。



想用编译器自带的(小规模程序),大家用的感觉怎么样, 有坑没?
大伙有推荐的malloc没?

出0入0汤圆

发表于 2021-11-9 11:14:15 | 显示全部楼层
除了用标准库的 malloc, 还可以用 RTOS 的 heap 管理呀
一般比自己写靠谱多了吧

出0入4汤圆

 楼主| 发表于 2021-11-9 11:18:11 | 显示全部楼层
wudicgi 发表于 2021-11-9 11:14
除了用标准库的 malloc, 还可以用 RTOS 的 heap 管理呀
一般比自己写靠谱多了吧
...

是的。
非OS下的malloc,您一般用哪种?

出0入0汤圆

发表于 2021-11-9 12:31:13 | 显示全部楼层
SCREA 发表于 2021-11-9 11:18
是的。
非OS下的malloc,您一般用哪种?

自己移植一个系统的,比如FREERTOS

出0入325汤圆

发表于 2021-11-9 13:08:35 来自手机 | 显示全部楼层
为什么不能用标准库的malloc?

出0入4汤圆

 楼主| 发表于 2021-11-9 14:43:47 | 显示全部楼层
wye11083 发表于 2021-11-9 13:08
为什么不能用标准库的malloc?

之前一直被教导编译器的mallloc 容易碎片化,所以一直没用过。
您什么单片机用过编译器的malloc?

出0入0汤圆

发表于 2021-11-9 14:55:03 | 显示全部楼层
嵌入式从不用malloc的飘过

出130入20汤圆

发表于 2021-11-9 15:05:51 | 显示全部楼层
我也几乎不用malloc

出0入137汤圆

发表于 2021-11-9 15:23:39 | 显示全部楼层
尽量不用... 有个bget不错, github上有.

出415入1068汤圆

发表于 2021-11-9 15:33:04 | 显示全部楼层
SCREA 发表于 2021-11-9 14:43
之前一直被教导编译器的mallloc 容易碎片化,所以一直没用过。
您什么单片机用过编译器的malloc? ...

不用 malloc +1,非用不可就上 linux 了

除了碎片化問題,實時任務也絕對不允許使用 malloc

出0入4汤圆

发表于 2021-11-9 16:05:03 | 显示全部楼层
我们用freeRTOS里的heap_4.c, 暂时没有发现问题

出0入4汤圆

 楼主| 发表于 2021-11-9 16:19:12 | 显示全部楼层
tomzbj 发表于 2021-11-9 15:23
尽量不用... 有个bget不错, github上有.

谢谢了,试试

出0入4汤圆

 楼主| 发表于 2021-11-9 16:19:40 | 显示全部楼层
qinxg 发表于 2021-11-9 16:05
我们用freeRTOS里的heap_4.c, 暂时没有发现问题

好主意,这个是与OS没有耦合,直接独立的?

出0入4汤圆

 楼主| 发表于 2021-11-9 16:21:14 | 显示全部楼层
dukelec 发表于 2021-11-9 15:33
不用 malloc +1,非用不可就上 linux 了

除了碎片化問題,實時任務也絕對不允許使用 malloc ...

您是不是遇到过坑点,能说下让大伙高兴高兴?

出0入0汤圆

发表于 2021-11-9 16:47:57 | 显示全部楼层
正点原子的MALLOC

出415入1068汤圆

发表于 2021-11-9 16:58:19 | 显示全部楼层
本帖最后由 dukelec 于 2021-11-9 17:18 编辑
SCREA 发表于 2021-11-9 16:21
您是不是遇到过坑点,能说下让大伙高兴高兴?


沒有啊

實時任務不允許使用 malloc 算是我的常識吧,即便是在實時 RT Preempt Linux 的用戶空間的實時任務,都不允許使用 malloc 的啊
對於很簡單的 mcu,沒有虛擬內存什麼的,理論上倒是可以用,只要確保有足夠的完整的剩餘內存就行
但是保證沒有碎片這一點本身就很困難

對於 mcu,本來 ram 就小,heap 的靜態數據和 stack 的動態數據把 ram 幾乎佔完了,heap 和 stack 之間還要留足夠的安全空間,沒空間給 malloc 做內存池了

一些需要 malloc 的場景,我會儘量用 鏈表 來代替,不擔心碎片化,同時也可以用於實時任務
即便發生忘記 free 的 bug,鏈表也比 malloc 更容易排錯

很複雜的需求,網絡、GUI 之類的,本來就是上 linux 更方便啊,很多用公司曾經用 MCU、小系統的項目,很早就開始轉用 linux 了,轉用的人越來越多
我和 cpu 原廠的人比較熟,所以比較清楚行業的這一轉變

出0入4汤圆

 楼主| 发表于 2021-11-9 17:58:30 | 显示全部楼层
dukelec 发表于 2021-11-9 16:58
沒有啊

實時任務不允許使用 malloc 算是我的常識吧,即便是在實時 RT Preempt Linux 的用戶空間的實時任 ...

嗯。您说的有道理

出870入263汤圆

发表于 2021-11-16 09:48:50 | 显示全部楼层
我正在遭受此问题的折磨!设备正常工作了60多天,最近发现网络不通了,只要小于300字节的包还能正常首发,太大包就不能接收了;其它无需内存申请的代码工作依旧正常。
真的很头疼,ESP-IDF是厂家提供的开发包,自己没法该malloc这种底层设施,真是纠结!

出870入263汤圆

发表于 2021-11-16 09:51:40 | 显示全部楼层
MCU项目,最好别用malloc,真的。内存碎片化是迟早的事,时间问题而已。网络设备通常需要全年无休的工作,不允许我过一阵子重启一下来解决,真是头疼。

出0入91汤圆

发表于 2021-11-16 09:54:19 | 显示全部楼层
本帖最后由 ackyee 于 2021-11-16 09:55 编辑

MCU就别用这个了,   数组,字符串这些都是按首个地址位置计算的, 你内存分的支离破碎了,代码用到后期也问题多多

宁可花费更多的内存空间  也要保障系统的稳定性,系统允许条件下  哪怕都定义成全局变量也不过


至于UI调度 一般开源UI 都已经写好了 底层  就不去调整了

出0入4汤圆

发表于 2021-11-16 09:58:28 | 显示全部楼层
从来没用过malloc,需要较大空间的时候,直接用数组解决.

出0入4汤圆

 楼主| 发表于 2021-11-16 11:25:32 | 显示全部楼层
本帖最后由 SCREA 于 2021-11-16 11:28 编辑
armstrong 发表于 2021-11-16 09:51
MCU项目,最好别用malloc,真的。内存碎片化是迟早的事,时间问题而已。网络设备通常需要全年无休的工作, ...


您用的哪种malloc,是否支持碎片整理?
FreeRTOS 下面有个heap_4.c\heao_5.c, 这个在申请或释放得时候会进行相邻块合并。

您说的非常有理,一般单片机的任务是固定的,所以任务中的内存地址和大小,基本都是固定的。
但接入网络、频繁写FATFS,一些第三方库会用malloc,不得以被动引入了风险。

出870入263汤圆

发表于 2021-11-16 13:41:42 | 显示全部楼层
SCREA 发表于 2021-11-16 11:25
您用的哪种malloc,是否支持碎片整理?
FreeRTOS 下面有个heap_4.c\heao_5.c, 这个在申请或释放得时候会 ...

我用的是esp-idf gcc 自带的,应该是newlib内置的malloc。事实上,IAR的malloc也好不到哪里去,我的设备好几个版本,IAR环境开发的也这样。

出0入4汤圆

 楼主| 发表于 2021-11-16 13:57:29 | 显示全部楼层
armstrong 发表于 2021-11-16 13:41
我用的是esp-idf gcc 自带的,应该是newlib内置的malloc。事实上,IAR的malloc也好不到哪里去,我的设备 ...


esp idf 那个是freertos系统。 内涵heap_x.

IAR malloc 8之前的版本( 8之后的不知道)貌似不会合并相邻块的。

出0入4汤圆

 楼主| 发表于 2021-11-16 14:00:15 | 显示全部楼层
本帖最后由 SCREA 于 2021-11-16 17:19 编辑
ackyee 发表于 2021-11-16 09:54
MCU就别用这个了,   数组,字符串这些都是按首个地址位置计算的, 你内存分的支离破碎了,代码用到后期也 ...


嗯。 这玩意感觉就像潘多拉魔盒

出0入0汤圆

发表于 2021-11-16 15:54:03 | 显示全部楼层
上个freertos好了。。。

出870入263汤圆

发表于 2021-11-17 13:38:49 | 显示全部楼层
SCREA 发表于 2021-11-16 13:57
esp idf 那个是freertos系统。 内涵heap_x.

IAR malloc 8之前的版本( 8之后的不知道)貌似不会合并相邻 ...

free时,相邻碎片合并是大多数malloc算法都有的功能;但这不足以让碎片消失。
长期运行的设备,内存中就存在许多小内存块正在使用,这些小内存块长期得不到释放就把连续内存分割成一些片段了,从而导致申请不到大块内存。

出0入198汤圆

发表于 2021-11-17 16:23:52 来自手机 | 显示全部楼层
armstrong 发表于 2021-11-17 13:38
free时,相邻碎片合并是大多数malloc算法都有的功能;但这不足以让碎片消失。
长期运行的设备,内存中就 ...

有专门的低碎片malloc,还有就是你预留的空闲内存要多一点。这样就没事。
简单一点的实现,可以给网卡一些定长的缓存,1.5k一个,固定给若干个,不分割也不合并,万一网络流量超大,用光就没了,直接丢包。这些缓存别处也不允许用。这样就没事了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2023-2-8 03:05

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

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