SCREA 发表于 2021-11-9 11:09:07

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

如题,一些国际认证上(如某V)单片机不让用IAR 自带的malloc,必须自己写,要么经过认证的(使用第三方要花钱)。

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

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



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

wudicgi 发表于 2021-11-9 11:14:15

除了用标准库的 malloc, 还可以用 RTOS 的 heap 管理呀
一般比自己写靠谱多了吧

SCREA 发表于 2021-11-9 11:18:11

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

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

cdyy777 发表于 2021-11-9 12:31:13

SCREA 发表于 2021-11-9 11:18
是的。
非OS下的malloc,您一般用哪种?

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

wye11083 发表于 2021-11-9 13:08:35

为什么不能用标准库的malloc?

SCREA 发表于 2021-11-9 14:43:47

wye11083 发表于 2021-11-9 13:08
为什么不能用标准库的malloc?

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

tangnyzl 发表于 2021-11-9 14:55:03

嵌入式从不用malloc的飘过

shuiluo2 发表于 2021-11-9 15:05:51

我也几乎不用malloc

tomzbj 发表于 2021-11-9 15:23:39

尽量不用... 有个bget不错, github上有.

dukelec 发表于 2021-11-9 15:33:04

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

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

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

qinxg 发表于 2021-11-9 16:05:03

我们用freeRTOS里的heap_4.c, 暂时没有发现问题

SCREA 发表于 2021-11-9 16:19:12

tomzbj 发表于 2021-11-9 15:23
尽量不用... 有个bget不错, github上有.

谢谢了,试试

SCREA 发表于 2021-11-9 16:19:40

qinxg 发表于 2021-11-9 16:05
我们用freeRTOS里的heap_4.c, 暂时没有发现问题

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

SCREA 发表于 2021-11-9 16:21:14

dukelec 发表于 2021-11-9 15:33
不用 malloc +1,非用不可就上 linux 了

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

您是不是遇到过坑点,能说下让大伙高兴高兴?{:2_31:}

stm32_bldc 发表于 2021-11-9 16:47:57

正点原子的MALLOC

dukelec 发表于 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 原廠的人比較熟,所以比較清楚行業的這一轉變

SCREA 发表于 2021-11-9 17:58:30

dukelec 发表于 2021-11-9 16:58
沒有啊

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

嗯。您说的有道理{:handshake:}

armstrong 发表于 2021-11-16 09:48:50

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

armstrong 发表于 2021-11-16 09:51:40

MCU项目,最好别用malloc,真的。内存碎片化是迟早的事,时间问题而已。网络设备通常需要全年无休的工作,不允许我过一阵子重启一下来解决,真是头疼。

ackyee 发表于 2021-11-16 09:54:19

本帖最后由 ackyee 于 2021-11-16 09:55 编辑

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

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


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

yunqing_abc 发表于 2021-11-16 09:58:28

从来没用过malloc,需要较大空间的时候,直接用数组解决.

SCREA 发表于 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,不得以被动引入了风险。

armstrong 发表于 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环境开发的也这样。

SCREA 发表于 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之后的不知道)貌似不会合并相邻块的。

SCREA 发表于 2021-11-16 14:00:15

本帖最后由 SCREA 于 2021-11-16 17:19 编辑

ackyee 发表于 2021-11-16 09:54
MCU就别用这个了,   数组,字符串这些都是按首个地址位置计算的, 你内存分的支离破碎了,代码用到后期也 ...

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

jianfengxixi 发表于 2021-11-16 15:54:03

上个freertos好了。。。

armstrong 发表于 2021-11-17 13:38:49

SCREA 发表于 2021-11-16 13:57
esp idf 那个是freertos系统。 内涵heap_x.

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

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

redroof 发表于 2021-11-17 16:23:52

armstrong 发表于 2021-11-17 13:38
free时,相邻碎片合并是大多数malloc算法都有的功能;但这不足以让碎片消失。
长期运行的设备,内存中就 ...

有专门的低碎片malloc,还有就是你预留的空闲内存要多一点。这样就没事。
简单一点的实现,可以给网卡一些定长的缓存,1.5k一个,固定给若干个,不分割也不合并,万一网络流量超大,用光就没了,直接丢包。这些缓存别处也不允许用。这样就没事了。
页: [1]
查看完整版本: 大家怎么malloc数据?自己写malloc,还是库的?