LiteOS设备开发(5)——内存管理

1、内存管理简介

2、运作机制-动态内存

3、运作机制-静态内存

4、内存的应用场景与开发流程

5、操作系统抽象层简介

6、实现内存管理功能

7、实验结果与扩展实验

在这里插入图片描述

内存管理简介

内存的基本概念:内存管理模块管理系统的内存资源,它是操作系统的核心模块之一。主要包括内存的初始化、分配以及释放。

在系统运行过程中,内存管理模块通过对内存的申请/释放操作,来管理用户和OS对内存的使用,使内存的利用率和使用效率达到最优,同时最大限度地解决系统的内存碎片问题。

HuaweiLiteOS的内存管理分为静态内存管理和动态内存管理,提供内存初始化、分配、释放等功能。

在这里插入图片描述

运作机制-动态内存

运作机制

动态内存管理,即在内存资源充足的情况下,从系统配置的一块比较大的连续内存(内存池),根据用户需求,分配任意大小的内存块。当用户不需要该内存块时,又可以释放回系统供下一次使用。与静态内存相比,动态内存管理的好处是按需分配,缺点是内存池中容易出现碎片。LiteOS动态内存支持DLINK和BESTLITTLE两种标准算法。

1.DLINK动态内存管理
在这里插入图片描述
第一部分:堆内存(也称内存池)的起始地址及堆区域总大小。

第二部分:本身是一个数组,每个元素是一个双向链表,所有free节点的控制头都会被分类挂在这个数组的双向链表中。每次申请内存的时候,会从这个数组检索最合适大小的free节点,进行分配内存。每次释放内存时,会将该片内存作为free节点存储至这个数组,以便下次再利用。

第三部分:占用内存池极大部分的空间,是用于存放各节点的实际区域。

2、BESTLITTLE动态内存管理

1)LiteOS的动态内存分配支持最佳适配算法,即BESTLITTLE,每次分配时选择内存池中最小最适合的内存块进行分配。LiteOS动态内存管理在最佳适配算法的基础上加入了SLAB机制,用于分配固定大小的内存块,进而减小产生内存碎片的可能性。LiteOS内存管理中的SLAB机制支持可配置的SLABCLASS数目及每个CLASS的最大空间。

2)每次申请内存时,先在满足申请大小的最佳SLABCLASS中申请,(比如用户申请20字节内存,就在SLAB块大小为32字节的SLABCLASS中申请),如果申请成功,就将SLAB内存块整块返回给用户,释放时整块回收。如果满足条件的SLABCLASS中已无可以分配的内存块,则继续向内存池按照最佳适配算法申请。需要注意的是,如果当前的SLABCLASS中无可用SLAB块了,则直接向内存池申请,而不会继续向有着更大SLAB块空间的SLABCLASS申请。

3)释放内存时,先检查释放的内存块是否属于SLABCLASS,如果是SLABCLASS的内存块,则还回对应的SLABCLASS中,否则还回内存池中。

在这里插入图片描述

运作机制-静态内存

1、静态内存实质上是一块静态数组,静态内存池内的块大小在初始化时设定,初始化后块大小不可变更。

2、静态内存池由一个控制块和若干相同大小的内存块构成。控制块位于内存池头部,用于内存块管理。内存块的申请和释放以块大小为粒度。

在这里插入图片描述

内存管理应用场景与开发流程

动态内存使用场景

1、内存管理的主要工作是动态的划分并管理用户分配好的内存区间。
2、动态内存管理主要是在用户需要使用大小不等的内存块的场景中使用。
3、当用户需要分配内存时,可以通过操作系统的动态内存申请函数索取指定大小内存块,一旦使用完毕,通过动态内存释放函数归还所占用内存,使之可以重复使用。

静态内存使用场景

当用户需要使用固定长度的内存时,可以使用静态内存分配的方式获取内存,一旦使用完毕,通过静态内存释放函数归还所占用内存,使之可以重复使用。

动态内存开发流程

主要介绍BESTLITTLE开发流程

1、配置:LOSCFG_MEMORY_BESTFIT:置为YES,选中内存管理算法中的BESTFIT算法。LOSCFG_KERNEL_MEM_SLAB:置为YES,打开内存管理中的SLAB机制。
2、初始化:调用函数初始化用户指定的动态内存池,若用户使能了SLAB机制并且内存池中的可分配内存大于SLAB需要的最小内存,则会进一步初始化SLABCLASS。
3、申请任意大小的动态内存:调用函数从指定的内存池中申请指定大小的内存块,申请时内存管理先向SLABCLASS申请,申请失败后继续向堆内存空间申请,最后将申请结果返回给用户。在向堆内存空间申请时,会存在内存块的切分。
4、释放动态内存:调用函数向指定的动态内存池释放指定的内存块,释放时会先判断该内存块是否属于SLABCLASS,若属于,则将该内存块还回SLABCLASS。否则,向堆内存空间释放内存块。在向堆内存空间释放时,会存在内存块的合并

