(1)内存和外部存储器的概念:一般RAM属于内存而Flash、ROM、NVRAM是嵌入式操作系统的外部存储器;
(2)操作系统的内存分配一般都在系统启动或者复位的情况下进行,在运行时尽量避免内存动态申请和释放,因为这样会带来系统的不稳定性;
(3)vxworks为用户提供了2中内存区域:一种是Region内存域,是可变长的内存区域;另一种是partition内存分区,是定长的;vxworks内核和应用程序对内存的操作都是基于内存分区进行的;
(1)vxworks 中主要涉及到的内存单元的概念有:内存分区、内存池、内存块;
①内存池是一块连续的内存区域,包含一块或者多块内存块;这些区域由memPartAlloc和memPartFree来申请和释放;
②内存分区:包含自身的描述信息和一个或者多个内存池,描述信息保存在内存分区中而内存池就是该内存分区拥有的实际内存空间;内存分区在刚创建的时候
只有一个内存池,用户程序可以往该内存分区中增加别的内存池,操作系统和通常大部分用户对内存的操作,都发生在系统的内存池中;
(2)vxworks启动的是BootRom+vxworks方式,那么系统中先后存在2种内存布局;
reboot启动系统时,内存RESERVED和USE_REVERSE_MEM不会清楚UIqing这俩快内存区域,系统冷启动时会清楚所有的内存区域;因此可以利用热启动不进行清清除这俩块内存区域来记录一些非常关键的信息写入USE_REVERSE_MEM中来 解决问题,
①可用表:即一张二维表格,每个表项记录了一个空闲内存块,主要参数包括块号、长度、起始地址;管理比较简单,但是表的大小无法确定,自身需要占用内存;
②自由链:自由链利用每个空闲块开始的几个内存单元存放本空闲块的大小以及下个空闲块的起始地址;缺点是查询量较大,但是自由链指针利用了自身的空闲单元,因此不需要额外占用内存块;链表大小没有限制,容易添加或者删除节点,vxworks中利用自由链来管理内存空闲块;
①最先适应法:可用表和自由链按起始地址递增的次序排列,特点:一旦找到大于或者等于所要求的内存长度的内存块,则结束搜索;该算法将从找到的内存划分出用户需要的内存分配给用户,如果相邻的有空闲块则将剩余部分与空闲块合并;
②最佳适应法:要求空闲内存块按照从小到大的次序组成可用表或自由链。当系统申请一个内存时,内存管理程序从表头开始查找直到找到大雨裹着等于需要的空闲内存块为止,当内存块大于申请的内存块时,按照最先适应法去处理;
③最坏适应法:与最佳适应法正好相反,要求空闲块按照从大到小的次序组成可用表或者西游链,当系统申请内存时首先检查第一个空闲块的大小是否等于或大于所要求的内存块大小,如果大于则分配给用户,然后调整空闲块的可用表或者自由链;
三种方法最佳适应法具有最佳性能,由于最先适应法和最坏适应法都需要对空闲内存块进行排序,而最佳适应法只是调整空闲块的大小,位置并未发生改变;最先适应法得到的内存空间最接近用户所需求内存的大小,往往剩下的空闲内存块会很小,不便于得到利用,容易产生碎片;相反最坏适应法剩下的空闲块可能会大,容易被使用,相对减少内存碎片的产生;vxworks基于以上原因和嵌入式系统的实时性采用了最先适应法;vxworks没有清楚碎片的功能,因此在实时系统设计中应该尽量避免内存碎片的产生;
1、创建内存分区memPartCreate,该函数创建了一个内存分区,包含一个内存值,返回值为分区ID,以便之后进行操作,有了内存分区就方便管理多个内存池;
PART_ID memPartCrete
{
/*内存分区的起始地址*/
char *pPool;
/*内存分区的大小*/
unsigned poolSize;
}
2、memPartAddToPool在内存分区中增加一个额外单独的内存池,每调用一次memPartAddToPool分区中的内存池数量就加1;一个分区中相邻的内存池地址不一定连续创建成功返回OK,失败返回ERROR;
STATUS memPartAddToPool
{
/*内存分区的ID*/
FAST PART_ID partId;
/*内存池的起始地址*/
FAST char *pPool;
/*内存池的大小*/
FAST unsigned poolSize;
}
3、memPartAlignedAlloc在指定内存分区的内存池中分配一个内存块时2的整数次幂的内存块;
void *memPartAlignedAlloc
{
FAST PART_ID partId;
unsigned nBytes;
unsigend aligment;
}
在没有内存共享的情况下memPartAlignedAlloc和memPartAlloc作用相同;
4、memPartFree/malloc/free/calloc/cfree登;