首 页       用户登录  |  用户注册
设为首页
加入收藏
联系我们
按字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
按声母检索 A B C D E F G H J K L M N O P Q R S T W X Y Z 数字 符号
您的位置: 5VAR论文频道论文中心理工论文电子通信
   一种嵌入式系统的内存分配方案      ★★★ 【字体: 】  
一种嵌入式系统的内存分配方案
收集整理:佚名    来源:本站整理  时间:2009-01-10 23:51:26   点击数:[]    

OCKS_OF_MEM_SIZE*/

Unsigned short blocks_being_used;/*已使用的块数*/

Void mem_ptr[PAX_BLOCKS_OF_MEM_SIZE];

/*块数组*/

SLList free_data_cells_list; /*空闲链表*/

}BlockMemMgr;

结构中的参数包括:单元尺寸、块尺寸、已用块数、所有块的地址、空闲链表(单向链表)。

(2)缓冲池的管理函数

◆block_mem_create:创建块内存管理器,参数包括内存指针(如为NULL,表示自己分配)、块尺寸、单元尺寸、返回管理器指针。

过程如下:

①检验参数合法性。

②单元尺寸4字节对齐,计算每个块中的单元数。对内存指针进行4字节对齐或者分配内存指针。

③初始化结构BlockMemMgr,包括单元尺寸和块尺寸。设置第1个内存块的指针。如果内存是外来的,设置块已用标志(已用为0),表示不能增加块;否则,已用块数设为1。

④创建空闲链表,将块内所有单元添加到链表中,最后一个单元处于链表的最前面。

⑤返回BlockMemMgr。

◆block_mem_destroy:解构一个块内存管理器,释放它所分配的所有内存,调用者负责外部内存的释放。参数为BlockMemMgr。返回成功失败标志。

①参数合法性检测。

②删除单向链表(设链表指针为NULL)。

③如果块是动态分配的,释放它们。

④释放结构BlockMemMgr。

◆block_malloc:从块内存管理器中分配1个单元

⑤释放结构BlockMemMgr

◆block_malloc:从块内存管理器中分配1个单元。参数为BlockMemMgr,返回数据单元指针。

①参数合法性检测。

②判断空闲链表是否为空(是否为NULL)。如果为空,判断是否可以动态分配块,如果不能,返回失败;如果可以动态分配块,则分配1个块,执行与block_mem_create一样的操作。

③从空闲链表中分配第1个单元,返回其指针。

注意这里有一个小技巧,即数据单元在空闲时其中存放空闲链表的节点信息,而分配后则存放数据内容。

◆block_free:释放1个数据单元,返回块内存管理器。小心不要对1个单元释放2次。参数为BlockMemMgr和单元指针。

①参数合法性检测。

②地址比较,判断数据单元属于哪个块。

③判断数据单元的内容是否为空闲链表节点信息(也就是块内某单元的地址),从而确定是否为2次释放。

④将该数据单元插入到空闲链表的前面。

⑤引用该单元的指针设为NULL。

内存管理代码遵守如下约定:①管理的内存是实际可写的内存;②分配内存是4字节或32位对齐;③block_malloc、block_free在中断级调用是部分安全的,除非BLOCK中已经没有空闲CELL,需要重新调用malloc分配新的BLOCK(而malloc和free就不是安全的,因为其中使用了信号量和搜索算法,容易引起中断服务程序阻塞)。当然,block_mem_create和block_mem_destroy必须在进程级调用。

4.2 TMS中的内存分配

