微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 电源设计 > Nucleus操作系统内存池模块移植的研究与应用

Nucleus操作系统内存池模块移植的研究与应用

时间:01-20 来源:互联网 点击:

创建时,首先为控制块指针赋值,内存池大小与最小分区大小进行字对齐校正;判断控制块指针、起始地址、最小分配空间、挂起标志是否合法。创建过程如下:初始化控制块中的各个参数,并按图5初始化小块、创建小块双向循环链表,与静态分配相同需要先进行线程保护再加入到池动态内存池链表。
2.2 动态内存池的申请
动态申请主要用于操作系统内模块(如任务、队列等)的堆栈分配与模块占用空间的分配。由于在TD-LTE无线综合测试仪中这些分配的空间大小浮动不定,因此需要使用动态分配内存。Nucleus中动态分配采用首次匹配原则,每一次申请内存时动态分配申请大小加16 B(这个16 B的头对应剩下的可用空间)的内存池空间,并把分配过的部分设置为不可用状态free=‘0x00’。
负责实现的函数是DMC_Allocate_Memory。首先进行各种参数的合法性检测,然后将分配空间size小于最小分配空间的分配空间大小赋值为最小空间,对size进行字对齐处理,调用线程保护后采用首先匹配法来找适用空间,即:在循环体中先判断free标志,是空闲块(free=‘0x01’),则算出减去本次分配的头后所剩的空间,当此空间大于本次请求size时进行分配,小于时则移动到下一个块;若不是空闲块,则直接把剩余空间设置为0进行后面小于size时移动到下一个块的判断。注意:这里用到了控制块中的dm_search_ptr属性(结构与小块的头相同),该属性用于记录开始匹配的起始位置,作为判断循环体结束的条件之一,如果循环到此处,就表示没有找到可分配空间。图6是动态分配的流程图。

循环结束后判断是否找到可用于分配的块,若找到则进行是否需要分割该可用块的判断。条件是这个可用块的大小大于或等于本次所需空间size+头大小+最小分配空间的值,若满足此条件则分割出一个新块并对其加头初始化,再计算出剩余可用空间;不满足此条件则直接计算剩余可用空间。分配的空间标志为非空闲后,把所分配空间的地址赋给指向调用的内存指针(注意去头)。为提高效率,还需要进行一个简单处理,即判断如果在搜索块时一次性匹配成功,则将dm_search_ptr移向下一个块。
如果没有找到可用块则将任务挂起等待,没有采用挂起模式则直接返回NULL给指向调用的内存指针,最后调用TCT_Unprotect解保护。图7是分配第一块内存后动态内存池的结构。

2.3 动态内存池的释放
释放过 程与静态类似,需要注意的是,如果相邻块有空闲块需要合并,则合并后把dm_search_ptr指向当前合并的空闲块。
动态分配内存的算法复杂度要高于静态分配,从时间复杂度来看,静态分配是O(1)、动态是O(n)。但是动态分配的内存利用率要高于静态分配内存[5],在实际应用中要结合具体情况决定采用何种分配方式。在本设计中合理使用了两种分配方式:在静态分配中进行密度的动态判断,在动态分配中进行静态的最小分配大小匹配。动、静相结合,使操作系统在分配中尽可能地节约内存的同时,有效减少了内存碎片。本分配方式已经运用于TD-LTE无线综合测试仪中,在实现操作系统基本内存管理功能的同时,满足了TD-LTE无线综合测试仪对系统内存资源和调度时间的设计要求。
参考文献
[1] 冯宝祥,王桂棠.嵌入式实时操作系统Nucleus PLUS在S3C2410A上移植的实现[J].电子设计应用,2007(5):104-106.
[2] 王小银,陈莉君.Linux内核中内存池的实现及应用[J]. 西安邮电学院学报,2001,16(4):40-43.
[3] 张磊,王忠仁.嵌入式系统中一种池式内存管理中应用 [J].实验科学与技术,2007,5(2):150-152
[4] LMAS S H.An application-level memory management service[C].ICTTA 2008.3rd International Conference on.7-11 April 2008:1-4.
[5] MUTSCHLER D W.Enhancement of memory pools toward a multi-threaded implementation of the Joint integrated mission model(JIMM)[C].WSC 06.Proceedings of the Winter.3-6 Dec.2006:856-862.

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top