当前位置:文档之家› Vxworks培训讲稿(嵌入式系统)

Vxworks培训讲稿(嵌入式系统)

第一部分 VxWorks & Tornado Overview

第一章绪论

VxWorks是一种嵌入式的实时操作系统,所谓嵌入式系统就是用户自己开发设计板子,板子上通常有一颗CPU,VxWorks支持32位的CPU,包括Intel公司的x86、Motorola公司的68k和PowerPC、MIPS、ARM、Intel公司的i960、Hitachi公司的SH。我们设计的这块板子通常没有软件的自开发能力,所以我们需要一台通用机来辅助开发,这台通用机可以是PC或工作站,我们称辅助我们软件开发的通用机为宿主机(Host),用户自己开发的板子为目标机(Target)。宿主机上要有一个集成开发环境(IDE)来辅助我们的软件开发,这套集成开发环境可以运行在Windows95/NT或 UNIX下,包括交叉编译器(Cross Compiler)和交叉调试器(Cross Debugger),所谓交叉编译器就是在宿主机上编译生成可以在目标机上运行的代码IMAGE,交叉调试器就是通过宿主机和目标机之间的某种耦合方式实现前后台调试。我们称宿主机上的这套集成开发环境为Tornado,编译生成的目标机上的可执行代码IMAGE为VxWorks。在系统安装的时候,集成调试环境和VxWorks的原材料(一些obj文件)都安装到宿主机上,编译生成的在目标机上运行的IMAGE内包含操作系统。下面我们分别来介绍这两部分内容。

第二章 VxWorks

第一节IMAGE的结构

VxWorks的IMAGE有三个层次、四个部分

其RTOS内核是wind kernel,这个内核有两个特点:

1.w ind kernel是一个微内核,这个特点导致VxWorks有许多的Components

2.w ind kernel对外设不做假设。所谓对外设不做假设是指操作系统不假设用户开发的板子上是否有总线以及有什麽样的总线,也不假设内存的大小及内存如何定位,不假设I/O 及有多少I/O。举一个对外设假设的例子:DOS就是一个对外设假设的操作系统,DOS系统的移植中,外设必须符合BIOS标准。wind kernel对外设不做假设的优点就是系统只与CPU有关,移植性好。由于wind kernel对外设不做假设,IMAGE中就要有板级支持包BSP(即驱动程序)来完成对外设的管理。

第二节IMAGE的生成

Tornado host

share

target config

h

src

.

.

Ev2_bsp

.wind

第三节IMAGE各部分的细述

2.3.1 RTOS内核

1.功能组成:任务的管理与调度、任务的同步与通信、动态内存的管理、软时钟的管理、

2.版本:用户可裁减掉程序员认为没有使用到的功能,直到只剩下最简内核(任务的管理与调度,我们称其为纳核,可以只有8k)。

VxWorks:标准的单CPU版本。

VxFusion:标准的多CPU版本,应用程序在多个CPU上运行,但仍然象在一个CPU

上运行那样进行数据的交换、通信与同步。

IxWorks:

Osek:

3.统一的API:可以从两个角度来理解,即对于VxWorks支持的不同的CPU、VxWorks的不同版本,API都是一样的。VxWorks的API是由操作系统内核提供的服务原语搭建起来的。服务原语,是不可打断的,这样可以保证系统调用的时间尽量小、尽量是常量和可确定。举例:DOS的API是INT21,UNIX的API是System Call。

4.验证性:FAA、FDA。

5.实时性:指操作系统内核采用了一种算法,使tc(context swich)和ts(system call)尽可能小、尽可能是常量和可确定。所谓可确定是指tc和ts有一个上限,而不是一个统计的结果,即不会出现峰值,不会随系统任务的增多而增多。

2.3.2Components

1.基本模块:

WDB Agent:两种工作模式(中断或查询),支持系统级和任务级调试

Shell:

Loader: 支持动态地下载或卸载模块

WindView支持模块:支持利用WindView动态调试目标程序

CodeTest支持模块:支持利用CodeTest测试系统的代码覆盖率和内存使用情况