静态内存开发流程

1、规划一片内存区域作为静态内存池。
2、系统内部将会初始化静态内存池。将入参指定的内存区域分割为N块(N值取决于静态内存总大小和块大小),将所有内存块挂到空闲链表,在内存起始处放置控制头。
3、系统内部将会从空闲链表中获取第一个空闲块,并返回该块的用户空间地址。
4、将该块内存加入空闲块链表。
5、系统内部清零静态内存块,将入参地址对应的内存块清零。

注意事项:静态内存池区域,可以通过定义全局数组或调用动态内存分配接口方式获取。如果使用动态内存分配方式,在不需要静态内存池时,注意要释放该段内存,避免内存泄露。

操作系统抽象层简介

在这里插入图片描述

申请动态内存:void*osal_malloc(size_tsize);
释放动态内存:voidosal_free(void*addr);
申请且初始化动态内存为0void*osal_zalloc(size_tsize);
重新申请分配动态内存:void*osal_realloc(void*ptr,size_tnewsize);
申请分配n个长度为size的动态内存空间:void*osal_calloc(size_tn,size_tsize)

在这里插入图片描述

实验结果


#include <osal.h>

static int mem_access_task_entry()
{
    uint32_t i = 0;
    size_t mem_size;
    uint8_t* mem_ptr = NULL;

    while (1)
    {
        mem_size = 1 << i++;
        mem_ptr = osal_malloc(mem_size);
        if(mem_ptr != NULL)
        {
            printf("access %d bytes memory success!\r\n", mem_size);
            mem_ptr="liteos";
            printf("%s",mem_ptr);
            osal_free(mem_ptr);
            mem_ptr = NULL;
            printf("free memory success!\r\n");
           
        }
        else
        {
            printf("BearPi: access %d bytes memory failed!\r\n", mem_size);
            return 0;
        }
    }
}

int standard_app_demo_main()
{
    osal_task_create("mem_access_task",mem_access_task_entry,NULL,0x400,NULL,11);
    return 0;
}



