- 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
您可能关注的文档
- `90后大学生的心理状况调查报告.doc
- `600MW超临界机组协调控制系统的应用研究.doc
- `91站运营数据分析实例(百度商桥统计).doc
- `7引言正文边云霞我国城镇居民消费结构研究.doc
- `973项目书2010CB529500先天性心脏病形成发展和干预的基础研究.doc
- `973项目申报书2011CB605800G高性能炭炭复合材料高效制备与服役基础研究.doc
- `ACCP静脉血栓栓塞症的预防指南.doc
- `AgCl(油酸)—PMMA复合材料的研究开题报告.doc
- `ABB变频器的常见故障及维修对策.doc
- `A22012建设工程安全生产管理试题(三类人员).doc
- 《JJF 2132-2024荧光紫外灯人工气候老化试验装置校准规范:辐射照度参数》.pdf
- JJF 2120-2024轮速传感器校准规范.pdf
- 计量规程规范 JJF 2120-2024轮速传感器校准规范.pdf
- 《JJF 2129-2024钙钛矿太阳电池校准规范:光电性能参数》.pdf
- JJF 2129-2024钙钛矿太阳电池校准规范:光电性能参数.pdf
- 《JJF 2120-2024轮速传感器校准规范》.pdf
- JJF 2117-2024沥青混合料理论最大相对密度仪校准规范.pdf
- JJF 2116-2024特定蛋白分析仪校准规范.pdf
- 《JJF 2116-2024特定蛋白分析仪校准规范》.pdf
- 计量规程规范 JJF 2117-2024沥青混合料理论最大相对密度仪校准规范.pdf
文档评论(0)