嵌入式操作系统内存管理有哪几种

君,已阅读到文档的结尾了呢~~
嵌入式操作系统内存管理机制的设计与实现,嵌入式系统内存分配,嵌入式系统内存管理,嵌入式系统常用内存,模拟实现内存管理机制,操作系统内存管理机制,ios系统内存管理机制,c 实现 内存文件系统,嵌入式工作机制,嵌入式风险防控机制
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
嵌入式操作系统内存管理机制的设计与实现
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口嵌入式系统所用到的内存管理机制主要有以下两种:
1、管理机制:
有一些嵌入式处理器提供了MMU,在MMU具备映射和寻址功能,它使的内存管理更加方便。如果存在MMU ,会使用它完成从虚拟地址到物理地址的转换, 所有的应用程序只需要使用虚拟地址寻址数据。 这种使用虚拟地址寻址整个系统的主存和辅存的方式在现代中被称为。MMU 便是实现的必要条件。虚拟内存的管理方法使系统既可以运行体积比物理内存还要大的应用程序,也可以实现&按需调页&策略,既满足了程序的运行速度,又节约了物理内存空间。
在Linux系统中,虚拟内存机制的实现实现为我们提供了一个典型的例子:在不同的体系结构下, 使用了三级或者两级页式管理,利用MMU 完成从虚拟地址到物理地址之间的转换。基于虚拟内存管理的内存最大好处是:由于不同进程有自己单独的进程空间,十分有效的提高了系统可靠性和安全性。
2、非虚拟内存管理机制:
在实时性要求比较高的情况下,很多嵌入式系统并不需要虚拟内存机制:因为虚拟内存机制会导致不确定性的 I/O阻塞时间, 使得程序运行时间不可预期,这是实时嵌入式系统的致命缺陷;另外,从嵌入式处理器的成本考虑,大多采用不装配MMU 的嵌入式微处理器。所以大多嵌入式系统采用的是实存储器管理策略。因而对于内存的访问是直接的,它对地址的访问不需要经过MMU,而是直接送到地址线上输出,所有程序中访问的地址都是实际的物理地址;而且,大多数嵌入式操作系统对内存空间没有保护,各个进程实际上共享一个运行空间。一个进程在执行前,系统必须为它分配足够的连续地址空间,然后全部载入的连续空间。
由此可见,嵌入式系统的开发人员不得不参与系统的内存管理。从编译内核开始,开发人员必须告诉系统这块开发板到底拥有多少内存;在开发应用程序时,必须考虑内存的分配情况并关注应用程序需要运行空间的大小。另外,由于采用实存储器管理策略,用户程序同内核以及其它用户程序在一个地址空间,程序开发时要保证不侵犯其它程序的地址空间,以使得程序不至于破坏系统的正常工作,或导致其它程序的运行异常;因而,嵌入式系统的开发人员对软件中的一些内存操作要格外小心。
UCOS就是使用非虚拟内存管理的一个例子,在UCOS中,所有的任务共享所有的物理内存,任务之间没有内存保护机制,这样能够提高系统的相应时间,但是任务内存操作不当,会引起系统崩溃。
段式存储管理和页式存储管理的本质区别:&&& 页式存储管理中的逻辑地址有页号和业内地址两部分组成,但作业仍然使用连续的逻辑地址,可把它看作是一维的(线性的)地址结构。用户没有分页的概念,操作系统把作业信息装入主存时才按照块长进行分页。&&& 段式存储管理中的逻辑地址有段号和段内地址两部分组成。他支持用户的分段,每段内的逻辑地址是连续的,而段与段之间的逻辑地址是不连续的。因此段式存储管理中的逻辑地址实际上是采用了二维的地址结构。
阅读(...) 评论()Linux嵌入式系统的内存管理方法详细介绍_Linux系统_ThinkSAAS
Linux嵌入式系统的内存管理方法详细介绍
Linux嵌入式系统的内存管理方法详细介绍
内容来源: 网络
1 嵌入式系统中对内存分配的要求
①快速性。嵌入式系统中对实时性的保证,要求内存分配过程要尽可能地快。因此在嵌入式系统中,不可能采用通用操作系统中复杂而完善的内存分配策略,一般都采用简单、快速的内存分配方案。当然,对实性要求的程序不同,分配方案也有所不同。例如,VxWorks采用简单的最先匹配如立即聚合方法;VRTX中采用多个固定尺寸的binning方案。
②可靠性。也就是内存分配的请求必须得到满足,如果分配失败可能会带来灾难性的后果。嵌入式系统应用的环境千变万化,其中有一些是对可靠性要求极高的。比如,汽车的自动驾驶系统中,系统检测到即将撞车,如果因为内存分配失败而不能相应的操作,就会发生车毁人亡的事故,这是不能容忍的。
③高效性。内存分配要尽可能地少浪费。不可能为了保证满足所有的内存分配请求而将内存配置得无限大。一方面,嵌入式系统对成本的要求使得内存在其中只是一种很有限的资源;另一方面,即使不考虑成本的因素,系统有限的空间和有限的板面积决定了可配置的内存容量是很限的。
2 静态分配与动态分配
究竟应用使用静态分配还是动态分配,一直是嵌入式系统设计中一个争论不休的总是。
当然,最合适的答案是对于不同的系统采用不同的方案。如果是系统对于实时性和可靠性的要求极高(硬实时系统),不能容忍一点延时或者一次分配失败,当然需要采用静态分配方案,也就是在程序编译时所需要的内存都已经分配好了。例如,火星探测器上面的嵌入式系统就必须采用静态分配的方案。
另外,WindRiver公司的一款专门用于汽车电子和工业自动化领域的实时操作系统OSEKWorks中就不支持内存的动态分配。在这样的应用场合,成本不支持内存的动态分配。在这样的应用场合,成本不是优先考虑的对象,实时性和可靠性才是必须保证的。当然,采用静态分配一个不可避免的总是就是系统失去了灵活性,必须在设计阶段就预先知道所需要的内存并对之作出分配;必须在设计阶段就预先考虑到所有可能的情况,因为一旦出现没有考虑到的情况,系统就无法处理。
这样的分配方案必须导致很大的浪费,因为内存分配必须按照最坏情况进行最大的配置,而实际上在运行中可能使用的只是其中的一小部分;而且在硬件平台不变的情况下,不可能灵活地为系统添加功能,从而使得系统的升级变得困难。 大多数的系统是硬实时系统和软实时系统的综合。也就是说,系统中的一部分任务有严格的时限要求,而另一部分只是要求完成得越快越好。
按照RMS(Rate Monotoin Scheduling)理论,这样的系统必须采用抢先式任务调度;而在这样的系统中,就可以采用动态内存分配来满足那一部分可靠性和实时性要求不那么高的任务。采用动态内存分配的好处就是给设计者很大的灵活性,可以方便地将原来运行于非嵌入式操作系统的程序移植到嵌入式系统中,比如,许多嵌入式系统中使用的网络协议栈。如果必须采用静态内存分配,移植这样的协议栈就会困难得多。另外,采用动态内存分配可以使设计者在不改变基本的硬件平台的情况下,比较灵活地调整系统的功能,在系统中各个功能之间作出权衡。例如,可以在支持的VLAN数和支持的路由条目数之间作出调整,或者不同的版本支持不同的协议。
说到底,动态内存分配给了嵌入式系统的程序设计者在比较少的限制和较大的自由。因此,大多数实时操作系统提供了动态内存分配接口,例如malloc和free函数。
3 RTOS提供的内存分配接口
不同的RTOS由于其不同的定位,采用不同的内存分配策略。
例如VRTX中,采用类似于GNU C中由Doug Lea开发的内存分配方案,即Binning算法,系统内存被分成了一些固定尺寸的内存块的算法,系统内存被分成了一些固定尺寸的内存块的集合。这种方法的优点是查找速度快而且不会产生内存碎片。但是,它的缺点也很明显,就是容易造成浪费,因为内存块的尺寸只有有限个,分配时只能取较大的内存块来满足一个较小的需求,累积起来,浪费就很大了;而且操作系统管理这样一个内存分配表也是一个很大的负担。 下面详细介绍一下我们常用的RTOS——美国风河公司(WindRiver)的VxWorks中采用的内存分配策略。
VxWorks的前身就是VRTX,据说VxWorks的名称来自make vrtx work。 VxWorks的内存管理函数存在于2个库中;memPartLib(紧凑的内存分区管理器)和memLib(完整的内存分区管理器)。前者(memPartLib)提供的工具用于从内存分区中分配内存块。该库包含两类程序,一类是通用工具创建和管理内存分区并从这些分区中分配和管理内存块;另一类是标准的malloc/free程序提供与内存分区的接口。系统内存分区(其ID为memSysPartId是一个全局变量)在内核初始化时由usrRoot调用memInit创建。其开始地址为RAM中紧接着VxWorks的BSS段之后,大小为所有空闲内存。
当创建其它分区时,一般需要先调用malloc从系统内存分区中分配一段内存才能创建。内存分区的结构定义为mem_part,包含1个对象标记,1个双向链表管理空闲块,1个信号量保护该分区及一些统计信息,如总尺寸、最大块尺寸、调试选项、已分配的块数、已分配的尺寸等,其语句如下:
typedef struct mem_part { OBJ_CORE objC
DL-LIST freeList;
Unsigned totalWords;
Unsigned minBlockW
unsigned curBlocksA
unsigned curWorkdA
unsigned cumBlockAllocated;
unsigned cumWordsAllocated;
}PARTITION;
一般系统中只有1个内存分区,即系统分区,所有任务所需要的内存直接调用malloc从其中分配。分配采用First-Fit算法(注意这种算法容易导致大量碎片),通过free释放的内存将被聚合以形成更大的空闲块。这就是VxWorks的内存分配机理。分配时可以要求一定的对齐格式。注意,不同的CPU架构有不同的对齐要求。
为了优化性能,malloc返回的指针是经过对齐的,为此的开销随构不同而不同。例如,68K为4字节对齐,开销8字节;SPARC为8字节对齐,开销12字节;MIPS为16字节对齐,开销12字节;I960为16字节对齐,开销16字节。
MemLib库中提供了增强的内存分区管理工具,并且增加了一些接口,而且可以设置调试选项。可以检测2类错误:①尝试分配太大的内存;②释放内存时发现坏块。有4种错误处理选项,当发生错误时记录消息或挂起任务。但是,使用动态内存分配malloc/free时要注意到以下几方面的限制。①因为系统内存分区是一种临界资源,由信号量保护,使用malloc会导致当前调用挂起,因此它不能用于中断服务程序;②因为进行内存分配需要执行查找算法,其执行时间与系统当前的内存使用情况相关,是不确定的,因此对于有规定时限的操作它是不适宜的;③由于采用简单的最先匹配算法,容易导致系统中存在大量的内存碎片,降低内存使用效率和系统性能。
针对这种情况,一般在系统设计时采用静态分配与动态分配相结合的方法。也就是对于重要的应用,在系统初始化时分配好所需要的内存。在系统运行过程中不再进行内存的分配/释放,这样就避免了因内存的分配释放带来的总是。而且在系统初始化,因为没有内存碎片,对于大的内存块的需求容易满足。对于其它的应用,在运行时进行动态内存分配。尤其是某些应用所要求的大量固定尺寸的小内存块,这时就可以采用一次分配多次使用的内存分配方案。下面详细介绍这种内存分配方案及其应用场合。
4 一次分配多次使用的内存分配方案
在嵌入式系统设计中,经常有一些类似于内存数据库的应用。
这些应用的特点是在内存中管理一些树,比如以太网交换机中的MAC地址表、VLAN表等,或者路由器中的路由表。这些树是由许多相同尺寸的节点组成的。这样,就可以每次分配一个大的缓冲池,比如包含多个内存单元的数组,每个内存单元用于1个节点。我们用一个空闲链表来管理该数组中的空闲内存单元。每次程序需要分配内存以创建1个新的节点时,就从空闲链表中取1个单元给调用者。程序删除节点并释放内存时,将释放的内存单元返还给空闲链表。
如果链表中的空闲内存单元取空了,就再次调用malloc从系统内存中分配一个大的内存块作为新的缓冲池。采用这样一种方案主要有如下优点:①减少了malloc/free的调用次数,从而降低了风险,减少了碎片;②因为从缓冲池中取一个内存单元是时间确定的(当然,如果缓冲池耗尽从而需要重新调用malloc分配除外),因此它可以用于严格时限的场合从而保证实时性;③它给用户以自由来添加一些用于内存分配和释放的调试函数以及一些统计功能,更好地监测系统中内存的使用情况。 这种方案必然涉及到一个缓冲池的结构。一般缓冲池的结构由以下几部分组成:单元尺寸、块尺寸(或者单元数目)、缓冲池指针、空闲链表、用于统计和调试的参数等。对缓冲池的操作包括创建缓冲池、释放缓冲池、从缓冲池中分配1个内存单元、释放内存单元回缓冲池等。下面举2个例子说明一下该方案的具体使用情况。
4.1 Intel交换机驱动程序中内存分配
在以Intel的交换芯片为基础的交换机方案中,因为采用的是软件地址学习的方式,需要在内存中维护许多数据,如MAC地址表的软拷贝、VLAN表、静态单播地址表、组播地址表等。这些表都是由一些树组成,每个树由一些固定尺寸的节点组成。一般每个节点几十个字节,每棵树的节点数是可增长的,少则几十,最多可到16K个节点。因此,很适合于采用该方案,具体的实现如下:
(1)缓冲池结构BlockMemMgr typedef struct{ MemSize data_cell_ /*数据单元的尺寸*/ MemSize block_ /*块尺寸*/ /*下面的变量为预定义的每个管理器最多包含的块数,如64 MAX_BLOCKS_OF_MEM_SIZE*/ Unsigned short blocks_being_/*已使用的块数*/ Void mem_ptr[PAX_BLOCKS_OF_MEM_SIZE]; /*块数组*/ SLList free_data_cells_ /*空闲链表*/ }BlockMemM 结构中的参数包括:单元尺寸、块尺寸、已用块数、所有块的地址、空闲链表(单向链表)。
(2)缓冲池的管理函数
◆block_mem_create:创建块内存管理器,参数包括内存指针(如为NULL,表示自己分配)、块尺寸、单元尺寸、返回管理器指针。 过程如下: ①检验参数合法性。 ②单元尺寸4字节对齐,计算每个块中的单元数。对内存指针进行4字节对齐或者分配内存指针。 ③初始化结构BlockMemMgr,包括单元尺寸和块尺寸。设置第1个内存块的指针。如果内存是外来的,设置块已用标志(已用为0),表示不能增加块;否则,已用块数设为1。 ④创建空闲链表,将块内所有单元添加到链表中,最后一个单元处于链表的最前面。 ⑤返回BlockMemMgr。
◆block_mem_destroy:解构一个块内存管理器,释放它所分配的所有内存,调用者负责外部内存的释放。参数为BlockMemMgr。返回成功失败标志。 ①参数合法性检测。 ②删除单向链表(设链表指针为NULL)。 ③如果块是动态分配的,释放它们。 ④释放结构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_ /*用于一致性检测的特殊标记*/ Boolean localA /*内存是否在创建缓冲区时分配*/ SL_LIST freeL /*空闲链表*/ V /*缓冲区指向的内存指针*/ STATUS(*createFn)(void*,ulong_t argl); /*创建缓冲区时的回调函数指针*/ STATUS(*destroyFn)(void*,ulong_targl);/*释放缓冲区时的回调函数指针*/ Ulong_t argV/*回调函数的参数*/ } buf_pool_t;
结构中的参数包括检查标记MAGIC、是否本地分配、空闲链表、内存指针、创建缓冲池的回调函数指针、释放时的回调函数指针、回调函数参数。
(2)相关函数
◆BufPoolInitializeStorage:分配和初始化存储区。参数包括存储区地址(如为NULL,则本地分配)、缓冲区大小、缓冲区个数。 ①根据缓冲区大小和个数获得所需的内存大小。 ②如果指针为NULL,则调用calloc分配内存。设置本地分配标志。 ③初始化内存为0。 ④初始化指针。分配的内存块最前面为缓冲池结构buf_pool_t。实际的存储区紧随其后。Buf_pool_t包含参数检查标记、是否本地分配、存储区地址、分配时回调函数、释放时回调函数、回调函数变量。此时只设置存储区指针。
◆BufPoolCreate:创建缓冲池。参数为内存制止。缓冲区尺寸和个数,创建时回调函数、释放时回调函数、回调函数参数。 ①尺寸对齐。 ②调用bufPoolInitializeStorage初始化内存区和buf_pool_t结构。 ③用传入参数填充buf_pool_t结构。 ④将缓冲区添加到空闲链表中,最后的缓冲区在最前面。
◆BufPoolDestroy:删除缓冲池。参数为buf_pool_t指针。 ①检查缓冲池结构中的MAGIC字段是否被个性。 ②如果是本地分配的则翻放内存区。
◆BufPoolAlloc:从缓冲池中分配一个缓冲区,参数为缓冲池结构指针。如果存在空闲缓冲区,则从空闲链表中除并提供给调用者,执行创建时回调函数。如果回调函数返回错误,则将缓冲区返还给空闲链表。 ①检查缓冲池结构中的MAGIC标记是否完好。 ②从空闲链表中取出头一个节点。 ③如果节点不为空,清空节点,以其地址为参数调用回调函数。 ④如果回调函数返回错误,则将节点还给空闲链表。 ⑤返回得到空闲缓冲区地址。
◆BufPoolFree:将缓冲区返回给缓冲池。如果定义了回调函数,将在归还缓冲之间调用回调函数。参数为缓冲池结构和缓冲区指针。 ①缓冲池MAGIC标记是否完好。 ②如果定义回调函数、调用之。如果返回错误,则设置错误号。 ③将缓冲区添加到空闲链表中头部。 注意该函数有2点:①回调函数返回错误,照样归还缓冲区。②没有检查缓冲区是否二次释放,这一点与Intel的驱动程序不同。 另外,TMS的缓冲池没有BLOCK要领,不需要判断哪个CELL属于哪个BLOCK,简化 了操作。
许多嵌入式应用在RTOS提供的malloc/free的基础上编写自己的内存管理方案。
编写这样的内存管理方案,目的无非有两个:一是减少对malloc/free的依赖,从而避免由之带来的内存碎片、时间不确定等总是;另一个是增强程序的查错能力,送还内存使用错误,对于在嵌入式系统中广泛存在的数据库类型的内存需求,即分配多个固定尺寸的内存单元的要求,“一闪分配,多次使用”的方案无疑是一种很好的解决之道。文中介绍的2个例子很好地体现了它的优越性.
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信博客访问: 137099
博文数量: 161
博客积分: 0
博客等级: 民兵
技术积分: 182
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 系统运维
原文地址: 作者:
&&&&&& 由于嵌入式实时操作系统可以支持多任务,使得程序开发更加容易,在便于维护的同时还能提高系统的稳定性和可靠性,所以逐步成为嵌入式系统的重要组成部分,对嵌入式操作系统的研究变得尤为重要。
&&&& 本文介绍4种嵌入式实时操作系统VxWorks、μClinux、μC/OS-II和eCos,详细分析比较了这4种操作系统的主要性能,并根据分析结果指出了各自的适用领域。 VxWorks、μClinux、μC/OS-II和eCos是4种性能优良并被广泛应用的实时操作系统。本文通过对这4种操作系统的主要性能进行分析与比较,归纳出它们的选型依据和适用领域。
&&&& 1 4种操作系统的介绍
&&&&&& (1)VxWorks
&&&&&&& VxWorks是美国WindRiver公司的产品,是目前嵌入式系统领域中应用很广泛,市场占有率比较高的嵌入式操作系统。VxWorks实时操作系统 由400多个相对独立、短小精悍的目标模块组成,用户可根据需要选择适当的模块来裁剪和配置系统;提供基于优先级的任务调度、任务间同步与通信、中断处 理、定时器和内存管理等功能,内建符合POSIX(可移植操作系统接口)规范的内存管理,以及多处理器控制程序;并且具有简明易懂的用户接口,在核心方面 甚至町以微缩到8 KB。
&&&&&& (2) μC/OS-II
&&&&&& μC/OS-II是在μC-OS的基础上发展起来的,是美国嵌入式系统专家Jean J.Labrosse用C语言编写的一个结构小巧、抢占式的多任务实时内核。μC/OS-II能管理64个任务,并提供任务调度与管理、内存管理、任务间 同步与通信、时间管理和中断服务等功能,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。
&&& && (3)μClinux
&&&&&&& μClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。同标准的Linux相比,μClinux的内核非常小,但是它仍然继承了Linux操作系统的主要特性, 包括良好的稳定性和移植性、强大的网络功能、出色的文件系统支持、标准丰富的API,以及TCP/IP网络协议等。因为没有MMU内存管理单元,所以其多 任务的实现需要一定技巧。
&&&&&&& (4)eCos
&&&&&&&& eCos(embedded Configurable operating system),即嵌入式可配置操作系统。它是一个源代码开放的可配置、可移植、面向深度嵌入式应用的实时操作系统。最大特点是配置灵活,采用模块化设 计,核心部分由小同的组件构成,包括内核、C语言库和底层运行包等。每个组件可提供大量的配置选项(实时内核也可作为可选配置),使用eCos提供的配置 工具可以很方便地配置,并通过不同的配置使得eCos能够满足不同的嵌入式应用要求。
&&&&& 2 性能分析与比较   
&&&&&& 任务管理、任务及中断间的同步与通信机制、内存管理、中断管理、文件系统、对硬件的支持和系统移植这几方面是实时操作系统的主要性能。下面就从这几个方面着手对上述4种操作系统进行分析与比较。
&&&&&&&& 2.1 任务管理
&&&&&& 任务管理是嵌入式实时操作系统的核心和灵魂,决定了操作系统的实时性能。它通常包含优先级设置、多任务调度机制和时间确定性等部分。
&&&&&& 2.1.1 优先级设置
&&&&& 嵌入式操作系统支持多任务,每个任务都具有优先级,任务越重要,赋予的优先级应越高。优先级的设置分为静态优先级和动态优先级两种。静态优先级指的是每个 任务在运行前都被赋予一个优先级,而且这个优先级在系统运行期间是不能改变的;动态优先级则是指每个任务的优先级(特别是应用程序的优先级)在系统运行时 可以动态地改变。
&&&&&& 2.1.2 多任务调度机制
&&&&&&& 任务调度主要是协调任务对计算机系统资源的争夺使用。对系统资源非常匮乏的嵌入式系统来说,任务调度尤为重要,它直接影响到系统的实时性能。通常,多任务调度机制分为基于优先级抢占式调度和时间片轮转调度。
&&&&&&& 基于优先级抢占式调度:系统中每个任务都有一个优先级,内核总是将CPU分配给处于就绪态的优先级最高的任务运行。如果系统发现就绪队列中有比当前运行任 务更高的优先级任务,就把当前运行任务置于就绪队列中,调入高优先级任务运行。系统采用优先级抢占方式进行调度,可以保证重要的突发事件及时得到处理。
&&&&& 时间片轮转调度:让优先级相同的处于就绪状态的任务按时间片使用CPU,以防止同优先级的某一任务长时间独占CPU。
&&&&& 在一般情况下,嵌入式实时操作系统采用基于优先级抢占式调度与时间片轮转调度相结合的调度机制。
&&&&&& 2.1.3 时间的可确定性
&&&& 嵌入式实时操作系统甬数调用与服务的执行时间应具有可确定性。系统服务的执行时间不依赖于应用程序任务的多少。基于此特征,系统完成某个确定任务的时间是可预测的。表1具体列出了4种操作系统的调度机制。
&&&&&&& 4种嵌入式实时操作系统都支持多任务,只是在支持任务数量上和任务调度机制上有所不同。VxWorks具有高效的任务管理功能,它支持多任务,可分配 256个优先级,支持优先级抢占式调试和时间片轮转调度,实时性最好。μC/OS-II内核是针对实时系统的要求设计实现的,只支持基于固定优先级抢占式 调度;调度方法简单,可以满足较高的实时性要求。μClinux在结构上继承了标准Linux的多任务实现方式,分为实时进程和普通进程,分别采用先来先 服务和时间片轮转调度;仅针对中低档嵌入式CPU特点进行改良,且不支持内核抢占。eCos调度方法丰富,提供了两种基于优先级的调度器(即位图调度器和 多级队列调度器),允许用户在进行配置时选择其中一个凋度器,适应性好。
&&&&&& 2.2 任务及中断间的同步与通信机制
&&&&&& 实时操作系统的功能一般要通过若干任务和中断服务程序共同完成。任务与任务之间、任务与中断间任务及中断服务程序之间必须协调动作,互相配合,这就涉及任 务间的同步与通信问题。嵌入式实时操作系统通常是通过信号量、互斥信号量、事件标志和异步信号来实现同步,通过消息邮箱、消息队列、管道和共享内存来提供 通信服务。由于互斥信号量的使用,带来了实时操作系统中常见的优先级反转问题。优先级反转是一种不确定的延迟形式,当高优先级任务企图访问已被低优先级占 有的共享资源时,必须等待低优先级任务释放共享资源;如果这时低优先级任务被一个或多个中优先级任务抢占,那么高优先级任务被延迟的时间将更进一步延长, 实时性难以保证。因此,应采取相关措施以尽鼍避免出现优先级反转问题。实时系统通常采用优先级继承和优先级置顶机制。
&&&&&&& 优先级继承足指拥有互斥量的任务被提升到与下一个在等待该互斥最的最高优先级任务相同的优先级;优先级置顶是指获得互斥量的任务将其优先级提升到一个事先规定好的值。表2为4种操作系统的同步与通信机制的比较。
&&&&&&&& 4种系统都具有灵话的任务间同步与通信机制,都可以通过信号量、消息队列来实现同步与通信,但是VxWorks与μClinux都不支持邮箱和事件标志,而且除了μClinux和eCos中的位图调度器,其他操作系统都采取了措施抑制优先级反转。
&&&&& 2.3 内存管理
&&&&&& 内存管理主要包括:内存分配原则,存储保护和内存分配方式。
&&&&& 2.3.1 内存分配原则
&&&&&&& 内存分配原则包括快速性、可靠性和高效性。其中,快速性要求内存分配过程要尽可能快,所以一般采用简单、快速的分配算法;可靠性指的是内存分配的请求必须 得到满足;系统强调高效性的要求,不仅仅是对系统成本的要求,而且由于系统本身可配置的内存容量也是很有限的,所以要尽可能地避免浪费。
&&&&&&& 2.3.2 存储保护
&&&&&& 通常在操作系统的内存中既有系统程序也有用户程序,为了使两者都能正常运行,避免程序间相互干扰,需要对内存中的程序和数据进行保护。存储保护通常需要硬 件支持,在很多系统中都采用MMU,并结合软件实现;但由于嵌入式系统的成本限制内核和用户程序通常都在相同的内存空间中。
&&&&&& 2.3.3 内存分配方式
&&&&&&& 内存分配方式可分为静态分配和动态分配。静态分配是在程序运行前一次性分配给相应内存,并且在程序运行期间中不允许再申请或在内存中移动;动态分配则允许 在程序运行整个过程中进行内存分配。静态分配使系统失去了灵活性,但对于实时性要求比较高的系统是必需的;而动态分配赋予了系统设计者更多自主性,可以灵 活地调整系统的功能。
&&&&&&& VxWorks对内存的使用采用的是Flat Mode,可被静态或动态链接。VxWorks为用户提供了两种内存区域Region和Partition。Region是变长的内存区,用户可以从创建 的Region中分配Segment,其特点是容易产生碎片,但灵活并且不浪费;Partition是定长的内存区,用户可以从刨建的Partition 中分配Buffer,其特点是不会产生碎片,技率高但是易浪费。  VxWorks采用最先算法分配内存。μC/OS-II把连续的大块内存按分区来管 理,每个分区中都包含整数个大小相同的内存块,但不同分区之间内存的太小可以不同。用户动态分配内存时,只须选择一个适当的分区,按块来分配内存,释放时 将该块放回到以前所属的分区,这样就消除了因多次动态分配和释放内存所引起的碎片问题。μClinux是针对没有MMU的处理器设计的,不能使用处理器的 虚拟内存管理技术,只能采用实存储器管理策略。系统使用分页内存分配方式,在启动时对实际存储器进行分页。系统对内存的访问是直接的操作系统对内存空间没 有保护,多个进程可共享一个运行空间,所以,即使是一个无特权进程调用一个无效指针也会触发一个地址错误,并有可能引起程序崩溃甚至系统崩溃。eCos对 内存分配既不分段也不分页,而是采用一种基于内存池的动态内存分配机制。通过两种内存池类来实现两种内存管理方法:一种是变长的内存池;另一种是定长的内 存池,类似于VxWorb的管理方案。表3为4种操作系统内存管理的比较。
&&&&&& 2.4 中断管理
&&&&&& 中断管理是实时系统中一个很重要的部分,系统经常通过中断与外部事件交互。主要考虑是否支持中断嵌套、中断处理机制、中断延时等。
&&&&& (1)VxWorks的中断管理
&&&&&&&&&& VxWorks操作系统中断管理采用中断处理与普通任务分别在不同栈中处理的中断处理机制,使得中断只会引发一些关键寄存器的存储,而不会导致任务的上下 文切换,从而极大地缩短了中断延时。同时,VxWorks的中断处理程序只能在最短时间内通告中断的发生,而将其他的非实时处理尽量放入被引发的中断服务 程序中来完成,这也缩短了中断延时。但是凼为中断服务程序不在一个固定的仟务上下文中执行,而目没有任务控制块,所以所有中断服务程序使用相同的中断堆 栈。为了能处理最坏情况下的中断嵌套,必须分配足够大的中断堆栈空间。
&&&&& (2)μC/OS-II的中断管理
&&&&&& μC/OS-II中断处理比较简单。一个中断向量上只能挂一个中断服务子程序ISR,而且用户代码必须都在ISR中完成。ISR需要做的事情越多,中断延时也就越长。内核所能支持的最大嵌套深度为255。
&&&&&& (3) μClinux的中断管理
&&&&&&&& μClinux操作系统将中断处理分为两部分:顶半处理和底半处理。在顶半处理中,必须关中断运行,且仅进行必要的、非常少、速度快的处理,其他处理交给 底半处理;底半处理执行那些复杂、耗时的处理,而且接受中断。因为系统中存在有许多中断的底半处理,所以会引起系统中断处理的延时。 (4)eCos的中断管理 eCos使用了分层式中断处理机制,把中断处理分为传统的ISR和滞后中断服务程序DSR。类似于μClinux的处理机制,这种机制可以在中断允许时 运行DSR,因此在处理较低优先级中断时允许高优先级的中断和处理。为了极大地缩短中断延时,ISR应当可以快速运行。如果中断引起的服务量少,则ISR 可以单独处理中断;如果中断服务复杂,则ISR只屏蔽中断源,然后交由DSR处理。 &&&&&&& 2.5 文件系统
&&&&&&&&& 所谓“文件系统”是指负责存取和管理文件信息的机构,也可以说是负贵文件的建立、撤销、组织、读写、修改、复制,以及对文件管理所需的其他资源实施管理的 软件部分。VxWorks操作系统在文件系统与设备驱动程序之间使用一种标准的I/O口操作接口,且支持MS-DOS、RT-11、RFS、CD- ROM、RAW等文件系统。这样,在单个VxWorks操作系统中可以运行多个相同或不同种类的文件系统。μC/OS-II是面向中小型嵌入式系统的,即 使包含全部功能,编译后内核也不到10 KB,所以系统本身并没有提供对文件系统的支持。但是μC/OS-II具有良好的扩展性能,如果需要也可自行加入文件系统的内容。μClinux继承了 Linux完善的文件系统性能,它支持ROMFS、NFS、ext2、MS-DOS、JFFS等文件系统。但一般采用ROMFS文件系统,这种文件系统相 对于一般的文件系统(如ext2)占用更少的空间。但是ROMFS文件系统不支持动态擦写保存,对于系统需要动态保存的数据须采用虚拟RAM盘/JFFS 的方法进行处理。eCos操作系统的可配置性非常强大,用户可以自己加入所需的文件系统。
&&&&&& 2.6 对硬件的支持
&&&&&&&& VxWorks、μC/OS-II、μClinux和eCos这4种操作系统都支持当前流行的大部分嵌入式CPU。μC/OS-II支持从8位到32位的 CPU,VxWorks、μClinux和eCos可以在16位、32位和64位等不同体系结构之间移植。由于μClinux继承了Linux的大部分性 能,所以至少需要512KB的RAM空间,lMB的ROM/Flash空间;而μC/OSII和eCos由于本身内核就很小,经过裁剪后的代码最小可以分 别为2 KB和10 KB,所需的最小数据RAM空间分别为4 KB和10 KB。总的来说,4种系统对硬件的要求比较低,比较经济。具体比较如表4所列。
&&&&&& 2.7 系统移植
&&&&&&&& 嵌入式操作系统移植的目的是使嵌入式操作系统能在某个微处理器或微控制器上运行。4种系统中VxWorks是商用操作系统的有很多API函数及相关技术支 持,所以移植和二次开发比较容易,但是移植成本较高。其他3种系统的结构化设计便于把与处理器相关的部分分离出来,所以被移植到新的处理器上也是可能的。 μC/OS-II的移植相对比较简单,只需要修改与处理器相关的代码就可以了。μClinux是Linux针对嵌入式系统的一种改良,其结构比较复杂。移 植μClinux,目标处理器除了应满足μC/OS-II移植所需的条件外,还需要足够容量的外部ROM和RAM。eCos系统的可移植性明显比 μC/OS-II和μClinux好。在eCos系统中,每个硬件平台都有一个单独的目录,用于存放引对这一硬件平台的硬件抽象层的代码和配置信息;而 μClinux的硬件抽象层的代码则分布在好几个目录中,通过命令来选择不同硬件平台的代码。所以,修改eCos代码相对简单,移植也相对容易。
&&&&& 结论   
&&&&&&& 这4种嵌入式实时操作系统在嵌入式系统的应用非常广泛,但是又具有各自的特点。根据上述比较,归纳出各自的适用领域。 ①VxWorks是一套娄似于Unix的实时操作系统,它内建了符合POSIX规范的内存管理,以及多处理器控制程序,并且具有简明易懂的用户接口,在 核心方面甚至可以微缩到8 KB。它由400多个相对独立的、短小精悍的目标模块组成,用户可根据需要选择适当模块来裁剪和配置系统,有效地保证了系统的安全性和可靠性。它被广泛地 应用在通信、军事、航空、航天等高尖技术及实时性要求极高的领域,尤其是在许多关键应用方面,VxWorks还是一枝独秀。例如,美国波音公司就在其最新 的787客机中采用了此操作系统;而在外层空间探索领域,VxWorks则一直是美国太空总署NASA的最爱。 ②μC/OS-II是一个结构简单、功能完备和实时性很强的嵌入式操作系统内核,适合于广大的嵌入式系统开发人员和爱好者入门学习,以及高校教学和科研。μC/OSII很适合开发那些对系统要求不是很苛刻,且RAM和ROM有限的各种小型嵌入式系统设备。 ③μClinux最大特点在于针对无MMU处理器设计,可以利用功能强大的Linux资源,因此适合开发对事件要求不高的小容量、低成本的各类产品,特 别适用于开发与网络应用密切相关的嵌入式设备或者PDA设备。例如,CISCO公司的/4000路由器就是基于μClinux操作系统 开发的。 ④eCos最大特点是配置灵活,而月是面向深度嵌入 式应用的,很适合用于一些商业级或工业级对成本敏感的
&&&&&&&& 嵌入式系统,例如消费电子类领域中的一些应用。
本文来源:单片机及嵌入式系统应用&&&& 作者:西安电子科技大学 胡曙辉 陈健
阅读(386) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 嵌入式系统内存管理 的文章

 

随机推荐