00000002.htm

来自「水木社区 embeded 版精华区 下载」· HTM 代码 · 共 191 行

HTM
191
字号
<?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>psos的简单介绍。                       turbolinux </title></head><body><center><h1>BBS 水木清华站∶精华区</h1></center><a name="top"></a>发信人:&nbsp;doot&nbsp;(ltt),&nbsp;信区:&nbsp;Embedded&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />标&nbsp;&nbsp;题:&nbsp;psos的简单介绍。&nbsp;<br />发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Wed&nbsp;Oct&nbsp;25&nbsp;11:42:14&nbsp;2000)&nbsp;<br />&nbsp;<br />是别人翻译的。xixi&nbsp;<br />pSOS系统结构&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pSOS是一个由标准软组件组成的,可剪裁的实时操作系统。其系统结构如图2.1所示&nbsp;<br />&nbsp;<br />,它分为内核层、系统服务层、用户层。&nbsp;<br />1.&nbsp;内核层&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pSOS内核负责任务的管理与调度、任务间通信、内存管理、实时时钟管理、中断服&nbsp;<br />&nbsp;<br />务;可以动态生成或删除任务、内存区、消息队列、信号灯等系统对象;实现了基于优&nbsp;<br />&nbsp;<br />先级的、选择可抢占的任务调度算法,并提供了可选的时间片轮转调度。pSOS&nbsp;Kernel还&nbsp;<br />&nbsp;<br />提供了任务建间通信机制及同步、互斥手段,如消息、信号灯、事件、异步信号等。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pSOS操作系统在Kernel层中将与具体硬件有关的操作放在一个模块中,对系统服务层&nbsp;<br />&nbsp;<br />以上屏蔽了具体的硬件特性,从而使得pSOS很方便地从支持Intel&nbsp;80x86系列转到支持MC&nbsp;<br />&nbsp;<br />68XXX系列,并且在系统服务层上对不同应用系统不同用户提供标准的软组件如PNA+、&nbsp;<br />PHILE+等。&nbsp;<br />2.&nbsp;系统服务层&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pSOS系统服务层包括PNA+、PRPC+、PHILE+等组件。PNA+实现了完整的基于流的TCP&nbsp;<br />&nbsp;<br />/IP协议集,并具有良好的实时性能,网络组件内中断屏蔽时间不大于内核模块中断屏蔽时&nbsp;<br />&nbsp;<br />间。PRPC+提供了远程调用库,支持用户建立一个分布式应用系统。PHILE+提供了文件系&nbsp;<br />&nbsp;<br />统管理和对块存储设备的管理。PREPC+提供了标准的C、C++库,支持用户使用C、C++语言&nbsp;<br />&nbsp;<br />编写应用程序。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;由于pSOS内核屏蔽了具体的硬件特性,因此,pSOS系统服务层的软组件是标准的、与&nbsp;<br />&nbsp;<br />硬件无关的。这意味着pSOS各种版本,无论是对80X86系列还是MC68XXX系列,其系统服务&nbsp;<br />&nbsp;<br />层各组件是标准的、同一的,这减少了软件维护工作,增强了软件可移植性。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;每个软组件都包含一系列的系统调用。对用户而言,这些系统调用就象一个个可重入&nbsp;<br />&nbsp;<br />的C函数,然而它们却是用户进入pSOS内核的唯一手段。&nbsp;<br />3.&nbsp;用户层&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;用户指的是用户编写的应用程序,它们是以任务的形式出现的。任务通过发系统调&nbsp;<br />&nbsp;<br />用而进入pSOS内核,并为pSOS内核所管理和调度。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pSOS为用户还提供了一个集成式的开发环境(IDE)。pSOS_IDE可驻留于UNIX或DOS&nbsp;<br />&nbsp;<br />环境下,它包括C和C++优化编译器、CPU和pSOS模拟仿真和DEBUG功能。&nbsp;<br />pSOS内核机制&nbsp;<br />§3.1&nbsp;&nbsp;几个基本概念&nbsp;<br />3.1.1&nbsp;&nbsp;任务&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;在实时操作系统中,任务是参与资源竞争(如CPU、Memory、I/O&nbsp;devices等)&nbsp;<br />的基本单位。pSOS为每个任务构造了一个虚拟的、隔离的环境,从而在概念上,一个任务&nbsp;<br />&nbsp;<br />与另一个任务之间可以相互并行、独立地执行。任务与任务之间的切换、任务之间的通&nbsp;<br />&nbsp;<br />信都是通过发系统调用(在有些情况下是通过ISR)进入pSOS&nbsp;Kernel,由pSOS&nbsp;Kernel完&nbsp;<br />&nbsp;<br />成的。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pSOS系统中任务包括系统任务和用户任务两类。关于用户任务的划分并没有一个固&nbsp;<br />&nbsp;<br />定的法则,但很明显,划分太多将导致任务间的切换过于频繁,系统开销太大,划分太少又&nbsp;<br />&nbsp;<br />会导致实时性和并行性下降,从而影响系统的效率。一般说来,功能模块A与功能模块B是&nbsp;<br />&nbsp;<br />分开为两个任务还是合为一个任务可以从是否具有时间相关性、优先性、逻辑特性和功&nbsp;<br />&nbsp;<br />能耦合等几个方面考虑。&nbsp;<br />3.1.2&nbsp;优先级&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;每个任务都有一个优先级。pSOS系统支持0~255级优先级,0级最低,255级最高。0级&nbsp;<br />&nbsp;<br />专为IDLE任务所有,240~255级为系统所用。在运行时,任务(包括系统任务)的优先级&nbsp;<br />&nbsp;<br />可以通过t_setpri系统调用改变。&nbsp;<br />3.1.3&nbsp;任务状态&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pSOS下任务具有三种可能状态并处于这三个状态之一。只有通过任务本身或其他任&nbsp;<br />&nbsp;<br />务、ISR对pSOS内核所作的系统调用才能改变任务状态。从宏观角度看,一个多任务应用&nbsp;<br />&nbsp;<br />通过一系列到pSOS的系统调用迫使pSOS内核改变受影响任务而从运行一个任务到运行另&nbsp;<br />&nbsp;<br />一任务向前发展的。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;对于pSOS&nbsp;kernel,任务在创建前或被删除后是不存在的。被创建的任务在能够运行&nbsp;<br />&nbsp;<br />前必须被启动。一旦启动后,一个任务通常处于下面三个状态之一:&nbsp;<br />①Executing&nbsp;(Ready)就绪&nbsp;<br />②Running运行&nbsp;<br />③Blocked阻塞&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;就绪任务是未被阻塞可运行的,只等待高优先级任务释放CPU的任务。由于一个任务&nbsp;<br />&nbsp;<br />只能由正运行的任务通过调用来被启动,而且任何时刻只能有一个正在运行的任务,所&nbsp;<br />&nbsp;<br />以新任务总是从就绪态开始。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;运行态任务是正在使用CPU的就绪任务,&nbsp;系统只能有一个running任务。一般runni&nbsp;<br />&nbsp;<br />ng任务是所有就绪任务中优先级最高的,但也有例外。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;任务是由自身特定活动而变为阻塞的,通常是系统调用引起调用任务进入等待状态&nbsp;<br />&nbsp;<br />的。所以任务不可能从ready态到blocked态,因为只有运行任务才能执行系统调用。&nbsp;<br />3.1.4&nbsp;任务控制块&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;任务控制块TCB是pSOS内核建立并维护的一个系统数据结构,它包含了pSOS&nbsp;Kernel调&nbsp;<br />&nbsp;<br />度与管理任务所需的一切信息,如任务名、优先级、剩余时间片数、当前寄存器状态等。&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;在有的RTOS中,任务的状态与任务TCB所处的队列是等同的。pSOS操作系统将二者分&nbsp;<br />&nbsp;<br />为两个概念,例如任务处于阻塞状态,但它的TCB却处于消息等待队列、信号灯等待队列、&nbsp;<br />&nbsp;<br />内存等待队列、超时队列之一。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pSOS启动时,将根据Configuration&nbsp;Table中的参数kc_ntask建立一个包含kc_ntask&nbsp;<br />&nbsp;<br />个TCB块的TCB池,它表示最大并行任务数。在创建一个任务时,分配一个TCB给该任务,在&nbsp;<br />&nbsp;<br />撤销一个任务时,该TCB将被收回。&nbsp;<br />3.1.5&nbsp;对象、对象名及ID号&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pSOS&nbsp;Kernel是一个面向对象的操作系统内核,pSOS系统中对象包括任务、memory&nbsp;<br />regions、memory&nbsp;partitions、消息队列和信号灯。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;对象名由用户定义(4位ASCII字符),并且在该对象创建时作为系统调用obj_CREAT&nbsp;<br />E&nbsp;<br />的一个人口参数传给pSOS&nbsp;Kernel。pSOS&nbsp;Kernel反过来赋予该对象一个唯一的32位ID号&nbsp;<br />&nbsp;<br />。除obj_CREATE和obj_IDENT外,所有涉及对象的系统调用都要用到对象ID号。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;创建对象的任务通过obj_CREATE就已经知道了该对象的ID号,其余任务可通过obj_&nbsp;<br />IDENT或通过全局变量(如果已经为该任务的ID号建立了一个全局变量的话)获取该对象&nbsp;<br />&nbsp;<br />的ID号。对象ID号隐含了该对象控制块(如TCB、QCB)的位置信息,这一位置信息被pSO&nbsp;<br />S&nbsp;<br />Kernel用于对该对象的管理和操作,如挂起/解挂一个任务、删除一个消息队列等。&nbsp;<br />3.1.6&nbsp;任务模式字Mode&nbsp;&nbsp;word.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;每个任务带有一个mode&nbsp;&nbsp;word,用来改变调度决策或执行环境。主要有以下四个参&nbsp;<br />&nbsp;<br />数&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Preemption&nbsp;Enabled/Disabled.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Roundrobin&nbsp;Enabled/Disabled&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Interupts&nbsp;Enabled/Disabled.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ASR&nbsp;Enabled/Disabled:&nbsp;&nbsp;每个任务有一个通过as-catoh建立起来的异步信号服务例&nbsp;<br />&nbsp;<br />程ASR。异步信号类似于软件中断。当ASR位为1时as-catch所指向的任务将会被改变执行&nbsp;<br />&nbsp;<br />路径,先执行ASR,再返回原执行点。&nbsp;<br />§3.2&nbsp;&nbsp;任务调度&nbsp;<br />3.2.1&nbsp;影响动态调度效果的两个因素&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pSOS采用优先级+时间片的调度方式。有两个因素将影响动态调度的效果:一是优先&nbsp;<br />&nbsp;<br />级可变(通过t_setpri系统调用改变任务的优先级);二是任务模式字中的preemption&nbsp;<br />&nbsp;<br />&nbsp;bit位和roundrobin&nbsp;bit位。preemption&nbsp;bit位决定不同优先级的任务是否可抢占,并和&nbsp;<br />&nbsp;<br />roundrobin&nbsp;bit位一起决定任务的时间片轮转是否有效。&nbsp;<br />3.2.2&nbsp;引起任务调度的原因及结果&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pSOS系统中引起调度的原因有两条:&nbsp;<br />1.&nbsp;在轮转方式下时间片到&nbsp;<br />2.&nbsp;pSOS系统调用引发任务调度。该系统调用可能是ISR发出的,也可能是某个任务发出的&nbsp;<br />。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pSOS任务调度的结果有两种:&nbsp;<br />1.&nbsp;引起运行任务切换,这指的是&nbsp;<br />2.&nbsp;不引起运行任务切换,这指的是&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;不论任务调度是否引发运行任务切换,都有可能引起一个或多个任务状态变迁。&nbsp;<br />3.2.3&nbsp;运行任务的切换&nbsp;<br />一、何时切换&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;下面三种情况将引发运行任务切换:&nbsp;<br />1.&nbsp;在时间片轮转方式下(此时任务模式字的roundrobin&nbsp;bit与preemption&nbsp;bit均为&nbsp;<br />enable),运行任务Task&nbsp;A的时间片用完,且Ready队列中有相同优先级的其它任务,则&nbsp;<br />&nbsp;<br />Task&nbsp;A退出运行。&nbsp;<br />2.&nbsp;在运行任务Task&nbsp;A的Mode&nbsp;word的preemption&nbsp;bit位为enable的前提下,若Task&nbsp;A发出&nbsp;<br />&nbsp;<br />的某条相同调用引发一个优先级高于Task&nbsp;A的任务Task&nbsp;B从Block状态进入Reary状态,则&nbsp;<br />&nbsp;<br />将Task&nbsp;B投入运行。&nbsp;<br />3.&nbsp;ISR使用I_RETURN系统调用,则ISR退出运行,pSOS&nbsp;Kernel选择Ready队列中优先级最高&nbsp;<br />&nbsp;<br />的任务投入运行(这一任务并不一定是被ISR打断的前运行任务)。&nbsp;<br />二、如何切换&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;上述三类运行任务的切换,其具体的pSOS&nbsp;Kernel运作过程并非完全一样,但彼此之间&nbsp;<br />&nbsp;<br />差别不大。为了简单起见,我们以&nbsp;<br />为例对切换过程作一简单叙述。这一过程可细分为4个步骤:&nbsp;<br />1.&nbsp;任务A运行信息保存(_t_save&nbsp;&nbsp;proc&nbsp;far)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这一过程主要完成修改系统工作标志,保存切换点地址及运行信息、任务A栈调&nbsp;<br />

⌨️ 快捷键说明

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