`KeilC动态内存管理机制分析及改进.doc

`KeilC动态内存管理机制分析及改进.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

sa1fs5g1xc1I + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档