SENS:是VxWorks的可裁减的增强型网络协议栈(Scalable Enhanced Network Stack)。它除了提供TCP/IP协议栈,还支持其他协议。最大的特点就是采用零拷贝机制,

即打包/解包是通过指针的方式

网络扩展模块:提供了丰富的网络协议(BSD4.3,TCPV4,UDP etc.),路由协议(OSPF,RIP etc.)和网络应用(ping,SNMP,DHCP server/client,DNS,telnet server,FTP

server,NFS server/client,TFTP server/client)等

文件系统:支持五种文件格式:MS-DOS、RAW、NFS、CD-ROM 、RT11卷标格式(为了实现后向兼容)

对存储介质不做假设,可以是电的(如PCMCIA的ATA)、磁的

ANSI C模块:解决了以下问题:库集成、库不可重入、版本兼容及移植性,该库中的函数大致可分为4类:字符处理功能、字符串处理功能、通用功能、I/O处理功能POSIX:

VxDCom:

VxMP:

VxTrueFFS:

VxVMI:

etc.

2.领域扩展模块(领域解决方案):

Telecom&Datacom: TMS(Tornado for Managed Switches):交换机管理解决方案

应用:(1)企业网:管理hub、switch、router;

(2)Carrier 网:边缘交换机,VoIP 网关,核心路由器; (3)消费类网络:Cabel Modem,xDSL Modem,网关,家用网络设备

Consumer Elec: TIA(Tornado for Internet Appliance)

应用: Set_top Box:卫星、Cable 、Web

PDA

Digital Camera Embedded Browser

目标机运行组件:

Personal JWorks TM

3.0.2 Platform(Java virtual machine) VxWorks 5.4 WindStorm TM

1.0

Internet Applications(IceStorm Browser 5.4) BlueThunder,TCP/IP stack

宿主机开发工具: T ornado 2.0

W indStorm 1.0 Tools(仿真,设备管理工具) Z inc

硬件参考设计:StormPad (StrongArm1110)

IDB Hardware

BSP SSP Hardware Adaptation Layer TCP, UDP, IP, ICMP, BOOTP, TFTP, DHCP

802.1d SNMP HTTP Telnet Consol e MIB-II RMON v1 Bridge Enterp

rise Other 802.1p 802.1q Etherlike Q MIB

P MIB Other OSPFv2 RIPv2 IGMP

2.3.3 BSP

BSP 是系统用来管理外设的部分,由两部分组成:初始化、驱动程序。所谓初始化是指从系统上电复位开始直到wind kernel 和usrRoot 根任务启动的这段时间,系统的执行过程。驱动程序就是一些包含I/O 操作的子函数。

初始化包括:CPU Init 、Board Init 、System Init 。CPU Init 初始化CPU 的内部寄存器。Board Init 初始化智能I/O 的寄存器,将device 打通。System Init 为系统的运行准备数据结构,进行数据初始化。

驱动程序的特点是不能自动执行,只能被动调用。调用可以有三种方式:任务直接调用、任务调用System Call 、任务调用服务。

所以驱动程序可以抽象为三个层次:常规操作、与VxWorks 的接口、与Component 的接口。

常规操作是设备的固有操作逻辑,有两层含义: I/O 编址

微观上表现为CPU 操作device 的寄存器、宏观上表现为具体操作的含义。

驱动程序与VxWorks 的接口、驱动程序与Component 的接口有三层含义: I/O 管理

操作类型规整 参数规整

驱动程序与VxWorks 的接口使Driver 具有更好的层次性,驱动程序与Component 的接口使Driver 具有更好的抽象性。 2.3.4 IMAGE 的执行

系统的各个部分是如何和谐地运做在一起?

Power reset

初始化是bottum_up 的过程 运行是top_down 的过程

2.3.5 IMAGE 是怎样放在Memory 中

1. VxWorks 对内存的使用采用的是Flat Mode :静态分配的IMAGE 占用空间

