打印

MCU(不带MMU)能否使用用标准C库中的malloc和free分配释放内存?

[复制链接]
4871|39
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ljt8015|  楼主 | 2018-8-18 06:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
john_lee| | 2018-8-18 12:05 | 只看该作者
看支持这个 MCU 的 C 库中有没有 malloc 和 free,有就能用,没有就不能用。内存碎片一定会有。

使用特权

评论回复
板凳
ljt8015|  楼主 | 2018-8-18 14:11 | 只看该作者
john_lee 发表于 2018-8-18 12:05
看支持这个 MCU 的 C 库中有没有 malloc 和 free,有就能用,没有就不能用。内存碎片一定会有。
...

如果内存碎片一定有,那么嵌入式系统就会存在稳定性问题。

是嵌入系统最重要的就是稳定。

有没有支持碎片整理的内存管理模块。

使用特权

评论回复
地板
john_lee| | 2018-8-18 14:34 | 只看该作者
ljt8015 发表于 2018-8-18 14:11
如果内存碎片一定有,那么嵌入式系统就会存在稳定性问题。

是嵌入系统最重要的就是稳定。

为了稳定性,MCU 就不要用动态内存分配。

使用特权

评论回复
5
ljt8015|  楼主 | 2018-8-18 18:44 | 只看该作者
john_lee 发表于 2018-8-18 14:34
为了稳定性,MCU 就不要用动态内存分配。

现在的问题是内存不够,必须用动态内存分配,有什么稳定的方案?
freertos有支持碎片整理的内存管理模块,不知道是否可行?

使用特权

评论回复
6
caijie001| | 2018-8-18 21:14 | 只看该作者
在标准C库中,可以用 malloc()和 free()这两个函数动态的分配内存和释放内存,但是,在嵌入式实时操作系统中,调用 malloc()和 free()却是危险的,原因有以下几点:
        在小型嵌入式系统中并不总是可用的。
        它们的实现可能非常的大,占据了相当大的一块代码空间。
        他们几乎都不是线程安全的。
        它们并不是确定的,每次调用这些函数执行的时间可能都不一样。
        它们有可能产生碎片。
        这两个函数会使得链接器配置得复杂。
        如果允许堆空间的生长方向覆盖其他变量占据的内存,它们会成为debug的灾难 。
在一般的实时嵌入式系统中,由于实时性的要求,很少使用虚拟内存机制。所有的内存都需要用户参与分配,直接操作物理内存,所分配的内存不能超过系统的物理内存,所有的系统堆栈的管理,都由用户自己管理。

使用特权

评论回复
7
caijie001| | 2018-8-18 21:15 | 只看该作者
无论是我们自己的内存分配函数还是c标准库的,都有内存碎片的产生,要么就用静态的。稳

使用特权

评论回复
8
caijie001| | 2018-8-18 21:15 | 只看该作者
ljt8015 发表于 2018-8-18 18:44
现在的问题是内存不够,必须用动态内存分配,有什么稳定的方案?
freertos有支持碎片整理的内存管理模块 ...

heap4可以试试,但是不可避免碎片,要么就heap5,外部加块SDRAM

使用特权

评论回复
9
caijie001| | 2018-8-18 21:16 | 只看该作者
john_lee 发表于 2018-8-18 14:34
为了稳定性,MCU 就不要用动态内存分配。

对滴,静态才是最安全的

使用特权

评论回复
10
ljt8015|  楼主 | 2018-8-18 21:25 | 只看该作者
caijie001 发表于 2018-8-18 21:15
heap4可以试试,但是不可避免碎片,要么就heap5,外部加块SDRAM

heap4也可以用在sdram啊

使用特权

评论回复
11
一路向北lm| | 2018-8-18 22:33 | 只看该作者
推荐静态,搞什么动态分配。

使用特权

评论回复
12
ljt8015|  楼主 | 2018-8-19 08:19 | 只看该作者
一路向北lm 发表于 2018-8-18 22:33
推荐静态,搞什么动态分配。

内存不够怎么办呢?

使用特权

评论回复
13
caijie001| | 2018-8-19 17:23 | 只看该作者
ljt8015 发表于 2018-8-18 21:25
heap4也可以用在sdram啊

4不能分段管理内存

使用特权

评论回复
14
caijie001| | 2018-8-19 17:23 | 只看该作者
一路向北lm 发表于 2018-8-18 22:33
推荐静态,搞什么动态分配。

有道理的
实际项目我觉得都应该静态

使用特权

评论回复
15
一路向北lm| | 2018-8-19 17:56 | 只看该作者
caijie001 发表于 2018-8-19 17:23
有道理的
实际项目我觉得都应该静态

估计没人敢用动态,不稳定。

使用特权

评论回复
16
ljt8015|  楼主 | 2018-8-19 18:39 | 只看该作者
caijie001 发表于 2018-8-19 17:23
4不能分段管理内存

不用分段管理,能处理碎片就行

使用特权

评论回复
17
xch| | 2018-8-19 18:46 | 只看该作者
支持C++就行;
碎片问题,可以开个守护进程定时清理

使用特权

评论回复
18
ljt8015|  楼主 | 2018-8-19 21:00 | 只看该作者
xch 发表于 2018-8-19 18:46
支持C++就行;
碎片问题,可以开个守护进程定时清理

内存管理和c++没什么关系吧?

碎片如何清理?只能合并吧?

使用特权

评论回复
19
xch| | 2018-8-19 21:40 | 只看该作者
ljt8015 发表于 2018-8-19 21:00
内存管理和c++没什么关系吧?

碎片如何清理?只能合并吧?

C++方便。 当然你也可以用汇编语言。

使用特权

评论回复
20
linqing171| | 2018-8-19 22:33 | 只看该作者
编译器自带的c函数库都有这两个函数。和mmu没有多少关系。
内存碎片产生和代码有关,并不是所有的情况都会产生。
x:\Keil\C51\LIB\FREE.C  这个文件先熟读于胸。然后把产生碎片的案例找几个熟读于胸。
然后使用的时候分配的大小及申请释放的时机人工把握好。别有大量的小申请和偶尔的大申请的复杂组合。几个字节的用一个足够大的临时变量比如 char file_name[260];
... ...
之前还看过一些比较巧妙的代码,自己做了个小的malloc,但是没有free,一个子线程内部的所有函数,都是在一个4096字节的数组上分配,等着子功能结束了,直接把这个数组整体释放。这个不知道最早是谁做的,反正SDCC等很多项目的源代码里面都见过。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

106

帖子

1

粉丝