当前位置:文档之家› 物联网操作系统LiteOS内核开发与实践 (10)

物联网操作系统LiteOS内核开发与实践 (10)

动态内 存分配
指在静态内存池中分配用户初始化时 预设(固定)大小的内存块。 优点:分配和释放效率高,静态内存 池中无碎片。 缺点:只能分配到初始化时预设大小 的内存块,不能按需分配。
静态内 存分配
10.1 内存管理的基本概念
第10章 内存管理
6
LiteOS 提供了多种内存分配算法,默认使用 BestFit(最佳适应算法),所谓“最佳”,是指每次 分配内存时,总是把最合适的内存块分配出去,避免“大材小用”。该分配算法尽可能保留系统中连 续的内存块,减少内存碎片;
第10章 内存管理
8
与静态内存管理相比,动态内 存管理的好处是按需分配,缺 点是消耗的时间较多,且可能 产生内存碎片。
10.2 内存管理的运行机制
第10章 内存管理
9
text段位于Flash中,而data和bss段位于RAM中。系统的内存除了data、bss段所占的空间 及msp栈内存空间外,其余的RAM为系统的内存堆(heap)管理的内存,也就是说它是由 LiteOS去管理的,即动态内存管理。
缺点:是分配算法时间消耗较大。最佳适应算法的时间是不确定的,时间复杂度是 O(n)。
在一般的嵌入式系统中,由于 MCU(Micro Control Unit,微控制单元)不支持虚拟内存,所有的内存都需 要用户参与分配,直接操作物理内存,因此管理的内存大小不会超过物理内存大小。
在嵌入式实时操作系统中,内存管理算法会根据需要存储的数据的长度,在内存中寻找一个合适大小的空 闲内存块,并将数据存储在内存块中。LiteOS 中提供了 TLSF 动态内存管理算法,该算法的时间复杂度是 O(1),是一个固定值。
图10~3 释放内存
10.2 内存管理的运行机制
第10章 内存管理
14
2.静态内存池管理 静态内存实质上是一块静态数组(也称为内存池或静态内存池),静态内存池中的内存块大小需要用户 在初始化时设定,初始化后内存块大小不可变更。 静态内存池由一个控制块和若干相同大小的内存块构成,控制块(也可以称为内存池信息结构 LOS_MEMBOX_INFO)位于内存池头部,用于内存块管理,每个内存块头部也有一个内存节点信息结 构LOS_MEMBOX_NODE,用于将内存块链接起来形成内存块链表,内存块的分配和释放以块大小为 粒度。静态内存池结构示意图如图10~4所示。
第10章 内存管理
3
10.1 内存管理的基本概念
10.2 内存管理的运行机制
10.3 内存管理的应用场景
10.4 静态内存池的使用 10.5 动态内存的使用 10.6 内存管理实验 10.7 实验现象
10.1 内存管理的基本概念
第10章 内存管理
4
LiteOS 内存管理模块用于管理系统的内存资源,它是操作系统的核心模块之一,功能主要包括内 存的初始化、分配及释放。在计算机中可以使用malloc/free 函数动态地分配/释放内存,但在嵌入式的 库中,malloc 和 free 通常被定义为 weak 函数,而操作系统拥有自己的内存分配与释放函数,一般不 使用 malloc 和 free,其原因有以下几点。
第10章 内存管理
1
第10章 软件定时器实验现象
物联网操作系统LiteOS内核开发与实战
人民邮电出版社
能力 要求
CAPACITY
第10章 内存管理
2
了解内存管理的基本概念。 了解内存管理的运行机制。 掌握LiteOS的内存池的使用方式。 掌握LiteOS动态内存分配的使用方式。
内容 导航
CONTENTS
不同的嵌入式系统具有不同的内存配置和时间要求,所以单一的内存分配算法只可能适合部分应用程序。 因此,LiteOS 将内存分配作为可移植层,针对性地提供了不同的内存分配管理算法,这使得不同的应用程 序可以选择适合自身的内存分配算法。
内容 导航
CONTENTS
第10章 内存管理
7
10.1 内存管理的基Hale Waihona Puke 概念图10 1 内存初始化
10.2 内存管理的运行机制
第10章 内存管理
12
分配内存: 当系统内存堆初始化完毕后,用户即可从系统所管理的内存堆中分配内存。在LiteOS中,主要 使用LOS_MemAlloc函数分配内存,系统根据指定的内存大小从内存堆中分配内存,其大小不 能超过当前系统管理的可用内存大小。
这些函数在小型嵌入式系统中并不总是可用的,因为小型嵌入式设备中的 RAM 不足。 它们的实现方式占用很大资源,占据了很大的一块代码空间。 它们都不是安全的。
10.1 内存管理的基本概念
第10章 内存管理
5
指在动态内存池中分配用户指定大 小的内存块。 优点:按需分配。 缺点:内存池中可能出现碎片。
10.2 内存管理的运行机制
10.3 内存管理的应用场景
10.4 静态内存池的使用 10.5 动态内存的使用 10.6 内存管理实验 10.7 实验现象
10.2 内存管理的运行机制
1.动态内存管理
动态内存管理即在内存资源充 足的情况下,从系统配置的一 块比较大的连续内存堆(其大 小为OS_SYS_MEM_SIZE)中, 根据用户需求分配任意大小的 内存块,当用户不需要该内存 块时,可以释放该内存块。
图10 2 分配内存
10.2 内存管理的运行机制
第10章 内存管理
13
释放内存: 因为在嵌入式系统中,内存是系统的紧缺资源,当不需要内存时,应及时将其释放。在LiteOS中, 可以使用LOS_MemFree函数释放不再使用的内存,系统会自动将内存释放到系统管理的内存堆中。 假设调用LOS_MemFree函数释放内存块UsedB,则会回收内存块UsedB,并将其标记为FreeNode, 如图10~3所示。
heap管理的内存的起始地址为bss段的结束,因为bss段位于data段的后面,而msp栈一般 位于RAM的最后,所以,heap管理的内存的结束地址为msp栈的起始地址。
10.2 内存管理的运行机制
第10章 内存管理
10
内存管理包括以下过程。
01
初始化内存
内存管理包 括以下过程
02 分配内存
03
释放内存
10.2 内存管理的运行机制
第10章 内存管理
11
初始化内存: 在使用内存之前,必须先初始化内存堆,LiteOS在内核初始化的时候就已经对管理的内存进行 了初始化,内存的起始地址是LOS_HEAP_MEM_BEGIN,结束地址是LOS_ HEAP_MEM_END,内存池的大小是OS_SYS_MEM_SIZE。用户可以在分散加载文件中修改 内存堆的大小,但是其最大不能超过芯片的RAM区域。
相关主题