(.code 、.data 、.bss )、系统的动态空间(wind kernel 创建的REGION#0)、用户的动态空间。

2. VxWorksk 可被静态或动态链接。VxWorks 在开发阶段可动态地下载目标文件,并与操

作系统及其它目标文件动态链接。这与DOS 的*.EXE 文件相类似,其地址在链接以后

是浮动的,只在装载时才与绝对物理地址相对应;VxWorks成品阶段是采用静态链接的。

3. RAM和ROM类型的IMAGE:

RAM Image ROM Image

4.成品时的IMAGE和调试时的IMAGE:

成品时的IMAGE有两种运行模式:

ROM-resident image: BSP初始化时把image中的data段复制到RAM中,code

在ROM中运行;

ROM-based image: BSP初始化时把image完全搬到RAM中执行,包括image

中的data段和bss段。(分压缩和非压缩两种类型) ROM-based Image ROM-resident Image

调试时的Image:先由引导代码把ROM Boot Program搬到RAM中,Boot Program 初始化调试下载通道和调试信息输出通道。被调试的IMAGE通过Host与Target之间的某种耦合方式download到Target的RAM中,然后接受控制权,实现调试。

5. Image的在线升级(GoAhead Field Upgrader:GoAhead DeviceStudio,UpgradeAgent,UpgradeServer):

存储介质:flash、flash disk

升级通道:

升级时期:

升级保护:

升级安全:

升级IMAGE的部分或整体:

2.3.6Debug

调试就是bug的定位

1.需要调试的层次:

硬件:非在线问题(工艺)

在线问题(设计问题):上电以后不能正常运行

BSP:

VxWorks和Components:VxWorks在近十多年没有发现bug,它的各个模块也是被普遍

使用的商用化软件,所以我们一般不需要调试这一层 App :语句逻辑层:程序语句的逻辑是否正确 功能层:设计的功能是否可以实现 任务层:任务的划分、调度是否合理 系统层:系统的可靠性、效率

调试的步骤就是根据上面的调试层次进行由底向上的进行。 3.调试的手段及工具:

纯硬的手段:万用表、示波器、逻辑分析仪,针对非在线的硬件问题和部分的在线硬件问题

半硬半软的手段:ICE 、BDM ,针对部分硬件的在线问题和BSP 的调试 纯软的手段:Cross Debugger ,针对App 的调试

ICE 的方法:运行的IMAGE 在仿真器中,由仿真器的CPU 在用户的硬件环境下运行来调试软件。限制:价格/使用率的比率太高,CPU dependence 。

BDM 的方法:在运行IMAGE 的CPU 上支持一种断点逻辑,这是一种硬件调试代理,宿主

机通过并口连接的Adapter 连接到CPU 的BDM 接口上,进行软件的调试。限制:CPU 必须支持BDM 方式。步骤:BDM Debugger

下载Register list 激活板子,BDM Debugger IMAGE 下载到目标板的RAM 中。

软件调试:宿主机与目标机通过某种方式耦合,宿主机上的调试器通过目标机上的调试代理来进行软件的调试,其优点是性价比高。

经过静态调试的系统称为一个堪用系统,经过动态调试的系统称为一个使用系统。

Cross Debugger(Cross wind):照相机(静态调试):在某一个时间点捕捉到CPU 的寄存器、内存、应用程序的任务、队列、信号量等,可以调试App 下面的2.5层

摄象机(动态调试):WindView、System Browser,可以看到程序在动态运行时发生的情况,如任务的切换轨迹等;CodeTest可测试系统的代码覆盖率以及内存的动态分配和释放情况;Scope Tools可分析系统内某个变量随时间的变化曲线,每个函数或任务占用CPU 的时间,以及内存的使用情况。

WindView:

,即与历史状态相关的bug

profile:利用直方图、百分率进行统计分析。举例:通过直方图统计任务对CPU的占用时间,进行分析;比如统计IDLE的CPU占用情况,如果占用时间在85%以上,可能有两种情况:CPU太快,但是如果我们在CPU选型阶段通过对MIPS的计算确定的CPU 的速度对于我们的应用应该没有那麽快,那麽就有可能出现了局部死锁;如果CPU的占用时间小于15%,则可能是CPU太慢。也可以通过统计分析测试经验值,以达到最优值。WindView是一个事后分析的工具,记录一个Recorder,以file的形式存在宿主机上,然后对其进行分析。这个Recorder具有三个特点:single buffer、transmitt、wrap round,VxWorks采用wrap round方式,总是记录最后一段时间的系统运行情况,在记录开始前应该设置de-trigger的events选项,以免在通信还未中断的情况下已经死机,目标机就会把死机的标志不断地送回宿主机,而会把死机前记录的情况覆盖掉。

System Browser是一个定时采样、事后分析的工具,采样的对象可以是堆栈、队列、堆栈等。

第三章Tornado

第一节 Tornado集成开发环境的结构

Tornado:WIN95/NT环境下的第二代IDE,是基于软总线的开放环境,是一种层次结构:Manager、Project Tools、Internal BUS、symbol server & communicate server。

symbol server communication server

第二节Tools Set

Tools。

WindRiver

Diab Data for PPC,68k,Mips,ARM etc.

Cross Debugger:照相机:

Cross Wind

摄象机:WindView,System Browser,CodeTest,Scope Tools Project Facility: VxWorks的自动配置工具

Simulator: Integrated simulator,full simulator

第四章文档组织

第一节VxWorks

《VxWorks Programmer’s Guide》***

《VxWorks Reference Manual》

第二节Tornado

《Tornado User’s Guide》***

《GNU make》:***

《GNU Toolkit User’s Guide》:*

《Debugging with GDB》:*

《WindView User’s Guide》

第三节Network

《WindNet SNMP v1/v2》:*

《WindNet STREAMS for Tornado》

《VxWorks Networking Programmer’s Guide》***

第五章实时系统的实现步骤

我们在设计一个实时系统的时候一定要站在软件工程的高度,从系统分析员的角度出发,按照软件工程的步骤去实施。

第一节软件系统的分析与设计

在软件的分析与设计阶段,我们可以将分析于设计的方法大致分为两类:

1.MIS的方法:其分析与设计的思想大致是经历了由结构化的方法向OO的方法逐渐转变的过程,其分析与设计的核心是处理和数据的抽象,最终形成一套结构图或对象图。2.RTS的方法:采用Real Time A&D的思想,其分析与设计的核心是系统的实时性(强实时系统的时间耗尽线在us级、准实时系统的在ms级、弱实时系统的在s级),主要的工作是进行任务的划分、调度、同步、通信,最终形成一套多任务流程图、任务功能说明书。

第二章 实时软件的实现

系统分析员在生成多任务流程图和任务功能说明书后,将系统的模块进行划分,交给程序员来实现,程序员可以分为两组:应用程序员、系统程序员。

进行应用编程要具有如下背景:应用领域的背景,熟悉system call 、memory usage 、config system 、interface 。

系统编程就是进行操作系统移植、编写驱动程序,系统程序员要具有如下背景:了解硬件的工作原理,了解系统的体系结构、具有多任务的概念、熟悉system call 、OS 、Component 、interface 、memory usage 。

第二部分 Real Time A&D

第一章 概念引入

第一节 “实时系统一定是多任务的,多任务不一定是实时的”

首先比较一下连续程序结构体、并发程序结构体、实时程序结构体,举一个监控系统的例子,我们分别用伪算法写出连续程序结构体、并发程序结构体的实现程序的代码。

数码显示

显示延迟时间

连续程序结构体的特点:传统的程序结构体、

易于理解代码、程序按一定的可预知链执行;容易错过之间耗尽线;适用于执行结果不依赖于执行速度的系统,例如工资单。 BEGIN FOR

IF 传1

’ IF 传2

COUNT+=1;’ ’ END FOR END

如果t2’+tD ’>t1或t1’+t2’+tD ’>tD ,就会漏掉传送带上的小球计数。

并发程序结构体的特点:由多个连续程序结构体组成;有真并行:程序在多个CPU 上执行,与伪并行:程序在单CPU 上运行、宏观上并行、微观上串行之分;适用于执行结果依赖于相对执行速度、不依赖于绝对执行速度的系统,例如Unix ,Unix 虽然是多任务的,但其算法的核心是为分时做的,是以大的任务吞吐量为设计目标的,任务之间的耦合比较松散。

中断

传1,2

BEGIN

COUNT+=1;

END

定时器

display

BEGIN

FOR

从左到右显示Count;

END FOR

END

发生上述错误的的原因是count是一个全局变量,在程序中缺乏数据保护。

实时程序结构体的特点:正确结构必须在时间耗尽线之前被提交,理解调试复杂,错误代价大,分析设计要慎重;例如:大的嵌入式系统,多任务之间有大量的耦合关系,所以实时程序结构体是一个三维系统。

连续程序结构体、并行程序结构体处理的是与执行速度无关的数学领域的问题,实时程序结构体处理的是物理领域的问题,实时程序结构体并不提高CPU指令的速度,而是其程序体反映了客观世界的优先级,例如:Digital Camera的前端由十几路DMA将图象读入内存,此时内存的读写速度都已经成为瓶颈。

第二节Time Deadline

连续系统

实时系统

的指令速度

不可见域

离散事件

人鸟

鼓振

掌翅

离散事件的时间耗尽线是客观存在的时间,在离散事件的时间耗尽线的曲线图中,CPU

的指令速度是一个分水岭,时间耗尽线低于CPU指令速度的范围是不可见域,其中的时间是计算机无法识别的。实时程序结构体只是将计算机可识别的事件的时间耗尽线,相对于连续程序结构体下降了一点。所谓实时是一个相对的概念。

第三节数据保护

一个程序总是由代码和数据组成,对于共享数据的使用要加以保护。

最初的数学模型是利用Hidden Data Lib来管理共享数据,但是这种方法有一个缺陷:延误系统的执行。

所以抽象出了两中数据结构:消息队列、信号量。抽象思想的关键是:数据直接定位,即保护数据元素,而非数据库;精简操作接口,减少操作手续。类比:精简官僚机构。

第二章层次设计

第一节层次划分

我们在分析一个系统的时候,首先看到的是系统的“处理”,即功能。

处理

子处理

数据

第二节任务划分

程序在CPU中是以任务的方式在运行,所以我们要将系统的处理框图转化为多任务流程

图,对处理进行任务划分。任务划分存在这样一对矛盾:如果任务太多,必然增加系统任务切换的开销;如果任务太少,系统的并行度就降低了,实时性就比较差。在任务划分时要遵循H.Gomma原则:

1.I/O原则:不同的外设不同任务。CPU的操作快于I/O操作,如果将I/O操作串行则会很浪费。

2.优先级原则:对于突发事件的优先级等价于事件的时间耗尽线,不同优先级的处理不同任务。

3.大量运算:归为一个任务

4.功能耦合:归为一个任务,举例:f(),g(f()),h(g(f()))

5.偶然耦合:归为一个任务,举例:f1(),f2(),f3()。早晨起床以后,刷牙、洗脸、吃早饭之间并没有必然的先后顺序,但由于习惯一直是按这个顺序做的。

6.频率组:对于周期时间,针对不同频率的处理不同任务。

如果我们在具体分析一个系统的时候发生原则冲突的话,则要为每一个原则针对具体的系统

设定“权重”,必要的时候可以通过计算“权重”来最终确定如何去划分任务。

思考题:一个多层通信协议栈的实现,应该如何去划分任务?

第三节 任务调度

2.3.1任务调度的几种算法

任务调度算法的发展过程大致经历了三个阶段,存在三种调度算法:control loop 、Interrupt schedule 、RTOS 。

Control loop 是通过一种循环查询任务标志位的算法来调度任务,其特点是:简单,但不适于大系统、不灵活、不易升级,如果升级或添加新的模块就要打开loop ,重新设计

Interrupt schedule 是为每个任务分配一个中断,通过中断的方式来调度任务,其特点是:简单,但把应用的并行度下降到CPU 级。计算机的发展是体系结构的发展,是层次结构的发展,如果采用中断的任务调度方式,任务就绕过操作系统直接与硬件发生关联,破坏了计算机的层次结构。

中断1 中断2 中断3

VxWorks 的任务经创建以后可以处于三种状态:Ready 、Delayed 、Pended ,操作系统采用事件驱动的方式进行任务调度。其特点是:很复杂,需要有一些操作系统的背景。

R →E :不同优先级抢占,同一优先级时间片轮转 E →R :被其他任务抢占或时间片耗尽 E →B :所需资源没有满足 B →R

思考题:RTOS 是在什麽时候出来执行? 操作系统是被事件驱动的。 RTOS 任务调度的算法

Pre_empty:

Suspended High Priority Medium Priority

Timeslice:相同优先级的任务采用时间片轮转方式(KernelTimeSlice(ticks))

时间片

2.3.2 VxWorks的任务调度算法

VxWorks的每个任务可以规定自己的priority;mode:可否设断点、是否支持浮点操作。

2.3.3VxWorks的优先级空间

IDLE任务的优先级是255。

第四节任务之间的关系

1.通信:松耦合:实现机制:一个消息队列

紧耦合:实现机制:两个消息队列

任务之间的通信也可以用信号量来构造。

2.控制:数据保护:信号量或互斥量

同步:信号量,信号或消息队列

第五节 VxWorks的Object

VxWorks是面向对象的操作系统,我们可以从下面的角度来讨论VxWorks的对象:

1.V xWorks的对象:Task、Message Queue、Semophore、Timer、Pipe、File Descriptor.

2.对象的属性:生存性:对象可以被创建或删除

在生存期间,可被标识和管理:Name、ID、Control Block

平等性:对象之间不象Unix中的父子进程间那样存在继承关系

3.对象的服务:系统使用系统服务对对象进行操作

第六节 VxWorks的构成实体

2.6.1 Task与code的关系

Task是VxWorks的一种对象,系统创建以后为其分配一个TCB和一个stack,task占

用code 。

Code 被task 占用,不被OS 识别和管理。

举例:程控交换机的计费系统,实现计费算法的代码只有一个copy ,在交换机系统运行时可以创建多个任务,任务分别去调用该代码体。

实时系统是一个多任务运行环境,所以要求我们编写的代码是可重入的。所谓可重入的代码体是指代码体可被多任务占用,而且不出错。这就要求,代码内无临界资源:临界变量如全局变量,临界设备如打印机,大部分I/O 都是临界设备;代码不修改自身,例如病毒就是一种能够修改自身的代码。

举例:为什麽多任务要求代码可重入?

例如早期有人曾经想在DOS 的环境下执行多任务,在DOS

上面构造了一个multitask 层,然后运行多任务,但是经常down 机,最后发现BIOS 是不可重入的,所以导致死机。

2.6.2 Driver 与ISR 的关系

首先我们来讨论一下CPU 与device 的关系,CPU

I/O 操作有四种方式:

查询polling 、中断interrupt 、DMA 、

channel I/O processor 。

计算机按计算机体系结构来分,大致有两种:微型机的体系结构和巨型机的体系结构。

………………

符合冯.诺依曼结构的计算机从最高层次的抽象的角度来看,由四部分组成:输入、输出、处理、存储。微型机的体系结构是以CPU 为核心的,巨型机的体系结构是以存储器为核心的。CPU 对I/O 的操作,微型机采用的是查询、中断或DMA 的方式,巨型机采用的是channel I/O processor 的方式,在CPU 和I/O processor 中都有device 的驱动程序,而我们所需要编写的驱动程序是在CPU 中的驱动程序。

用户设计开发的应用系统往往是上述两种计算机体系结构的综合,例如我们使用MPC860设计一块电路板,如果从整个电路板的角度看,我们的电路是一种典型以MPC860为

核心的微型机的体系结构,但是如果具体地讨论CPU芯片的内部结构,我们会发现其内部采用的是巨型机的体系结构。

明确了CPU和device的耦合方式以后,我们来看一下驱动程序和于之相关的中断服务程序的关系。我们从两个角度来考虑:

1.优先级:从优先级空间可以看出,ISR的优先级高于所有的系统任务的优先级,而driver 的优先级是从调用它的任务那里继承来的。可以以此为依据将驱动程序的功能划分,分别放在ISR和driver中;ISR应该只包含直接硬相关的操作,即要求ISR短、精、直接硬相关;后期的处理放在driver中。举例:参加通信展,在展览会上主要是搜集资料,回来以后再仔细阅读。

2.引发的条件:driver是由任务调用而开始执行的,ISR则是与相关的中断向量相联系,由I/O外部触发。

第三章细节设计

第一节系统的正确性尺度

1.安全性:例如路由器的Firewall、消费电子产品的Smartcard。

2.生存性:在实时系统中要避免死锁deadlock、活锁lockout、饥饿starve的出现。

死锁是指任务相互占有其他任务所需资源而形成的“链”状结构,例如三角债

乙 C 丙

活锁是指一个任务所需资源永不满足,例如望夫石

饥饿是指一个任务所需资源总不满足,举例:美国曾经设计了一个作业系统,系统为每个任务分配一个优先级,然后按照优先级的顺序去处理这些任务,用户可以将自己的程序设

定好优先级以后,放在作业系统中运行,当系统管理员在十几年以后去查看这个系统的作业运行情况的时候,发现在有一个程序在系统中沉寂了十几年没有得到执行。 3. 及时性:指任务的处理一定要赶上time deadline 。

第二节 动态内存分配

1.VxWorks 为用户提供了两种内存区域:region 、partition ,region 是变长的内存区,用户可以从创建的region 中分配segment ,其特点是:容易产生碎片,但灵活、不浪费;partition 是定长的内存区,用户可以从创建的partition 中分配buffer ,其特点是:无碎片、效率高,但浪费。

2.分配算法:衡量算法的指标是碎片问题和速度问题。所谓碎片是指内存中的空间大于被申请的空间,但是没有一块单独的内存空间大于被申请的空间。我们要求内存分配算法使碎片尽量小,分配算法的执行速度尽量快。三种内存分配算法的比较:最大、最先、最适,其中最大算法执行速度最快、碎片最少。但VxWorks 采用的是最先算法。

3.释放:上下融合

4.VxWorks

没有清除碎片的功能,因为嵌入式实时系统找不到一个合适的时间把正在运行的程序暂停下来清理内存,例如

Windows NT 在夜间有时会自己响个不停,就是在清理碎片,所以在实时系统的设计中我们只能是来避免碎片。影响碎片的因素有:region 的大小,region 越大则碎片越少;task 占用segment

的时间,占用的时间越短则碎片越少;segment 之间的准方差,segment 越规则碎片越少。

第三节 任务之间的机制

1. 消息队列:可以从三个角度考率

message buffer :按size 分:变长 按内容分:data pointer 生产者:msgQ s end: 排队策略: FIFO(MSG_PRI_NORMAL),LIFO(MSG_PRI_URGENT) 等待策略: 等:定时,永久 不等

消费者:msgQreceive 等待策略:等:定时,永久 不等 2. 信号量(semaphore ):二值信号量count=(0,1)

互斥信号量(Mutex)

多值信号量count=[0,+&] (较少使用,所以略)

信号量用于保护临界资源,对应操作:semBCreate/semMCreate,semGive,semTake,semFlush semBCreate/semMCreate: 排队策略:基于优先级(SEM_Q_PRIORITY )

FIFO(SEM_Q_FIFO)

semTake:获得信号量

if(count==0)

{task等待策略;

wait:block until count>0;

}

else

{count-=1;

程序pass;

}

semGive:释放信号量

if(task pended)

信号量等待队列中位于第一的任务获得信号量(count remaind 0);

else

count+=1;

semFlush: 广播信号量

信号量状态保持不变;

if(task pended)

解阻塞信号量等待队列中所有任务;

利用二值信号量可能带来的问题:优先级逆转(Priority Inversion)

解决办法:互斥信号量

semMCreate: 要解决优先级逆转问题,创建互斥信号量必须使用SEM_INVERSION_SAFE 和

相关主题
文本预览
相关文档 最新文档