单片机中所谓的内存指的就是RAM,而并不是所有的RAM都需要管理的,只有用到动态内存申请的应用中才需要内存管理,并不是所有的应用都需要用到动态内存管理,其实在嵌入式领域大部分应用场景下都不会用到这个功能,那么你可以完全跳过此篇,或者就当茶余饭后的小说看一看。
关于动态内存管理方式:分为两种动态内存堆管理和静态内存池管理。
先来聊聊为什么动态内存管理能不用就不用的理由(缺点):
1.申请内存需要用到查找空闲内存算法,这个是需要时间的,有时候甚至会出现不可控的时间。。
2.频繁的申请和释放内存,会造成内存空间碎片化,导致内存不可用而系统出现问题,一般通过重启硬件完成修复。
3.申请内存会存在失败的情况,针对申请失败的情况需要做额外的处理。
当然他的好处也是多多:例如硬件资源有限的情况下,可以做更多的事情,应用更灵活。
RTOS会大篇幅的讲解内存管理算法,针对不同的内存容量其管理方式不同,那为什么要用不同的内存管理方式呢?主要是就是针对不同的内存容量,不同的算法能更有效的加快查找空闲内存的时间。至于算法的细节,其实不用看,看多了晕。你选择什么样的内存算法,其实站在应用的角度来看,是完全没有差别的,影响的只是系统分配内存的速度。
所以记住以下经验值就足够了:
第一种是针对小内存块的分配管理(小内存管理算法< 2MB);
第二种是针对大内存块的分配管理(slab 管理算法 > 2MB);
第三种是针对多内存堆的分配情况(memheap 管理算法,当系统含有多个地址可不连续的内存堆)。
动态内存管理API:
1.申请内存API:
/*分配的内存块地址 成功
RT_NULL 失败*/
void *rt_malloc(rt_size_t nbytes);/*nbytes 需要分配的内存块的大小,单位为字节*/
2.释放内存API:
void rt_free (void *ptr);/*ptr 待释放的内存块指针*/
3.重新分配内存块API:
/* 在已分配内存块的基础上重新分配内存块的大小(增加或缩小)
返回:重新分配的内存块地址 成功*/
void *rt_realloc(void *rmem, /*rmem 指向已分配的内存块*/
rt_size_t newsize);/*newsize 重新分配的内存大小*/