大家怎么malloc数据?自己写malloc,还是库的?
如题,一些国际认证上(如某V)单片机不让用IAR 自带的malloc,必须自己写,要么经过认证的(使用第三方要花钱)。抛开认证和OS自带的malloc,大家的malloc是从哪里调用的? 自己写、第三方、编译器自带?
之前都是自己写,不会频繁malloc、free,内存体量上能控制住内存的调用度,也没出过问题,但是用上NET、文件系统、GUI三者后,频繁申请、释放不定大小的空间,怕出事。
所以咨询下大伙。
想用编译器自带的(小规模程序),大家用的感觉怎么样, 有坑没?
大伙有推荐的malloc没?
除了用标准库的 malloc, 还可以用 RTOS 的 heap 管理呀
一般比自己写靠谱多了吧
wudicgi 发表于 2021-11-9 11:14
除了用标准库的 malloc, 还可以用 RTOS 的 heap 管理呀
一般比自己写靠谱多了吧
...
是的。
非OS下的malloc,您一般用哪种? SCREA 发表于 2021-11-9 11:18
是的。
非OS下的malloc,您一般用哪种?
自己移植一个系统的,比如FREERTOS 为什么不能用标准库的malloc? wye11083 发表于 2021-11-9 13:08
为什么不能用标准库的malloc?
之前一直被教导编译器的mallloc 容易碎片化,所以一直没用过。
您什么单片机用过编译器的malloc? 嵌入式从不用malloc的飘过 我也几乎不用malloc 尽量不用... 有个bget不错, github上有. SCREA 发表于 2021-11-9 14:43
之前一直被教导编译器的mallloc 容易碎片化,所以一直没用过。
您什么单片机用过编译器的malloc? ...
不用 malloc +1,非用不可就上 linux 了
除了碎片化問題,實時任務也絕對不允許使用 malloc 我们用freeRTOS里的heap_4.c, 暂时没有发现问题 tomzbj 发表于 2021-11-9 15:23
尽量不用... 有个bget不错, github上有.
谢谢了,试试 qinxg 发表于 2021-11-9 16:05
我们用freeRTOS里的heap_4.c, 暂时没有发现问题
好主意,这个是与OS没有耦合,直接独立的? dukelec 发表于 2021-11-9 15:33
不用 malloc +1,非用不可就上 linux 了
除了碎片化問題,實時任務也絕對不允許使用 malloc ...
您是不是遇到过坑点,能说下让大伙高兴高兴?{:2_31:} 正点原子的MALLOC 本帖最后由 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 原廠的人比較熟,所以比較清楚行業的這一轉變 dukelec 发表于 2021-11-9 16:58
沒有啊
實時任務不允許使用 malloc 算是我的常識吧,即便是在實時 RT Preempt Linux 的用戶空間的實時任 ...
嗯。您说的有道理{:handshake:} 我正在遭受此问题的折磨!设备正常工作了60多天,最近发现网络不通了,只要小于300字节的包还能正常首发,太大包就不能接收了;其它无需内存申请的代码工作依旧正常。
真的很头疼,ESP-IDF是厂家提供的开发包,自己没法该malloc这种底层设施,真是纠结! MCU项目,最好别用malloc,真的。内存碎片化是迟早的事,时间问题而已。网络设备通常需要全年无休的工作,不允许我过一阵子重启一下来解决,真是头疼。 本帖最后由 ackyee 于 2021-11-16 09:55 编辑
MCU就别用这个了, 数组,字符串这些都是按首个地址位置计算的, 你内存分的支离破碎了,代码用到后期也问题多多
宁可花费更多的内存空间也要保障系统的稳定性,系统允许条件下哪怕都定义成全局变量也不过
至于UI调度 一般开源UI 都已经写好了 底层就不去调整了 从来没用过malloc,需要较大空间的时候,直接用数组解决. 本帖最后由 SCREA 于 2021-11-16 11:28 编辑
armstrong 发表于 2021-11-16 09:51
MCU项目,最好别用malloc,真的。内存碎片化是迟早的事,时间问题而已。网络设备通常需要全年无休的工作, ...
您用的哪种malloc,是否支持碎片整理?
FreeRTOS 下面有个heap_4.c\heao_5.c, 这个在申请或释放得时候会进行相邻块合并。
您说的非常有理,一般单片机的任务是固定的,所以任务中的内存地址和大小,基本都是固定的。
但接入网络、频繁写FATFS,一些第三方库会用malloc,不得以被动引入了风险。 SCREA 发表于 2021-11-16 11:25
您用的哪种malloc,是否支持碎片整理?
FreeRTOS 下面有个heap_4.c\heao_5.c, 这个在申请或释放得时候会 ...
我用的是esp-idf gcc 自带的,应该是newlib内置的malloc。事实上,IAR的malloc也好不到哪里去,我的设备好几个版本,IAR环境开发的也这样。 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 17:19 编辑
ackyee 发表于 2021-11-16 09:54
MCU就别用这个了, 数组,字符串这些都是按首个地址位置计算的, 你内存分的支离破碎了,代码用到后期也 ...
嗯。 这玩意感觉就像潘多拉魔盒 上个freertos好了。。。 SCREA 发表于 2021-11-16 13:57
esp idf 那个是freertos系统。 内涵heap_x.
IAR malloc 8之前的版本( 8之后的不知道)貌似不会合并相邻 ...
free时,相邻碎片合并是大多数malloc算法都有的功能;但这不足以让碎片消失。
长期运行的设备,内存中就存在许多小内存块正在使用,这些小内存块长期得不到释放就把连续内存分割成一些片段了,从而导致申请不到大块内存。 armstrong 发表于 2021-11-17 13:38
free时,相邻碎片合并是大多数malloc算法都有的功能;但这不足以让碎片消失。
长期运行的设备,内存中就 ...
有专门的低碎片malloc,还有就是你预留的空闲内存要多一点。这样就没事。
简单一点的实现,可以给网卡一些定长的缓存,1.5k一个,固定给若干个,不分割也不合并,万一网络流量超大,用光就没了,直接丢包。这些缓存别处也不允许用。这样就没事了。
页:
[1]