Nucleus源码分析—动态内存
大唐微电子技术有限公司
作者名称 蔡维林
防风中药页数 | 修改后版本 | 修改者 | 修改日期 | 修改说明 | 备注 |
12 | | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
Document information |
File Location | D:\××××\×××××××.doc(请说明在文档服务器上的位置) |
Last saved | 1/4/2005 3:48:00 PM |
| |
目 录
1. 概述 3
1.1 功能描述 3
1.2 文件信息 3
2. 实现原理(重点) 3
2.1 内存池实现结构: 3
2.2 内存池里面可用内存(已分配内存)结构: 4
3. 数据结构(重点) 4
3.1 动态内存池控制结构(PCB): 4
3.2 内存头数据结构: 5
3.3 动态内存池挂起操作数据结构: 5
3.4 组件全局数据结构: 6
4. 程序分析 6
4.1 接口函数映射表 6
4.2 DMC.C程序(重点) 6
4.2.1 创建内存池 6
4.2.2 删除内存池 9
4.3 从内存池中分配一块内存 11
4.4 从内存池中删除一块内存 14
4.5 函数VOID DMC_Cleanup(VOID *information) 16
4.6 其它(如果有的话) 16
4.6.1 DMD.C 16
4.6.2 DMI.C 16
4.6.3 DMF.C 16
4.6.4 DMCE.C 17
1.
概述
1.1 功能描述
动态内存管理组件(DM)负责处理所有的Nucleus PLUS动态内存管理,一个Nucleus PLUS动态内存池包括用户指定数目的字节。内存池的位置由应用程序指定,当等待分配一个足够大小的动态内存时,任务可能被挂起。动态内存池可以被用户动态创建和删除,请参考Nucleus PLUS参考文档以获得更多相关知识。
1.2 文件信息
红豆沙的制作方法
动态内存管理组件(DM)包括7个文件,每个文件命名如下:
文件名称 | 内容描述 |
DM_DEFS.H | 定义DM组件的特定数据结构和常量。 |
芦笋炒肉DM_EXTR.H | 定义DM组件的外部接口函数。 |
DMD.C 怎么追摩羯座男生 | 定义DM组件的全局数据结构。 |
DMI.C | DM组件的初始化代码。 |
DMF.C | 获得DM组件的信息的函数 |
DMC.C | DM组件的核心函数,实现内存分配和释放的代码 |
DMCE.C | 带有错误检查的DM组件核心函数。 |
| |
2. 实现原理
2.1 内存池实现结构:
动态内存池可以动态删除和创建,每一个创建的内存池都是通过一个叫做动态内存控制块的数据结构(PCB)来管理的,所有的控制块由一个双向链连接起来,新创建的PCB放在链表的尾端,一旦某个内存池被删除,对应的PCB所在链表的节点就会被完全删除。链表的头指针是DMD_Created_Pools_List。
鹰英语
为防止其它任务的破坏,在删除链表和新增链表时需要对之进行数据保护,Nucleus PLUS提供一个叫做DMD_List_Protect的内部数据结构来实现。
2.2 内存池里面可用内存(已分配内存)结构:
采购经理英文
每一块可用内存都有一个内存头数据结构,用以描述该块内存的基本信息以及把其它内存块头联系在一起形成一个双向链表。每个内存池PCB都包含一个指向内存块起始地址(dm_start_address)。PCB还有一个索引指针(dm_arch_pty),用来帮助搜索内存块,一般情况下指向当前可被分配的内存块头。内存块链表的头指针是dm_memory_list。
3. 数据结构
3.1 动态内存池控制结构(PCB):
typedef struct DM_PCB_STRUCT
{
CS_NODE dm_created; /* 链接PCB的双向链表节点 */
战疫口号
TC_PROTECT dm_protect; /*系统用于保护数据的数据结构 */
UNSIGNED dm_id; /* 操作系统内部使用的 ID */
CHAR dm_name[NU_MAX_NAME]; /* 动态内存池名 */
VOID *dm_start_address; /* 内存池起始地址 */
UNSIGNED dm_pool_size; /* 内存池大小红楼梦观后感 */
UNSIGNED dm_min_allocation; /* 最小分配空间 */