MCU(不带MMU)能否使用用标准C库中的malloc和free分配释放内存?
MCU(不带MMU)能否使用用标准C库中的malloc和free分配释放内存?会不会有内存碎片? 看支持这个 MCU 的 C 库中有没有 malloc 和 free,有就能用,没有就不能用。内存碎片一定会有。
john_lee 发表于 2018-8-18 12:05
看支持这个 MCU 的 C 库中有没有 malloc 和 free,有就能用,没有就不能用。内存碎片一定会有。
...
如果内存碎片一定有,那么嵌入式系统就会存在稳定性问题。
是嵌入系统最重要的就是稳定。
有没有支持碎片整理的内存管理模块。
ljt8015 发表于 2018-8-18 14:11
如果内存碎片一定有,那么嵌入式系统就会存在稳定性问题。
是嵌入系统最重要的就是稳定。
为了稳定性,MCU 就不要用动态内存分配。 john_lee 发表于 2018-8-18 14:34
为了稳定性,MCU 就不要用动态内存分配。
现在的问题是内存不够,必须用动态内存分配,有什么稳定的方案?
freertos有支持碎片整理的内存管理模块,不知道是否可行? 在标准C库中,可以用 malloc()和 free()这两个函数动态的分配内存和释放内存,但是,在嵌入式实时操作系统中,调用 malloc()和 free()却是危险的,原因有以下几点:
在小型嵌入式系统中并不总是可用的。
它们的实现可能非常的大,占据了相当大的一块代码空间。
他们几乎都不是线程安全的。
它们并不是确定的,每次调用这些函数执行的时间可能都不一样。
它们有可能产生碎片。
这两个函数会使得链接器配置得复杂。
如果允许堆空间的生长方向覆盖其他变量占据的内存,它们会成为debug的灾难 。
在一般的实时嵌入式系统中,由于实时性的要求,很少使用虚拟内存机制。所有的内存都需要用户参与分配,直接操作物理内存,所分配的内存不能超过系统的物理内存,所有的系统堆栈的管理,都由用户自己管理。
无论是我们自己的内存分配函数还是c标准库的,都有内存碎片的产生,要么就用静态的。稳 ljt8015 发表于 2018-8-18 18:44
现在的问题是内存不够,必须用动态内存分配,有什么稳定的方案?
freertos有支持碎片整理的内存管理模块 ...
heap4可以试试,但是不可避免碎片,要么就heap5,外部加块SDRAM john_lee 发表于 2018-8-18 14:34
为了稳定性,MCU 就不要用动态内存分配。
对滴,静态才是最安全的 caijie001 发表于 2018-8-18 21:15
heap4可以试试,但是不可避免碎片,要么就heap5,外部加块SDRAM
heap4也可以用在sdram啊 推荐静态,搞什么动态分配。 一路向北lm 发表于 2018-8-18 22:33
推荐静态,搞什么动态分配。
内存不够怎么办呢? ljt8015 发表于 2018-8-18 21:25
heap4也可以用在sdram啊
4不能分段管理内存 一路向北lm 发表于 2018-8-18 22:33
推荐静态,搞什么动态分配。
有道理的
实际项目我觉得都应该静态 caijie001 发表于 2018-8-19 17:23
有道理的
实际项目我觉得都应该静态
估计没人敢用动态,不稳定。 caijie001 发表于 2018-8-19 17:23
4不能分段管理内存
不用分段管理,能处理碎片就行 支持C++就行;
碎片问题,可以开个守护进程定时清理 xch 发表于 2018-8-19 18:46
支持C++就行;
碎片问题,可以开个守护进程定时清理
内存管理和c++没什么关系吧?
碎片如何清理?只能合并吧? ljt8015 发表于 2018-8-19 21:00
内存管理和c++没什么关系吧?
碎片如何清理?只能合并吧?
C++方便。 当然你也可以用汇编语言。 编译器自带的c函数库都有这两个函数。和mmu没有多少关系。
内存碎片产生和代码有关,并不是所有的情况都会产生。
x:\Keil\C51\LIB\FREE.C这个文件先熟读于胸。然后把产生碎片的案例找几个熟读于胸。
然后使用的时候分配的大小及申请释放的时机人工把握好。别有大量的小申请和偶尔的大申请的复杂组合。几个字节的用一个足够大的临时变量比如 char file_name;
... ...
之前还看过一些比较巧妙的代码,自己做了个小的malloc,但是没有free,一个子线程内部的所有函数,都是在一个4096字节的数组上分配,等着子功能结束了,直接把这个数组整体释放。这个不知道最早是谁做的,反正SDCC等很多项目的源代码里面都见过。
页:
[1]
2