- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
KeilC动态内存管理机制分析及改进.
2.( 6068a )《 Keil C 动态内存管理机制分析及改进 ※ 》P 74
全文如下:
Keil C 动态内存管理机制分析及改进
丁明亮 熊真春
[摘要]通过对C51中init_mempool, malloc, free三个函数源代码的分析,深入分析C51的动态内存管理机制,同时也给出一些使init_mempool函数更完善和除去free函数中的一个错误的建议。
[关键词] C51 动态内存管理 分析
Abstract: based on the analysis to sources of function init_mempool, malloc and free, this article probes the dynamic memory management of C51 Library, and gives out some advices to better function init_mempool and to clear a bug of function free.
Key words: C51 dynamic memory management
0.前言
Keil C是常用的嵌入式系统编程工具,它通过init_mempool,mallloc,free等函数,提供了动态存储管理管理等功能。本文希望通过init_mempool,mallloc,free三个Keil C库函数源代码的分析,揭示了其实现的原理和方法,也对其中的不足作了改进,以使Keil C 编程人员更好地应用动态存储管理。
1.相关数据结构、变量及说明
在Keil C安装目录下的 \c51\lib目录下,有实现init_mempool,mallloc,free三个函数的C源文件init_mem.c,malloc.c,free.c,下面针对keil C7.5A版,将其中与动态存储管理相关的数据结构介绍如下:
#define _MALLOC_MEM_ xdata /*该行在stdlib.h文件中*/
struct __mem__
{
struct __mem__ _MALLOC_MEM_ *next; /* 单链表 */
unsigned int len; /*下一块长度 */
};
该结构的next指向堆中的下一空闲内存块,len表示该空闲块除去该块首部的struct __mem__
结构所占的字节数后,该块实际可用的字节数。由于next 是一个指向XDATA区的指针,故在Keil C中应用程序所定义的堆空间应在XDATA段中定义。
在Keil C中,堆中的所有的空闲内存块是用一个单链表来管理的,struct _mem_即为该链表结点的结构,后面定义的宏AVAIL为该链表的首结点,为叙述方便,以下将该链表称为AVAIL链表。
typedef struct__mem__ __memt__;
typedef __memt__ _MALLOC_MEM_ *__memp__;
__memt__ _MALLOC_MEM_ __mem_avail__ [2] =
{
{ NULL, 0 }, /*堆中空闲内存块头结点 */
{ NULL, 0 }, /* 未使用,但对free函数防止丢失堆空间或误将链表头加入到堆空间,却是必须的 */
/*作者注:__mem_avail__ [1]的存在,并不能防止堆丢失,见后面free函数分析*/
};
#define AVAIL (__mem_avail__[0])
全局数组__mem_avail__实际也是struct __mem__类型,__mem_avail__[0]的next指向堆中首块空闲块,如堆中已无空闲内存块,则__mem_avail__[0]的next为NULL(0值)。为使程序代码简洁,定义了宏AVAIL 来代替__mem_avail__[0]。
2. init_mempool函数剖析
函数int init_mempool ( void _MALLOC_MEM_ *pool, unsigned int size)失败时将返回0,成功则返回-1,参数pool 指向应用程序定义的堆空间,参数size为堆空间的字节数。如果应用程序提供的堆空间太小(size的值太小),将失去实际意义,故函数将返回0表示失败。当size参数足够大,则会初如化AVAIL(即__mem_avail__[0]),使其next域指向pool参数所指向的堆空间,len域为pool参数所指向的堆空间的总字节数size
您可能关注的文档
- JADE-讲解..doc
- javaee党员管理系统课设doc.doc
- JavaScript权威指南之学习笔记(第六版)..doc
- javascript书写规范..doc
- Javascript考试题目选择题..doc
- Javascript部分核心知识详解..doc
- JavaDump分析..doc
- IP网络广播学校施工方案(文字描述)..doc
- JavaSE期末总测试题..doc
- Javaweb开发三大框架整理..doc
- 2023-2024学年广东省深圳市龙岗区高二(上)期末物理试卷(含答案).pdf
- 2023-2024学年贵州省贵阳市普通中学高一(下)期末物理试卷(含答案).pdf
- 21.《大自然的声音》课件(共45张PPT).pptx
- 2023年江西省吉安市吉安县小升初数学试卷(含答案).pdf
- 2024-2025学年广东省清远市九校联考高一(上)期中物理试卷(含答案).pdf
- 广东省珠海市六校联考2024-2025学年高二上学期11月期中考试语文试题.pdf
- 2024-2025学年语文六年级上册第4单元-单元素养测试(含答案).pdf
- 2024-2025学年重庆八中高三(上)月考物理试卷(10月份)(含答案).pdf
- 安徽省安庆市潜山市北片学校联考2024-2025学年七年级上学期期中生物学试题(含答案).pdf
- 贵州省部分校2024-2025学年九年级上学期期中联考数学试题(含答案).pdf
文档评论(0)