keilc动态内存管理机制分析及改进

keilc动态内存管理机制分析及改进

ID:18879404

大小:48.50 KB

页数:5页

时间:2018-09-26

keilc动态内存管理机制分析及改进_第1页
keilc动态内存管理机制分析及改进_第2页
keilc动态内存管理机制分析及改进_第3页
keilc动态内存管理机制分析及改进_第4页
keilc动态内存管理机制分析及改进_第5页
资源描述:

《keilc动态内存管理机制分析及改进》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、2.(6068a)《KeilC动态内存管理机制分析及改进※》P74全文如下:KeilC动态内存管理机制分析及改进丁明亮熊真春[摘要]通过对C51中init_mempool,malloc,free三个函数源代码的分析,深入分析C51的动态内存管理机制,同时也给出一些使init_mempool函数更完善和除去free函数中的一个错误的建议。[关键词]C51动态内存管理分析Abstract:basedontheanalysistosourcesoffunctioninit_mempool,mallocandfree,thisarticleprobesthedynamicmemorymanageme

2、ntofC51Library,andgivesoutsomeadvicestobetterfunctioninit_mempoolandtoclearabugoffunctionfree.Keywords:C51dynamicmemorymanagement50.前言KeilC是常用的嵌入式系统编程工具,它通过init_mempool,mallloc,free等函数,提供了动态存储管理管理等功能。本文希望通过init_mempool,mallloc,free三个KeilC库函数源代码的分析,揭示了其实现的原理和方法,也对其中的不足作了改进,以使KeilC编程人员更好地应用动态存储管理。1.相

3、关数据结构、变量及说明在KeilC安装目录下的c51lib目录下,有实现init_mempool,mallloc,free三个函数的C源文件init_mem.c,malloc.c,free.c,下面针对keilC7.5A版,将其中与动态存储管理相关的数据结构介绍如下:#define_MALLOC_MEM_xdata/*该行在stdlib.h文件中*/struct__mem__{struct__mem___MALLOC_MEM_*next;/*单链表*/unsignedintlen;/*下一块长度*/};该结构的next指向堆中的下一空闲内存块,len表示该空闲块除去该块首部的struct

4、__mem__结构所占的字节数后,该块实际可用的字节数。由于next是一个指向XDATA区的指针,故在KeilC中应用程序所定义的堆空间应在XDATA段中定义。在KeilC中,堆中的所有的空闲内存块是用一个单链表来管理的,struct_mem_即为该链表结点的结构,后面定义的宏AVAIL为该链表的首结点,为叙述方便,以下将该链表称为AVAIL链表。typedefstruct__mem____memt__;typedef__memt___MALLOC_MEM_*__memp__;__memt___MALLOC_MEM___mem_avail__[2]={{NULL,0},/*堆中空闲内存块头结

5、点*/{NULL,0},/*未使用,但对free函数防止丢失堆空间或误将链表头加入到堆空间,却是必须的*//*作者注:__mem_avail__[1]的存在,并不能防止堆丢失,见后面free函数分析*/};#defineAVAIL(__mem_avail__[0])全局数组__mem_avail__实际也是struct__mem__类型,__mem_avail__[0]的next指向堆中首块空闲块,如堆中已无空闲内存块,则__mem_avail__[0]的next为NULL(0值)。为使程序代码简洁,定义了宏AVAIL来代替__mem_avail__[0]。2.init_mempool函数剖

6、析函数intinit_mempool(void_MALLOC_MEM_*pool,unsignedintsize)失败时将返回0,成功则返回-1,参数pool指向应用程序定义的堆空间,参数size为堆空间的字节数。如果应用程序提供的堆空间太小(size的值太小),将失去实际意义,故函数将返回0表示失败。当size参数足够大,则会初如化AVAIL(即__mem_avail__[0]),使其next域指向pool参数所指向的堆空间,len域为pool参数所指向的堆空间的总字节数size。其在KeilC57.5A库中init_mem.c的源代码如下所示。#defineHLEN(sizeof(__m

7、emt__))#defineMIN_POOL_SIZE(HLEN*10)intinit_mempool(void_MALLOC_MEM_*pool,unsignedintsize){if(sizene

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。