TMS是WindRiver公司为可管理式交换机推出的开发包。它用用IDB来管理各种协议的数据,比如STP和GVRP等。为了支持IDB,它建立了自己的缓冲池管理方案,程序在bufPoolLib.c中。该程序包含用于缓冲池管理的函数,这些函数允许从1个池中分配固定数目和大小的缓冲区。通过预先分配一定数目固定大小的缓冲区,避免了反复的小的内存块分配/释放相关联的内存碎片和浪费。既然它从1个单一的块中分配缓冲池,也比对每一个缓冲区执行1次分配有更高的空间效率。模块对每个缓冲区加上1个标记(MAGIC),释放时会检查标记。模块给用户提供分配和释放操作定义回调函数的能力。这样可以做到自动的对象创建和解构,同时允许由多个缓冲池分配的成员组成的对象做为1个单一的实体删除。这类似于C++中自动的对象构建和解构,不过是用C语言并且没有堆栈分配的负担。模块既允许从堆栈中分配缓冲池(通过calloc),也可以在用户分配的空间中创建它们。模块用1个单向链表来维护未分配的缓冲区,但不跟踪已分配的缓冲区。模块并不是任务安全的,用户需要用信号时来保护缓冲池。

(1)缓冲池结构

typedef struct

{

ulong_t magic; /*用于一致性检测的特殊标记*/

Boolean localAlloc; /*内存是否在创建缓冲区时分配*/

SL_LIST freeList; /*空闲链表*/

Void store; /*缓冲区指向的内存指针*/

STATUS(*createFn)(void*,ulong_t argl); /*创建缓冲区时的回调函数指针*/

STATUS(*destroyFn)(void*,ulong_targl);/*释放缓冲区时的回调函数指针*/

Ulong_t argVal;/*回调函数的参数*/

} buf_pool_t;

结构中的参数包括检查标记MAGIC、是否本地分配、空闲链表、内存指针、创建缓冲池的回调函数指针、释放时的回调函数指针、回调函数参数。

(2)相关函数

◆BufPoolInitializeStorage:分配和初始化存储区。参数包括存储区地址(如为NULL,则本地分配)、缓冲区大小、缓冲区个数。

①根据缓冲区大小和个数获得所需的内存大小。

②如果指针为NULL,则调用calloc分配内存。设置本地分配标志。

③初始化内存为0。

④初始化指针。分配的内存块最前面为缓冲池结构buf_pool_t。实际的存储区紧随其后。Buf_pool_t包含参数检查标记、是否本地分配、存储区地址、分配时回调函数、释放时回调函数、回调函数变量。此时只设置存储区指针。

◆BufPoolCreate:创建缓冲池。参数为内存制止。缓冲

上一页  [1] [2] [3] [4]  下一页


Tags:


文章转载请注明来源于:5VAR论文频道 http://paper.5var.com。本站内容整理自互联网,如有问题或合作请Email至:support@5var.com
或联系QQ37750965
提供人:佚名
  • 上一篇文章:一种用VHDL设计嵌入式WebServer的方案

  • 下一篇文章:电动机性能虚拟仪器测试系统的设计与实现
  • 返回上一页】【打 印】【关闭窗口
    中查找“一种嵌入式系统的内存分配方案”更多相关内容 5VAR论文频道
    中查找“一种嵌入式系统的内存分配方案”更多相关内容 5VAR论文频道
    最新热点 最新推荐 相关新闻
  • ››嵌入式系统的通信规约管理平台设计...
  • ››一种基于七号信令的局间话单采集系...
  • ››对于变频器的制动技术分析
  • ››电子文件管理元数据宏观结构多维分...
  • ››浅论卫星电视接收机的常见故障的检...
  • ››信息时代网络用户信息检索焦虑的心...
  • ››论GIS在高校房产管理中的实际应用
  • ››关于电力通信发展战略的思考 金李莎...
  • ››2G、3G切换精细化优化分析思路探讨...
  • ››光纤自动化生产的需求与时机
  • ››一种嵌入式系统的内存分配方案
  • ››一种嵌入式WEB服务器的设计与实现
  •   文章-网友评论:(评论内容只代表网友观点,与本站立场无关!)
    关于本站 - 网站帮助 - 广告合作 - 下载声明 - 网站地图
    Copyright © 2006-2033 5Var.Com. All Rights Reserved .