linqing171 发表于 2018-8-19 22:40

ljt8015 发表于 2018-8-19 21:00
内存管理和c++没什么关系吧?

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

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

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

Prry 发表于 2018-8-19 23:06

可以用,堆分配好大小。公司产品仪都卖了十几年了,他们一直在用。既然是C标准库,肯定做得比自己实现的好。

caijie001 发表于 2018-8-20 08:54

一路向北lm 发表于 2018-8-19 17:56
估计没人敢用动态,不稳定。

学习都是学动态的{:titter:}

ljt8015 发表于 2018-8-20 09:00

linqing171 发表于 2018-8-19 22:33
编译器自带的c函数库都有这两个函数。和mmu没有多少关系。
内存碎片产生和代码有关,并不是所有的情况都会 ...

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

疯子8972 发表于 2018-8-20 15:29

本帖最后由 疯子8972 于 2018-8-20 15:31 编辑

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

疯子8972 发表于 2018-8-20 15:34

本帖最后由 疯子8972 于 2018-8-20 15:42 编辑

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

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

:)

ljt8015 发表于 2018-8-20 20:17

Prry 发表于 2018-8-19 23:06
可以用,堆分配好大小。公司产品仪都卖了十几年了,他们一直在用。既然是C标准库,肯定做得比自己实现的好 ...

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

ljt8015 发表于 2018-8-20 20:18

疯子8972 发表于 2018-8-20 15:34
现在的单片机概念已经发生变化了,51是单片机,M3、M4、M7也是
所以有些观念也要变化的



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

没懂意思?

Prry 发表于 2018-8-20 22:39

ljt8015 发表于 2018-8-20 20:17
如果malloc好用,那为什么rtos都有自己的内存管理模块呢?

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

Prry 发表于 2018-8-20 22:40

ljt8015 发表于 2018-8-20 20:17
如果malloc好用,那为什么rtos都有自己的内存管理模块呢?

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

ljt8015 发表于 2018-8-21 09:11

Prry 发表于 2018-8-20 22:40
一般裸机用malloc,rtos有适配的malloc就用rtos的

rtos有适配的malloc就用rtos的,

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

holle 发表于 2018-8-21 10:34

经常用,从没怀疑过。

ljt8015 发表于 2018-8-21 15:31

holle 发表于 2018-8-21 10:34
经常用,从没怀疑过。

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

Prry 发表于 2018-8-21 23:22

ljt8015 发表于 2018-8-21 09:11
rtos有适配的malloc就用rtos的,

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

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

ljt8015 发表于 2018-8-22 12:43

Prry 发表于 2018-8-21 23:22
一般的rtos都会有一套自己的内存管理算法,提供一个适配自己内核的malloc,如RT-Thread有rt_malloc。 ...

rt_malloc 支持碎片整理?

Prry 发表于 2018-8-23 00:44

ljt8015 发表于 2018-8-22 12:43
rt_malloc 支持碎片整理?

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

Prry 发表于 2018-8-23 00:45

ljt8015 发表于 2018-8-22 12:43
rt_malloc 支持碎片整理?

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

ljt8015 发表于 2018-8-25 15:59

Prry 发表于 2018-8-23 00:45
因此,高稳定性、可靠性场合,不应该出现动态内存分配。特别是嵌入式领域,如汽车、航空等。 ...

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

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

Prry 发表于 2018-8-25 22:55

ljt8015 发表于 2018-8-25 15:59
如果只是初始化分配内存,不是频繁的malloc free就没问题。

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

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

ljt8015 发表于 2018-9-7 20:46

holle 发表于 2018-8-21 10:34
经常用,从没怀疑过。

你没有频繁的分配和释放吧?
页: 1 [2]
查看完整版本: MCU(不带MMU)能否使用用标准C库中的malloc和free分配释放内存?