00000003.htm

来自「水木社区 embeded 版精华区 下载」· HTM 代码 · 共 319 行 · 第 1/3 页

HTM
319
字号
<?xml version="1.0" encoding="gb2312"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"/><title>vxworks内核                            doot </title></head><body><center><h1>BBS 水木清华站∶精华区</h1></center><a name="top"></a>发信人:&nbsp;plato&nbsp;(纯真年代),&nbsp;信区:&nbsp;Embedded&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />标&nbsp;&nbsp;题:&nbsp;VXWORKS内核分析(转)&nbsp;<br />发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Wed&nbsp;Apr&nbsp;25&nbsp;22:11:57&nbsp;2001)&nbsp;<br />&nbsp;<br />1.&nbsp;实时操作系统的结构&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;在计算的早期开发的操作系统的最原始的结构形式是一个统一的实体(monolithic)&nbsp;<br />。在这样的系统中,提供的不同功能的模块,如处理器管理、内存管理、输入输出等,&nbsp;<br />通常是独立的。然而他们在执行过程中并不考虑其他正在使用中的模块,各个模块都以&nbsp;<br />相同的时间粒度运行。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;由于现代实时环境需要许多不同的功能,以及在这样的环境中存在的并发活动所引&nbsp;<br />起的异步性和非确定性,操作系统变得更加复杂。所以早期操作系统的统一结构的组织&nbsp;<br />已经被更加精确的内部结构所淘汰。&nbsp;<br />层次结构的起点----内核&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;操作系统的最好的内部结构模型是一个层次性的结构,最低层是内核。这些层次可&nbsp;<br />以看成为一个倒置的金字塔,每一层都建立在较低层的功能之上。&nbsp;内核仅包含一个操作&nbsp;<br />系统执行的最重要的低层功能。正象一个统一结构的操作系统,内核提供了在高层软件&nbsp;<br />与下层硬件之间的抽象层。然而,内核仅提供了构造操作系统其他部分所需的最小操作&nbsp;<br />集。&nbsp;<br />对一个实时内核的要求&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;一个实时操作系统内核需满足许多特定的实时环境所提出的基本要求,这些包括:&nbsp;<br />&nbsp;多任务:由于真实世界的事件的异步性,能够运行许多并发进程或任务是很重要的。多&nbsp;<br />任务提供了一个较好的对真实世界的匹配,因为它允许对应于许多外部事件的多线程执&nbsp;<br />行。系统内核分配CPU给这些任务来获得并发性。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;抢占调度:真实世界的事件具有继承的优先级,在分配CPU的时候要注意到这些优先&nbsp;<br />级。基于优先级的抢占调度,任务都被指定了优先级,&nbsp;在能够执行的任务(没有被挂起&nbsp;<br />或正在等待资源)中,优先级最高的任务被分配CPU资源。换句话说,当一个高优先级的&nbsp;<br />任务变为可执行态,它会立即抢占当前正在运行的较低优先级的任务。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;快速灵活的任务间的通信与同步:在一个实时系统中,可能有许多任务作为一个应&nbsp;<br />用的一部分执行。系统必须提供这些任务间的快速且功能强大的通信机制。内核也要提&nbsp;<br />供为了有效地共享不可抢占的资源或临界区所需的同步机制。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;方便的任务与中断之间的通信:尽管真实世界的事件通常作为中断方式到来,但为&nbsp;<br />了提供有效的排队、优先化和减少中断延时,我们通常希望在任务级处理相应的工作。&nbsp;<br />所以需要杂任务级和中断级之间存在通信。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;性能边界:一个实时内核必须提供最坏情况的性能优化,而非针对吞吐量的性能优&nbsp;<br />化。我们更期望一个系统能够始终以50微妙执行一个函数,而不期望系统平均以10微妙&nbsp;<br />执行该函数,但偶尔会以75微妙执行它。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;特殊考虑:由于对实时内核的要求的增加,必须考虑对内核支持不断增加的复杂功&nbsp;<br />能的要求。这包括多进程处理,Ada和对更新的、功能更强的处理器结构如RISC的支持。&nbsp;<br />&nbsp;<br />拥有其它名字的内核&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;许多商用化的内核支持的功能远强于上面所列的要求。在这方面,他们不是真正的&nbsp;<br />内核,而更象一个小的统一结构的操作系统。因为他们包含简单的内存分配、时钟管理&nbsp;<br />、甚至一些输入输出系统调用的功能。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;这种分类不仅仅是在语义上的争论,在这篇文章的后面章节将说明限制内核功能和&nbsp;<br />油画这些功能的重要性。&nbsp;<br />2.&nbsp;VxWorks内核:Wind&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VxWorks操作系统是一种功能最全的现在可以获得的独立于处理器的实时系统。然而&nbsp;<br />,VxWorks是带有一个相当小的真正微内核的层次结构。内核仅提供多任务环境、进程间&nbsp;<br />通信和同步功能。这些功能模块足够支持VxWorks在较高层次所提供的丰富的性能的要求&nbsp;<br />。&nbsp;通常内核操作对于用户是不可见的。应用程序为了实现需要内核参与的任务管理和同&nbsp;<br />步使用一些系统调用,但这些调用的处理对于调用任务是不可见的。应用程序仅链接恰&nbsp;<br />当的VxWorks例程(通常使用VxWorks的动态链接功能),就象调用子程序一样发出系统&nbsp;<br />调用。这种接口不象有些系统需要一个笨拙的跳转表接口,用户需要通过一个整数来指&nbsp;<br />定一个内核功能调用。&nbsp;<br />多任务&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;内核的基本功能是提供一个多任务环境。多任务使得许多程序在表面上表现为并发&nbsp;<br />执行,而事实上内核是根据基本的调度算法使他们分段执行。每个明显独立的程序被成&nbsp;<br />为一个任务。每个任务拥有自己的上下文,其中包含在内核调度使该任务执行的时候它&nbsp;<br />所看到的CPU环境和系统资源。&nbsp;<br />任务状态&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;内核维护系统中的每个任务的当前状态。状态迁移发生在应用程序调用内核功能服&nbsp;<br />务的时候。下面定义了wind内核状态:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;就绪态----一个任务当前除了CPU不等待任何资源&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;阻塞态----一个任务由于某些资源不可获得而被阻塞&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;延迟态----一个任务睡眠一段时间&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;挂起态----主要用于调试的一个辅助状态,挂起禁止任务的执行&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;任务被创建以后进入挂起态,需要通过特定的操作使被创建的任务进入就绪态,这&nbsp;<br />一操作执行速度很快,使应用程序能够提前创建任务,并以一种快捷的方式激活该任务&nbsp;<br />。&nbsp;<br />调度控制&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;多任务需要一个调度算法分配CPU给就绪的任务。在VxWorks中默认的调度算法是基&nbsp;<br />于优先级的抢占调度,但应用程序也可以选择使用时间片轮转调度。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;基于优先级抢占调度:基于优先级的抢占调度,每个任务被指定一个优先级,内核&nbsp;<br />分配CPU给处于就绪态的优先级最高的任务。调度采用抢占的方式,是因为当一个优先级&nbsp;<br />高于当前任务的任务变为就绪态时,内核将立即保存当前任务的上文,并切换到高优先&nbsp;<br />级任务的上文。VxWorks有从0到255共256个优先级。在创建的时候任务被指定一个优先&nbsp;<br />级,在任务运行的过程中可以动态地修改优先级以便跟踪真实世界的事件优先级。外部&nbsp;<br />中断被指定优先于任何任务的优先级,这样能够在任何时候抢占一个任务。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;时间片轮转:基于优先级抢占调度可以扩充时间片轮转调度。时间片轮转调度允许&nbsp;<br />在相同优先级的处于就绪态的任务公平地共享CPU。没有时间片轮转调度,当有多个任务&nbsp;<br />在同一优先级共享处理器时,一个任务可能独占CPU,不会被阻塞直到被一个更高优先级&nbsp;<br />的任务抢占,而不给同一优先级的其他任务运行的机会。如果时间片轮转被使能,执行&nbsp;<br />任务的时间计数器在每个时钟滴答递增。当指定的时间片耗尽,计数器会被清零,该任&nbsp;<br />务被放在同一优先级任务队列的队尾。加入特定优先级组的新任务被放在该组任务的队&nbsp;<br />尾,并将运行计数器初始化为零。&nbsp;<br />基本的任务函数&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用于状态控制的基本任务函数包括一个任务的创建、删除、挂起和唤醒。一个&nbsp;<br />任务也可以使自己睡眠一个特定的时间间隔不去运行。&nbsp;<br />许多其他任务例程提供由任务上下文获得的状态信息。这些例程包括访问一个任务当前&nbsp;<br />处理器寄存器控制。&nbsp;<br />任务删除问题&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;wind内核提供防止任务被意外删除的机制。通常,一个执行在临界区或访问临界资&nbsp;<br />源的任务要被特别保护。我们设想下面的情况:一个任务获得一些数据结构的互斥访问&nbsp;<br />权,当它正在临界区内执行时被另一个任务删除。由于任务无法完成对临界区的操作,&nbsp;<br />该数据结构可能还处于被破坏或不一致的状态。而且,假想任务没有机会释放该资源,&nbsp;<br />那麽现在其他任何任务现在就不能获得该资源,资源被冻结了。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;任何要删除或终止一个设定了删除保护的任务的任务将被阻塞。当被保护的任&nbsp;<br />

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?