发新帖我要提问
12
返回列表
打印

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

[复制链接]
楼主: ljt8015
手机看帖
扫描二维码
随时随地手机跟帖
21
linqing171| | 2018-8-19 22:40 | 只看该作者 回帖奖励 |倒序浏览
ljt8015 发表于 2018-8-19 21:00
内存管理和c++没什么关系吧?

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

java和c#都是用的二级指针,二级指针那里有引用计数和真正的指针及长度。
每当指针赋值的时候都会把引用计数++;
每当指针被其它赋值覆盖或者离开函数作用域的时候引用计数--;
计数为0了之后就可以回收了。

所以每个函数里面都可以随便new了随便往外传,等着不用了后就自动回收了。
二级指针的好处是真正指向的位置还是可以压缩的。参考keil自带的task51的多任务的堆栈空间自动最大化功能。

使用特权

评论回复
22
Prry| | 2018-8-19 23:06 | 只看该作者
可以用,堆分配好大小。公司产品仪都卖了十几年了,他们一直在用。既然是C标准库,肯定做得比自己实现的好。

使用特权

评论回复
23
caijie001| | 2018-8-20 08:54 | 只看该作者
一路向北lm 发表于 2018-8-19 17:56
估计没人敢用动态,不稳定。

学习都是学动态的

使用特权

评论回复
24
ljt8015|  楼主 | 2018-8-20 09:00 | 只看该作者
linqing171 发表于 2018-8-19 22:33
编译器自带的c函数库都有这两个函数。和mmu没有多少关系。
内存碎片产生和代码有关,并不是所有的情况都会 ...

一个大型软件很多人开发,肯定要做成通用的

使用特权

评论回复
25
疯子8972| | 2018-8-20 15:29 | 只看该作者
本帖最后由 疯子8972 于 2018-8-20 15:31 编辑

设置好堆的位置和大小,就放心用呗,不稳定的说法从何而来?
碎片是肯定有的,但这不是什么要命的问题吧,如果碎片十分严重以至于无法正常分配,那只能说你的申请的策略有问题,或者堆太小了
内存泄露倒是要注意一下
以免用完了不释放,但一般嵌入式系统中任务是不删除的,隐性的发生这个问题的可能性不大

使用特权

评论回复
26
疯子8972| | 2018-8-20 15:34 | 只看该作者
本帖最后由 疯子8972 于 2018-8-20 15:42 编辑

现在的单片机概念已经发生变化了,51是单片机,M3、M4、M7也是
所以有些观念也要变化的

老外有些单片机系统,上层代码空间都是MALLOC出来,代码加载后再扫描一遍,把涉及到绝对跳转的地址动态改一改,然后运行
一点问题没有,还是通过SIL2安全认证的

:)

使用特权

评论回复
27
ljt8015|  楼主 | 2018-8-20 20:17 | 只看该作者
Prry 发表于 2018-8-19 23:06
可以用,堆分配好大小。公司产品仪都卖了十几年了,他们一直在用。既然是C标准库,肯定做得比自己实现的好 ...

如果malloc好用,那为什么rtos都有自己的内存管理模块呢?

使用特权

评论回复
28
ljt8015|  楼主 | 2018-8-20 20:18 | 只看该作者
疯子8972 发表于 2018-8-20 15:34
现在的单片机概念已经发生变化了,51是单片机,M3、M4、M7也是
所以有些观念也要变化的


代码加载后再扫描一遍,把涉及到绝对跳转的地址动态改一改,然后运行。

没懂意思?

使用特权

评论回复
29
Prry| | 2018-8-20 22:39 | 只看该作者
ljt8015 发表于 2018-8-20 20:17
如果malloc好用,那为什么rtos都有自己的内存管理模块呢?

1、便于移植,不依赖任何第三方库
2、效率有可能比malloc高,因为malloc是标准C库,考虑各类条件较多,而rtos自己实现的malloc适配自己内核的内存管理和调度。一句话,标准mallo适合广,自定义的优化更好。

使用特权

评论回复
30
Prry| | 2018-8-20 22:40 | 只看该作者
ljt8015 发表于 2018-8-20 20:17
如果malloc好用,那为什么rtos都有自己的内存管理模块呢?

一般裸机用malloc,rtos有适配的malloc就用rtos的

使用特权

评论回复
31
ljt8015|  楼主 | 2018-8-21 09:11 | 只看该作者
Prry 发表于 2018-8-20 22:40
一般裸机用malloc,rtos有适配的malloc就用rtos的

rtos有适配的malloc就用rtos的,

适配的malloc?  还是自己实现的malloc?

使用特权

评论回复
32
holle| | 2018-8-21 10:34 | 只看该作者
经常用,从没怀疑过。

使用特权

评论回复
33
ljt8015|  楼主 | 2018-8-21 15:31 | 只看该作者
holle 发表于 2018-8-21 10:34
经常用,从没怀疑过。

mcu多少ram,如果很富裕,问题不大。

使用特权

评论回复
34
Prry| | 2018-8-21 23:22 | 只看该作者
ljt8015 发表于 2018-8-21 09:11
rtos有适配的malloc就用rtos的,

适配的malloc?  还是自己实现的malloc?

一般的rtos都会有一套自己的内存管理算法,提供一个适配自己内核的malloc,如RT-Thread有rt_malloc。

使用特权

评论回复
35
ljt8015|  楼主 | 2018-8-22 12:43 | 只看该作者
Prry 发表于 2018-8-21 23:22
一般的rtos都会有一套自己的内存管理算法,提供一个适配自己内核的malloc,如RT-Thread有rt_malloc。 ...

rt_malloc 支持碎片整理?

使用特权

评论回复
36
Prry| | 2018-8-23 00:44 | 只看该作者
ljt8015 发表于 2018-8-22 12:43
rt_malloc 支持碎片整理?

只能说针对自身的内核调度尽可能优化,但没法根治,因为这是计算机特性。或者换其他方式解决,如内存池,但这个只能固定大小申请。

使用特权

评论回复
37
Prry| | 2018-8-23 00:45 | 只看该作者
ljt8015 发表于 2018-8-22 12:43
rt_malloc 支持碎片整理?

因此,高稳定性、可靠性场合,不应该出现动态内存分配。特别是嵌入式领域,如汽车、航空等。

使用特权

评论回复
38
ljt8015|  楼主 | 2018-8-25 15:59 | 只看该作者
Prry 发表于 2018-8-23 00:45
因此,高稳定性、可靠性场合,不应该出现动态内存分配。特别是嵌入式领域,如汽车、航空等。 ...

如果只是初始化分配内存,不是频繁的malloc free  就没问题。

如果链表、这些一般都是需要动态分配内存的

使用特权

评论回复
39
Prry| | 2018-8-25 22:55 | 只看该作者
ljt8015 发表于 2018-8-25 15:59
如果只是初始化分配内存,不是频繁的malloc free  就没问题。

如果链表、这些一般都是需要动态分配内存 ...

这确实是,一直存在的,那跟静态分配没多少区别。MISAR 编程规范就有一点是禁止使用动态内存分配!

使用特权

评论回复
40
ljt8015|  楼主 | 2018-9-7 20:46 | 只看该作者
holle 发表于 2018-8-21 10:34
经常用,从没怀疑过。

你没有频繁的分配和释放吧?

使用特权

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

本版积分规则