可以看到,系统启动后,串口shell的优先级为10,最先打印shell信息,接下来内存申请任务创建开始执行,不断增大内存的申请空间,在该芯片上最大能申请的空间为16384字节。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本课程《华为物联网操作系统LiteOS》是朱老师物联网大讲堂推出的一套物联网理论和实践相结合的视频课程。本课程以渐次递进的方式讲了以下4个主题。主题1:物联网,这是整个课程第1部分。主要讲了物联网的概念、发展历程、物联网的典型案例和应用场景,从技术角度深度阐述了物联网的4层架构、分析了各层次的核心技术和实现原理。本部分的主要目的是让大家对物联网有一定深度和专业性的理解。很多人一直对物联网有兴趣,也找了不少资料看了不少书,但是越看越糊涂,尤其很多物联网专业的大学生,经过几年的大学学习仍然不知道究竟什么是物联网,更不知该如何去学习物联网,本部分就是为解决这个疑问而生。主题2:操作系统,这是整个课程第2部分。主要讲了操作系统的基本原理,操作系统的作用和组成部分,让我们明白裸机开发和基于操作系统开发有什么差异。这部分是比较偏理论的,是为了解决很多同学对操作系统的认知基础的。很多同学甚至是开发者,尤其是单片机的开发者习惯了裸机开发,直接基于寄存器或者官方库函数(譬如stm32的HAL库、标准库)的开发,心里很疑惑到底什么是操作系统,为什么裸机开发也能做项目还需要操作系统?用不用操作系统的差异在哪里?为什么要去学习操作系统?应该如何学习操作系统?本部分就是为了回答这些问题。主题3:物联网操作系统,这是整个课程的的3部分。物联网操作系统是专为物联网而研发和设计的操作系统,是物联网设备的核心技术。物联网操作系统也是一种操作系统,他具有操作系统的普遍特性(以前前面我们才先学习泛性的普遍的操作系统),但是物联网操作系统有它很多独特的特性,华为的LiteOS就是一款非常典型的优秀的物联网操作系统,除此之外国内还有诸如RT-Thread、AliOSThings等其他优秀物联网操作系统,国外还有Amazon的Freertos等物联网操作系统。那究竟物联网操作系统有什么特别之处?物联网产品如何选择操作系统?如何基于操作系统开发物联网产品?本部分课程将回答这些问题。主题4:华为物联网操作系统LiteOS,这是整个课程的第4部分。本部分聚焦LiteOS,基于前3部分的铺垫,向大家详细讲解LiteOS的设计思路,专门安排了2大章节来详细分析LiteOS的kernel源码和周边组件源码,还介绍了我们专为学习物联网而设计的NB476开发板,且基于该开发板和LiteOS设计了一个温湿度和断电检测报警器的典型的物联网产品试验,在试验实战中让大家体会基于LiteOS的物联网项目的开发方式。本部分是整个课程中最重头戏的部分,篇幅占据整个课程的一半左右。因此实际上我们整个课程的内容还是比较偏技术性的,可谓低走高开。从基础概念起步,最终带大家能够去做产品。课程特色*完全零基础,降低学习门槛。*深入浅出,通俗易懂。不怕学不会,就怕你不学习。*思路清晰、语言风趣,对着视频看也不会想睡觉······*视频 + 文档 + 练习题 + 答疑,全方位保证学习质量。*基础知识 + 思路引导的教学方式,授之以鱼更授之以渔。*系列课程。本教程只是入门篇,后续还有更多更精彩视频更新中。
### 回答1: LiteOS是一个嵌入式操作系统,其内存管理算法通常是基于内存池的。这意味着系统在启动时会分配一个固定大小的内存池,并在运行过程中使用这个内存池来分配内存给不同的应用程序和系统进程。 在内存分配方面,LiteOS使用的是链表动态分配算法。这意味着系统会维护一个链表,其中包含可用内存块的信息。当应用程序需要分配内存时,系统会在链表中查找第一个足够大的内存块,然后将其分配给应用程序。这种方法的优点在于可以有效地利用内存,避免内存碎片的产生。 LiteOS还提供了垃圾回收功能,可以回收应用程序不再使用内存。这通常是通过一种称为“标记-清除”的算法来实现的。首先,系统会找出所有正在使用内存块,然后将它们标记为“可用”。接下来,系统会扫描整个内存池,并清除所有未被标记的内存块,使其成为可用内存。这样,就可以有效地回收应用程序不再使用内存。 总的来说 ### 回答2: liteos_m是一款轻量级的操作系统,其内存管理算法采用了基于链表的动态分配和释放的方法。 liteos_m的内存管理主要包括两个方面:内存分配和内存释放。其中,内存分配使用了链表数据结构,通过维护一个空闲链表和一个已分配链表来管理可用的内存块。当需要分配内存时,liteos_m会从空闲链表中找到一个合适大小的内存块,并将其从空闲链表中移除,然后将其加入到已分配链表中。如果空闲链表中没有合适大小的内存块,则需要进行内存碎片整理或者向操作系统申请更多内存。 对于内存释放,liteos_m会将需要释放的内存块从已分配链表中移除,并将其重新加入到空闲链表中,以便下次分配时使用。此外,为了提高内存的利用率和管理效率,liteos_m还会对连续的空闲内存块进行合并,以减少内存碎片。 总的来说,liteos_m的内存管理算法主要是通过链表数据结构来管理内存块的分配和释放,通过动态维护空闲链表和已分配链表,实现了对内存的高效管理。这种方式既能够灵活地满足多种内存需求,又能够提高内存的利用率和系统的性能。 ### 回答3: liteos_m的内存管理算法原理是基于分段算法和垃圾回收算法。 在liteos_m中,内存分为多个段,每个段大小相等且固定。每个段可以分配给不同的任务或对象使用。分段算法的优势是可以避免内存碎片的产生,提高内存的利用率。 在liteos_m中,还引入了垃圾回收算法,这是为了解决内存中已经不再使用的对象或任务所占用的内存无法被释放的问题。垃圾回收算法通过定期检查内存中的对象和任务的引用计数,当引用计数为0时,表示该对象或任务已经不再需要,可以释放其占用的内存。通过垃圾回收算法,可以更好地管理和释放内存,避免内存泄露的问题。 总结来说,liteos_m的内存管理算法原理是通过分段算法来管理内存的分配和释放,同时结合垃圾回收算法来管理内存中不再使用的对象和任务的释放,以提高内存的利用率和避免内存泄露的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值