搜档网
当前位置:搜档网 › VxWorks APPLICATION PROGRAMMER'S GUIDEApplication Programmer's Guide

VxWorks APPLICATION PROGRAMMER'S GUIDEApplication Programmer's Guide

VxWorks  APPLICATION PROGRAMMER'S GUIDEApplication Programmer's Guide
VxWorks  APPLICATION PROGRAMMER'S GUIDEApplication Programmer's Guide

2 实时进程

2.1 介绍

VxWorks实时进程(RTPs)在很多方面和其它操作系统的进程类似——如UNIX和Linux ——包括扩展POSIX兼容。创建、执行和终止应用程序的方法对于理解UNIX进程模型的开发者比较熟悉。

然而VxWorks进程模型设计用于实时嵌入式操作系统。这个模型支持的功能包括系统范围内任务调度(进程本身没有调度),和用户模型一样的内核模式下的进程抢占,两步创建进程来分离加载实例和从入口加载应用程序。

VxWorks实时进程提供在用户模式下执行应用程序的方法。每个进程有自己的地址空间,包含可执行程序,程序的数据,每个任务的栈,堆,进程本身管理相关的资源(如内存分配跟踪)。可能内存中同时存在多个进程,每个进程包含多个任务(其它操作系统成为线程)。

VxWorks进程可以使用两种不同的虚拟内存模型:平面(默认)和重叠(可选)。若使用平面虚拟内存模型,每个VxWorks进程有自身的通过一个唯一一个地址范围描述的虚拟内存。这个模型在一个支持或不支持MMU的编程模型中和调试应用中在执行速度方面比较有优势。若使用重叠虚拟内存模型,每个VxWorks进程使用相同的虚拟地址范围来存放驻留代码(文本,数据,bss段)。这个模型对虚拟内存地址提供更精准的控制,具备更快速的应用加载时间。

关于RTP应用程序开发相关信息,参考3. RTP Applications。

2.2 关于实时进程

一个进程的通用定义是执行的一个程序,VxWorks进程也一样。事实上,VxWorks实时进程的生命周期和POSIX进程保存高度一致(参考2.2.9 RTPs and POSIX)。

然而,VxWorks进程更准确的称为实时进程(RTPs),因为此进程设计用于实时性要求比较高的系统。以如下方式操作:

●保留VxWorks任务调度模型。进程不会调度——任务在系统全局范围内调度。

●进程在内核模式下和在用户模式下一样可能会被抢占。每个任务有一个用户模型和一个内核模型栈。(VxWorks内核是完全抢占式的)。

●进程创建,不需要执行针对新进程地址空间的拷贝和执行一个exec操作来加载文件。在VxWorks下,一个新的地址空间创建和文件加载被简化。

●两个阶段创建进程,清楚的分离了进程实例化的加载和执行应用程序过程。第一个阶段在任务上下文执行,调用rtpSpawn( )。第二阶段以一个独立的任务执行,在执行之前承担加载应用程序text和数据的开销,不同于父任务,以自己的任务优先级操作。父任务,称为rtpSpawn( ),不会受到影响,没有必要等待应用程序开始执行,除非已经编码要等待。

●进程全面加载应用程序——没有命令页。

所有的这些区别设计用于使得VxWorks适应实时性要求比较高的应用场合,和提供一个通用系统编程模型一样,上面运行一个MMU。导致VxWorks进程和其它操作系统进程不太一样,如UNIX和Linux。区别在相关章节讨论。

2.2.1 RTPs和调度

VxWorks进程支持确定轮的主要方法是本身不调度。仅VxWorks系统中的任务调度,使用基于优先级抢占策略。基于较强的VxWorks内核抢占,来保证实时性,不管内核任何还是系统中任何进程中的任务。

通过对比,非实时系统的调度策略基于时间共享,和一个进程优先级动态确定,确保不会有进程占用CPU时间过长现象和进程长时间得不到CPU现象。

VxWorks确实提供一个可选的时间共享功能——轮询调度——但是这和基于优先级的抢占机制无关,因此事确定的。VxWorks轮询调度简单保证党同一时间具备相同最高优先级的多个任务准备运行时,这些任务共享CPU。因此任何一个任务都不会撺掇CPU,直到阻塞。

关于VxWorks调度的更多信息,参考6.4 Task Scheduling。

2.2.2 RTP创建

实时进程的创建方式支持实时性要求比较高的系统。RTP的创建产生两个不同的阶段,当进程创建后,可执行程序完全加载。第一阶段,调用rtpSpawn( )创建初始化进程任务(参考2.2.5 RTPs and Tasks)。第二阶段,初始化进程任务加载整个可执行程序,并启动主函数。

这个方法针对系统确定论使用两种方式提供:

第一,进程创建的工作在rtpSpawn( )任务和初始化进程任务过程中被划分——每个任务有自己独立的任务优先级。这意味着加载应用程序的行为不会在这个优先级上产生,或创建新的进程的任务请求占用CPU的时间。因此,启动一个进程的初始化阶段是分散和确定的,不管应用程序是否在本任务中开始运行。第二阶段,开发者针对应用的重要性为任务指派优先级,或要考虑加载应用程序时的限制(如,应用程序从网络主机系统加载,或本地硬盘)。加载的带有相同任务优先级的应用,运行时保持同样的优先级。这种方式下,这个模型模仿异步IO,当调用rtpSpawn( )任务初始化启动进程时,当应用在启动和加载时,并发执行其他行为。

第二,当进程创建后,整个可执行程序被加载,这意味着本身执行的确定不是由在执行过程中递增加载组成。这个功能当系统配置为在启动时刻自动启动应用程序时比较有用——当系统启动时,所以可执行文件被完全加载并准备执行。

rtpSpawn( )函数有一个选项针对新进程同步成功加载和实例化。

启动时,进程内部需要的资源根据命令分配(如heap)。应用程序的text保证被写保护,应用程序的数据可读和可写,若MMU存在,则要配置操作系统来管理它。当进程间内存保护由MMU强制分区提供,没有机制来提供资源保护,通过现在进程的内存使用为一个具体大小。更多信息,参考10. Memory Management。

注明VxWorks进程的创建不涉及拷贝或共享父进程的页帧(copy-on-write),UNIX和LINUX 的某些版本也是这种情况。VxWorks提供的Flat虚拟内存模型禁止这个方法,重叠虚拟内存模型不能并行支持这个弓。关于来之父进程的属性继承相关的信息,参考2.2.7 RTPs, Inheritance, Zombies, and Resource Reclamation。

关于一个进程在实例化的每个阶段的可能操作的信息,参考VxWorks API reference for rtpLib。也参考3.3.7 Using Hook Routines。

VxWorks进程可以用如下方法启动:

●通过和内核shell交互启动

●通过和主机shell和调试器交互启动

●在启动时使用启动工具自动启动。

●编程应用程序或内核启动。

相关更多信息,参考3.6 Executing RTP Applications。

2.2.3 RTP终止

进程在如下环境下被终止:

●当进程中最后一个任务退出时。

●若进程中任何任务调用exit( )时,不管进程中是否有任务正在运行。

●若进程的main( ) 函数返回时。

这是因为当main( ) 函数返回时,自动调用exit( )函数。一个应用程序中main()函数启动任务可以避免这个行为——考虑其他任务正在运行——通过包含一个taskExit()的调用作为main()的最后一个状态。参考3.3 Developing RTP Applications。

●若kill()函数用于终止这个进程时。

●若进程中调用rtpDelete()函数时——来之一个程序,一个内核模块,shell的c 解析器,或来之workbench。或若rtp delete命令在shell中调用时。

●若一个进程在执行过程中发生异常情况时。

这个默认行为可以针对调试目的改变。当系统中包含错误检查和报告工具时,被设置为调试模式,当异常产生时,进程不能被终止。

注明若当一个shell正在运行时一个进程失败,shell控制台会打印一个消息。若内核包含内存检测和报告功能,则错误会记录。(参考14. Error Detection and Reporting)关于属性继承和当进程终止时一个进程资源的行为的更多信息,参考2.2.7 RTPs, Inheritance, Zombies, and Resource Reclamation。

2.2.4 RTPs和内存

每个进程有自己的地址空间,包含可执行程序,程序的数据,每个任务的栈,堆,和管理进程本身需要的资源(如本地堆管理)。可能同时在内存中存在多个进程。

虚拟内存模式

VxWorks进程可以用两种不同的虚拟内存模式操作:flat(默认)或重叠(可选)。

Flat虚拟内存模式在有或没有MMU情况下和调试应用程序的编程模型中在执行速度方面比较有优势。这种模式每个VxWorks进程有自己的虚拟内存区域,用一个唯一的地址范围描述。

重叠的虚拟内存模型针对虚拟内存空间提供更精准的控制,考虑快速的应用程序加载时间。这种模型,每个VxWorks进程针对存放代码的区域使用相同的虚拟内存地址空间。重叠虚拟内存模型不会发生作用,除非VxWorks配置了MMU支持和MMU打开。

这两种虚拟内存模型是互斥的,更详细的描述,参考2.5 About VxWorks RTP Virtual Memory Models。

内存保护

无论目标系统是否配置支持MMU,每个进程都保护自身不受系统中其它进程的影响。设计一个进程代码、数据和内存的操作仅局限于在那个进程中的执行的代码访问。因此,可能在独立的进程中运行相同的几个应用实例,彼此之间不受影响。内核和进程的名字和特征是隔离的。

当进程运行一个完全连接的镜像,没有任何外部引用情况下,一个进程不能调用另外一个进程的其它函数,或一个内核函数,不能作为一个系统调用函数——无论MMU是否使能。然而,若MMU没有使能,一个进程可能读或写外部内存到自身地址空间,这样可能会导致系统破坏。

2.2.5 RTPs和任务

VxWorks可以同时运行多个进程,并且任何数目的进程可以运行同样的可执行程序。也就是说,一个应用程序的多个实例可以并发运行。

对于任务的通用信息,参考6. Tasks and Multitasking。

任务和RTPs的数量

每个进程可以执行一个或多个任务。当创建一个进程后,系统发起一个单独的任务来初始化应用的执行。应用可能之后发起其它的任务来执行不同的功能。一个进程中任务数量没有限制,除非内存大小有限制。同样,不限制系统中进程个数——但是仅对没有一个管理并发地址空间的硬件机制的体系结构(这个机制通常称为地址空间标识符,或ASID)。对于使

用ASIDs或对等机制的目标体系结构,进程数量有ASID限制(通常为255)。更多信息,参考VxWorks Architecture Supplement。

一个RTP中的初始化任务

当创建一个进程后,发起一个初始化任务开始应用的执行。进程的初始化任务的名字基于可执行文件的名字,用下面方法修改:

●字母i前缀。

●文件名首字母大写。

●删除文件名扩展。

如,当foobar.vxe运行,初始化任务的名字为iFoobar。

初始化任务为之后程序的要调用的main()函数提供执行环境。应用本身可能之后发起其它的任务。

RTP任务和内存

任务创建包括来自进程内存的任务栈空间分配。若需要,内存自动增加给进程,创建任务的内存来自内核空闲内存池。

进程中存在针对任务的堆管理函数。这项库提供不同的ANSI APIs,如malloc()和free()。内核针对用户空间的每个进程提供一个内存池来管理这些函数。

在用户空间提供堆管理提高了速度性能,因为应用不产生执行过程中内存相关的系统调用开销。然而,若堆耗尽,系统默认自动回收进程的更多空间,这个情况下会产生系统调用。使用环境变量控制堆是否增加。(参考10.3 Heap and Memory Partition Management)

2.2.6 RTP和进程间通信

当每个进程的地址空间对于其他进程中的任务是不可见时,任务可以跨进程通信,通过使用不同的IPC机制(公共信号量,公共消息队列,和消息通道)和共享数据区域。参考7.8 Inter-Process Communication With Public Objects和3.5 Creating and Using Shared Data Regions查找更多信息。

2.2.7 RTPs,继承,Zombies,和资源回收

VxWorks有一个有父子关系组成的进程层次。任何从内核(无论是编程,从shell或其他开发工具或自动启动)发起的进程时内核的一个孩子。任何由其他进程发起的进程是其他进程的孩子。像人类社会一样,孩子进程会继承父亲进程的一些特性,当父进程或孩子进程消亡时,发生的事情。

继承

VxWorks进程从他们的父进程继承一定的属性。孩子进程继承父进程的文件描述符(stdin,stdout,dtderr)——这意味着他们可以访问相同的文件(若文件打开),和信号。若孩子进程由内核启动,则孩子进程仅继承三个标准文件描述符。不继承环境变量,但是父进程可以传递自身环境或一部分给孩子进程(更多信息,参考2.2.8 RTPs and Environment Variables)。

当信号mask不是进程的一个实际属性——是一个任务的属性——进程中针对初始化任务的信号mask继承之发起的任务(也就是说调用rtpSpawn()函数的任务)。若内核创建了初始化任务,则信号mask为0,并且所有信号是非阻塞的。

Getppid()函数返回父进程的进程ID。若父进程是内核,或父进程消亡,返回NULL。

Zombie Processess(僵尸进程)

默认,当一个进程终止时,若父进程不是内核,此进程变成一个zombie(僵尸)进程。

为了答复一个SIGCHLD信号(当一个孩子进程停止或退出,或一个停止进程重新启动时),获取孩子进程的退出状态,父进程必须在孩子退出或停止前调用wait()或waitpid()。这种情况下,父进程阻塞等待。同样,父进程可能为SIGCHLD设置一个信号句柄,在信号回调中调用

wait()或waitpid()。这种情况下父进程是非阻塞的。在父进程接受到孩子进程的退出状态时,僵尸实体自动删除。

关于僵尸进程的默认行为可以用下面方法修改:

●当孩子进程终止时,父进程没有意识到,不会创建一个僵尸进程。这个由父进程忽略处理SIGCHLD信号完成。父进程调用一个sigaction()函数完成,设置SIGCHLD信号回调到SIG_IGN。

●不传递一个终止孩子进程到一个僵尸进程,当孩子进程退出时。这个通过父进程调用一个sigaction()函数完成,设置sa_flag到SA_NOCLDWAIT。

资源回收

当一个进程终止,进程拥有的所有资源(对象,数据等)要返还给系统。用于管理进程的资源释放。和此进程相关的所有信息从系统中删除(除了一些僵尸进程信息)。资源回收确保所有没有被使用的资源及时返回到系统中,以备其它进程使用。

注明,有些例外情况:

公共对象——可能被其它进程使用,那个进程正在运行——必须显示删除。

Socket对象在进程终止后一段时间存在。当关闭时,回收,由TCP/IP状态机驱动。一些套接字必须打开直到超时。

仅当所有文件描述符的引用关闭时,文件描述符才能回收。这个在当所有的孩子进程继承父进程时产生。当所有的应用引用此文件描述符时,产生这种情况。

关于对象所有权关系,和公共、私有对象的信息,参考7.8 Inter-Process Communication With Public Objects。

2.2.8 RTPs和环境变量

默认,刚创建的进程没有环境变量。某种意义上和POSIX标准保持一致,所有进程中的任务共享相同的环境变量——不像内核任务,每个任务有自己的一组环境变量。

从一个进程外部设置环境变量

当默认创建一个进程时没有环境变量,可以用如下方法在进程外部设置进程的环境变量:

●若新进程时由一个内核任务创建,内核任务的环境数组内容可能复制给应用程序的环境数组。EnvGet函数用于获取内核任务的环境,也可以用于rtpSpawn调用。

●若新进程由一个进程创建,孩子进程的环境变量有父进程传递,若环境数组用于rtpSpawn()调用。

●若新进程在内核shell中创建,使用rtp exec命令或rtpSp()函数——之后所有的shell 的环境变量传递给新的进程(设置进程的envp用于shell的环境变量)。通过第一次在创建进程之前,使用putenv()来设置shell环境变量简化了设置进程环境变量的操作。(如,这个方法可以用于针对共享库的运行时位置设置LD_LIBRARY_PATH变量)。

更多信息参考rtpSpawn()API和3.3.1 RTP Application Structure。

从一个进程内部设置环境变量

一个进程中的任务可以创建,复位,删除进程的环境变量。Getenv()函数用于获取进程的环境变量,setenv用于设置环境变量,unsetenv用于删除环境变量。环境数组可以直接操作——然而,风河推荐最好不要这样做,getenv( ), setenv( ) and putenv( )函数在RTP环境下时线程安全的。

2.2.9 RTPs和POSIX

实时进程模型提供的应用程序环境的总体行为和POSIX 1003.1标准接近,同时维护VxWorks操作系统嵌入式和实时特性。和标准的关键区别在于VxWorks不提供如下:使用fork()和exec()创建;

内存映射文件;

文件所有权和文件权限。

关于POSIX支持更多信息,参考9. POSIX Facilities。

POSIX PSE52 Support

VxWorks可以配置提供POSIX PSE52支持(针对独立进程,如原型定义)。更详细信息,参考2.3 Configuring VxWorks For Real-time Processes, p.14, 9.1 Introduction, p.156, 9.2 Configuring VxWorks with POSIX Facilities, p.157, and 13.4.3 HRFS and POSIX PSE52, p.263.。

2.3 配置VxWorks支持实时进程

VxWorks操作系统被配置和编译独立于任何可能要运行的应用程序。为了支持RTP应用,VxWorks需要针对实时进程和任何应用程序需要的功能(如,消息队列)来增加合适的组件。操作系统独立于应用程序,使得可以开发不同的系统,用于不同的应用程序,基于一个单一的VxWorks配置。也就是说一个VxWorks单一版本可以混合不同组应用程序来创建不同的系统。操作系统不需要关系要运行什么应用程序,但是操作系统配置的组件要支持要运行的应用程序。

RTP应用程序可以单独存储或捆绑存储,启用VxWorks编译过程中一个附加步骤,混合操作系统和应用程序为一个单一系统镜像(使用ROMFS文件系统)。更多信息,参考2.3.3 Additional Component Options, p.15 and 3.7 Bundling RTP Applications in a System using ROMFS。

2.3.1 基本的RTP支持

为了在一个硬件目标上运行RTP应用程序,VxWorks必须配置INCLUDE_RTP组件。这样做会自动增加支持RTP的其它组件。

注明本章描述的很多组件提供配置参数。不是所有的参数都在本章讨论,可以使用内核配置工具检查和管理(Workbench或vxprj 命令行工具)。

关于支持具体RTP技术相关的可选择配置在入住主题中讨论。如:

, p.18

■ Configuation With Process Support and Without an MMU

, p.26

■ Setting Configuration Parameters for the RTP Code Region

, p.58.

■ 4.4 Configuring VxWorks for Shared Libraries and Plug-ins

注明:硬件目标的默认VxWorks配置不包含支持RTP应用程序的组件。VxWorks必须重新配置,重新编译来提供这些进程功能。VxWorks仿真器的默认配置完全支持运行RTP应用程序。

由于VxWorks默认配置不支持RTP,因此,方便基于内核的应用程序从VxWorks 5.5移植到VxWorks 6.x。

Vxworks 6.x系统可以创建基于内核的应用程序,不支持任何基于进程的应用程序,或两者都支持。然而内核应用程序不提供和基于进程应用程序相同级别的保护。当应用运行在内核空间,内核和这些应用程序受到一些应用程序代码误操作。更有基于内核应用程序更多信息,参考VxWorks Kernel Programmer’s Guide: Kernel。

2.3.2 有MMU支持的RTPs

若一个系统配置了MMU内存保护需要的INCLUDE_RTP组件——除了MIPS体系结构。

提醒:对于MIPS体系结构,默认不提供MMU支持。和其它体系结构比较,当VxWorks 配置组件时,默认不增加这个支持。对于MIPS,VxWorks必须配置一个映射内核,通过增加INCLUDE_MAPPED_KERNEL组件。更多信息,参考VxWorks Architecture Supplement。

为了创建一个进程系统,没有MMU支持,MMU组件必须在增加INCLUDE_RTP组件后,从VxWorks配置中删除。(更多信息,参考2.4 Using RTPs Without MMU Support。)

2.3.3 附加组件选项

如下组件为开发和部署系统提供有用的功能:

INCLUDE_ROMFS指ROMFS文件系统。

INCLUDE_RTP_APPL_USER,

INCLUDE_RTP_APPL_INIT_STRING,INCLUDE_RTP_APPL_INIT_BOOTLINE, and INCLUDE_RTP_APPL_INIT_CMD_SHELL_SCRIPT在启动时自动启动应用程序。

INCLUDE_SHARED_DATA共享数据域。

INCLUDE_SHL共享库。

INCLUDE_RTP_HOOKS可编程钩子功能,考虑注册内核函数,在进程的生命周期内不同点执行。

INCLUDE_POSIX_PTHREAD_SCHEDULER和INCLUDE_POSIX_CLOCK POSIX线程支持。这取代传统的VxWorks调度机制,使用符合POSIX.1标准的调度回调用户线程。VxWorks任务项内核线程一样处理。注明在进程中使用线程,要求INCLUDE_POSIX_PTHREAD_SCHEDULER 这个组件。更多信息,参考9.15 POSIX and VxWorks Scheduling。

INCLUDE_PROTECT_TASK_STACK栈保护。部署系统时,忽略掉这个组件,节省内存空间。参考6.5.5 Task Stack。

如下组件主要用于系统开发,也可以用于部署系统:

针对内核shell的不同INCLUDE_SHELL_feature的组件,尽管进程和应用程序不需要,使用命令行运行应用程序时需要,执行shell脚本,和目标调试。

INCLUDE_WDB使用主机工具。

INCLUDE_NET_SYM_TBL或INCLUDE_STANDALONE_SYM_TBL,致命是否针对shell加载或编译特征。

INCLUDE_DISK_UTIL和INCLUDE_RTP_SHOW组件,包含有用的shell函数。

关于内核shell、特征表、展示函数的更多信息,参考VxWorks Kernel Programmer’s Guide: Target Tools。关于主机shell更多信息,参考Wind River Workbench Host Shell User’s Guide。

组件包

VxWorks配置工具提供组件包来简化进程配置。如下组件包用于提供进程支持:

●BUNDLE_RTP_DEPLOY设计用于部署系统(最终产品),有INCLUDE_RTP, INCLUDE_RTP_APPL, INCLUDE_RTP_HOOKS,INCLUDE_SHARED_DATA, and the BUNDLE_SHL 组成。

●BUNDLE_RTP_DEVELOP设计用于开发环境,有BUNDLE_RTP_DEPLOY, INCLUDE_RTP_SHELL_CMD , INCLUDE_RTP_SHOW, INCLUDE_SHARED_DATA_SHOW,INCLUDE_SHL_SHOW, INCLUDE_RTP_SHOW_SHELL_CMD, INCLUDE_SHL_SHELL_CMD,组件组成。

●BUNDLE_RTP_POSIX_PSE52针对独立进程提供POSIX PSE52支持。(参考9.2 Configuring VxWorks with POSIX Facilities,)可以用于BUNDLE_RTP_DEPLOY或BUNDLE_RTP_DEVELOP。

2.3.4 配置和编译工具

关于配置和编译VxWorks更多信息,参考Wind River Workbench by Example guid和VxWorks Command-Line Tools User’s Guide。注明VxWorks仿真器包含进程需要的所有基本组件。

2.4 使用没有MMU支持情况下的RTPs

VxWorks可以配置一个没有MMU或MMU禁用的的处理器上配置支持RTP。

这种配置,一个软件基于仿真的内存页管理库跟踪标志映射。这意味着没有地址转换,和不支持内存页属性(保护属性和缓存属性)。

提醒:VxWorks SMP 不支持没有MMU配置。更有VxWorks sMP 更多信息,参考VxWorks Kernel Programmer’s Guide: VxWorks SMP。

支持没有MMU配置的优点是:

●使能系统上没有MMU的进程环境。为应用程序提供私有命名空间,可以独立于内核编译应用程序,简化移植过程。

●允许应用代码在用户模式下运行。

●在特定情况下,通过减少TLB丢弃和重新加载的开销提供性能。这假设每改变缓存状况没有影响。

这种配置的缺点:

●依赖处理器的类型,BSP配置,使用的驱动和OS工具,使用MMU可能需要禁用数据缓存。禁用数据缓存会导致重大性能缺失。

●没有内存保护。也就是说内存不能写保护,内核或任何进程都不能保护受到其它进程影响。

●地址空间局限于系统RAM,通常比较小。内存可能运行越界。

●不是所有的处理器和目标板卡在MMU禁用下使用。

关于系统结构和具体处理器限制,参考VxWorks Architecture Supplement。

配置没有MMU情况下进程支持

带有软件模拟页的进程环境不需要什么具体的组件。要支持进程,必须添加

INCLUDE_RTP组件。

如下步骤用于使能软件仿真页:

1 增加INCLUDE_RTP组件提供进程支持。这自动包含了所有独立的子系统,包括INCLUDE_MMU_BASIC。

2 改变INCLUDE_MMU_BASIC组件的SW_MMU_ENABLE参数为TRUE(默认为FALSE)。

另外,如下可选配置步骤用于小型化系统:

3 改变INCLUDE_MMU_BASIC组件的VM_PAGE_SIZE参数。默认是独立于体系结构的;通常是4K或8K。允许值是1K,2K,4K,8K,16K,32K,64K。通常,较小的页大小导致更细粒度,更有效的利用内存空间。然而,较小的页大小需要更多的内存来跟踪映射信息。

4通过改变INCLUDE_MMU_BASIC组件的TASK_STACK_OVERFLOW_SIZE和

TASK_STACK_UNDERFLOW_SIZE参数为0,禁用栈岗哨也保护。没有提供一个MMU的保护,不能坚持栈上溢和下溢,所有岗哨页服务没有目的。

5从VxWorks配置中删除如下组件:

INCLUDE_KERNEL_HARDENING,INCLUDE_PROTECT_TEXT,INCLUDE_PROTECT_VEC_T

ABLE,INCLUDE_PROTECT_TASK_STACK,INCLUDE_TASK_STACK_NO_EXEC,and

INCLUDE_PROTECT_INTERRUPT_STACK.没有MMU,这些功能不会工作。增加这些组件,会增加不必要的开销。

2.5 关于VxWorks RTP虚拟内存模型

VxWorks可以针对RTPs配置实用flat或重叠虚拟内存模型。默认使用flat虚拟内存模型。

2.5.1 Flat RTP虚拟内存模型

Flat虚拟内存模型是默认的不需要其他特别的配置。使用这种模型每个VxWorks进程有自身的虚拟内存域——进程在虚拟内存中没有重叠。Flat虚拟内存映射提供如下优势:

●速度——上下文切换快速。

●调试简单——每个进程的地址是唯一的。

●一个灵活的编程模型,不管是否支持MMU,提供相关的进程模型。VxWorks的应用程序内存模型允许在有没有MMU情况下允许相同的应用。硬实时确定论通过使用相同的编程模型提供方便,通过禁用MMU。

系统可能在一个带有MMU的目标上开发、调试,之后移植到没有MMU的硬件上,或没有使能MMU的硬件上。这种内存模型比较有优势。(更多信息,参考2.4 Using RTPs Without MMU

Support。)

然而,使用flat虚拟内存模型,可执行文件必须重新加载,这意味着他们的加载时间比重叠模型长。

另外,flat模型不考虑具体虚拟区域安装的内容。取而代之的是一个自适应算法知道选择最合适的空闲内存区域安装,基于内存并行用法,加载合适的段。

2.5.2 重叠RTP虚拟内存模型

VxWorks可以配置为使用一个重叠虚拟内存模型取代flat模型。使用重叠内存模型的VxWorks RTP 应用程序共享一段公共范围的虚拟内存地址,包括应用程序安装的text,data,和bss段,所有的应用程序共享相同的执行地址。

除了保存RTP应用程序的text,data,bss段外,虚拟内存的重叠域自动用于私有于一个进程的任何元素,如自身的堆和任务栈(若有足够的空间;否则在这块区域外部)。然而,重叠区域不用于设计用于给其它RTP访问的元素,如共享数据区域和共享库。

为了充分利用重叠模型的优势,RTP应用程序必须编译为一个绝对连接的可执行文件(关于这一点,参考Building Absolutely-Linked RTP Executables)。他们共享在虚拟内存的重叠区域内的相同的执行地址。简化之,执行地址in公共定义为这块区域的基地址。当加载时,重新加载的步骤就不需要了。

注明若相同RTP应用的几个实例在系统中启动,他们占据虚拟内存的相同范围,但是每个实例仍然有自己的分配的物理地址,用于存放自身的text,data,bss段。换句话说,一个应用的多个实例不共享text 段。

重叠虚拟内存模型提供如下优势:

●更快速的加载时间当应用程序呗编译为一个绝对连接可执行文件时。当绝对链接可执行应用程序被加载时,重新加载部分跳过,因为他们都安装在同一个虚拟内存地址处。加载时间可以提高10%到50%。注明加载时间的缩短依赖文件中重新加载入口的数量。

●系统的虚拟内存更精确的控制。用户选择虚拟内存区域来存放FTP应用安装的text,data和bss段。另一方面,使用flat内存模型,一个自适应算法根据内存的并发用法,自动选择最合适的区域来加载对应的内容。

●通过减少可能产生的内存碎片是系统虚拟内存的最有效的用法。

●存储在ROMFS中的绝对链接RTP可执行文件的内存模型是重新加载可执行文件大小的一半,若附加特征和重新加载信息。关于使用ROMFS和可执行文件更多信息,参考3.7 Bundling RTP Applications in a System using ROMFS和Stripping Absolutely-Linked RTP Executables。

●重叠虚拟内存模型需要系统充分使用MMU。

提醒:对于那些没有处理并发地址空间的硬件机制的体系结构(通常被认为是一个地址空间标识符),重叠虚拟内存模型也使得一个系统对于性能缺失非常敏感。这基本上是因为每次一个RTP的任务切换出和另外一个内核或RTP任务切换进整个缓存必须刷新,并且重新

加载新任务的上下文。使用ASID机制,这个刷新没有必要,因为缓存使用ASID索引。当这样一个刷新是否需要时,硬件会识别。

VxWorks重叠虚拟内存模型和其它操作系统

VxWorks重叠虚拟内存模型和其它操作系统的实现比较类似(如UNIX),但是有如下几点区别:

●对于VxWorks,用户模式虚拟地址空间没有预定义。另一方面,对于Windows,操作系统保证2GB(或3GB)为一个进程预留。对于Solaris,几乎整个4GB的地址空间要用于一个进程。一个VxWorks进程用法是否存在,目标和目标的用法不同(参考User Regions of Virtual Memory)。

●VxWorks应用程序的text,data和bss段在内存中一块分配。在其他操作系统中,如UNIX,通常独立分配。定义RTP代码区域的大小非常重要,区域大小要容得下所有的text,data,bss段,不能简化text段(参考RTP Code Region in Virtual Memory)。

●对于Unix和Windows操作系统,一个进程的重叠虚拟地址空间的概念覆盖整个4Gb 地址空间范围,地址空间组织结构要提前设置。尤其是共享库在每个进程中的映射都不同,但是通常是预定义的,为地址空间预留区域。在VxWorks操作系统中,仅RTP代码区域和RTP的私有元素设置在虚拟地址空间范围。共享库和共享数据域不是重叠的,所有的进程出现的相同的虚拟地址处;更进一步说,他们可以使用用户区域的任何空间,除了RTP代码区域覆盖的空间(这个不能被用户控制)。不使用共享库的进程仍然有自身地址空间的一部分,若任何使用共享库或共享数据域的其它进程没有。

2.6 使用重叠的RTP虚拟内存模型

使用VxWorks重叠虚拟内存模型需要一个可理解的用户区域和其中一块区域如何用于重叠虚拟内存区域,称为RTP code region。背景信息在2.6.1 About User Regions and the RTP Code Region提供。

使用RTP code region实现重叠内存模型的进程涉及从系统中获取用户区域信息,基于用户区域和RTP应用需求选择RTP code region,依据配置VxWorks。这些步骤在2.6.2 Configuring VxWorks for Overlapped RTP Virtual Memory中讨论。

为了让RTP应用充分使用重叠虚拟内存的优势,必须编译为绝对链接可执行文件。需要的编译器选项在2.6.3 Using RTP Applications With Overlapped RTP Virtual Memory中描述(除了信息和应用程序的优化)。

2.6.1 关于用户区域和RTP代码区域

VxWorks重叠虚拟内存模型依赖使用其中一个虚拟内存用户域作为重叠虚拟内存区域,称为RTP代码域。

虚拟内存用户区域

VxWorks中一个进程的虚拟地址空间不对应连续的0到4GB地址范围。通常由不连续的虚拟内存块组成。

RTPs可以使用的虚拟内存块(也就是说,没有用于内核)指用户区域。用户区域用于存放RTP应用的text,data,bss段,和他们的堆和任务栈。另外,用户域用于共享数据区域,共享库等。Figure 2-1说明了VxWorks中虚拟内存布局的例子。

虚拟内存中RTP代码区域

仅有一个进程的虚拟地址空间中一块连接的区域可以用于重叠RTP应用代码,这个区域必须要对应目标系统中内存的其中一个用户区域。选择作为重叠虚拟内存的用户区域称为RTP代码区域。RTP代码区域的基地址和大小由用户在配置系统时配置。

RTP代码区域例子

Figure 2-2说明了运行了3个应用的系统虚拟内存布局,带有三个用户区域,如Figure 2-1.。

VxWorks已经配置为使用Figure 2-1描述的三个用户区域中最大的那个味RTP代码群友,因为其他用户区域都太小,不能容纳最大应用(RTP C)的代码(text,data和bss段)。因为RTP C的堆不使用RTP代码区域,自适应算法自动定位堆到用户区域1是为了为其他目的留下更多的区域在用户区域2中(可能用作共享数据域)。

注明RTP代码区域的大小定义要大于应用的text、data和bss段大小。

Figure 2-2说明的系统包括一个共享数据域,由RTP A和RTP C 使用,映射此区域到内存上下文。共享数据区域的位置在创建时根据自适应算法在运行时自动确定(3.5 Creating and Using Shared Data Regions)。注明,RTP B不允许使用共享数据区域虚拟地址,尽管应用没有充分使用它。

关于参数配置相关信息,定义RTP代码区域位置和大小(RTP_CODE_REGION_START and RTP_CODE_REGION_SIZE),参考Setting Configuration Parameters for the RTP Code Region。

2.6.2 配置VxWorks为重叠RTP虚拟内存

默认Vxworks没有配置重叠RTP虚拟内存,没有定义一个RTP代码区域。为了使用重叠RTP 虚拟内存模型,你必须定义那个用户区域是应用最合适的虚拟内存区域,之后重新配置,编译VxWorks。过程涉及如下几个步骤:

1.启动VxWorks实例,已经配置了支持RTP和flat虚拟内存模型,获取用户区域信息。

2.标示RTP代码区域(大小和基地址),基于现在的用户区域和RTP应用的要求。

3.配置VxWorks为重叠内存模型,指明配置的RTP代码域。之后重新编译系统。

这些步骤在如下部分描述。

获取用户区域信息

在你配置vxWorks系统中一个RTP代码区域之前,你必须确定系统中存在的虚拟内存范围。启动一个支持RTP的VxWorks实例(默认配置为flat内存模型),,获取目标中存在的用户区域列表。

提醒:对于MIPS提醒结构,为了获取准确的用户区域信息,系统必须配置MMU支持。和其它操作系统比较,配置支持RTP 的VxWorks默认不提供这个功能。对于MIPS,必须通过

增加INCLUDE_MAPPED_KERNEL组件配置一个内核映射。更多信息,参考VxWorks Architecture Supplement。

adrSpaceShow( )内核shell命令用于显示用户区域列表,如:

-> adrSpaceShow 1

RAM Physical Address Space Info:

-------------------------------

Allocation unit size: 0x1000

Total number of units: 16384 (67108864 bytes)

Number of allocated units: 12150 (49766400 bytes)

Largest contiguous free block: 17342464

Number of free units: 4234 (17342464 bytes)

1 block(s) of 0x0108a000 bytes (0x02f70000-0x03ff9fff)

User Region (RTP/SL/SD) Virtual Space Info:

-------------------------------------------

Allocation unit size: 0x1000

Total number of units: 851968 (3489660928 bytes)

Number of allocated units: 0 (0 bytes)

Largest contiguous free block: 3221225472

Number of free units: 851968 (3489660928 bytes)

1 block(s) of 0xf000000 bytes (0x10000000-0x1effffff)

1 block(s) of 0xc0000000 bytes (0x30000000-0xefffffff)

Kernel Region Virtual Space Info:

---------------------------------

Allocation unit size: 0x1000

Total number of units: 196608 (805306368 bytes)

1 block(s) of 0x04000000 bytes (0x00000000-0x03ffffff)

1 block(s) of 0x0c000000 bytes (0x04000000-0x0fffffff)

1 block(s) of 0x08000000 bytes (0x20000000-0x27ffffff)

1 block(s) of 0x08000000 bytes (0x28000000-0x2fffffff)

1 block(s) of 0x04000000 bytes (0xf0000000-0xf3ffffff)

1 block(s) of 0x01000000 bytes (0xf4000000-0xf4ffffff)

1 block(s) of 0x05000000 bytes (0xf5000000-0xf9ffffff)

1 block(s) of 0x01010000 bytes (0xfa000000-0xfb00ffff)

1 block(s) of 0x00fe0000 bytes (0xfb010000-0xfbfeffff)

1 block(s) of 0x00050000 bytes (0xfbff0000-0xfc03ffff)

1 block(s) of 0x00fc0000 bytes (0xfc040000-0xfcffffff)

1 block(s) of 0x01810000 bytes (0xfd000000-0xfe80ffff)

1 block(s) of 0x00770000 bytes (0xfe810000-0xfef7ffff)

1 block(s) of 0x00010000 bytes (0xfef80000-0xfef8ffff)

1 block(s) of 0x00060000 bytes (0xfef90000-0xfefeffff)

1 block(s) of 0x00010000 bytes (0xfeff0000-0xfeffffff)

1 block(s) of 0x01000000 bytes (0xff000000-0xffffffff)

value = 0 = 0x0

这个输出显示目标上有两个用户区域:

■ from 0x10000000 to 0x1effffff

■ from 0x30000000 to 0xefffffff

任何一个区域可以作为RTP代码区域,取决于系统的需求。

标示RTP代码区域

如下指导用于定义RTP代码区域:

RTP代码区域应该大于运行在系统上的最大RTP应用的text,data,bss段大小。

RTP代码域必须适合用户区域——不能跨越多个用户区域。

当选择用户区域作为RTP代码区域时,应该考虑共享数据区域、共享库和其它公共映射的个数和大小——如使用mmap()创建的——即将用于系统。

简言之,设置RTP代码区域基地址为用于区域基地址。

提醒:若选择了重叠虚拟内存模型,但是基地址和大小没有确定,或若太小,绝对连接可执行文件会重新加载。若可执行文件越界,则不能重新加载,RTP发起失败。

RTP代码区域大小

RTP代码区域应该比运行在系统上的最大的RTP应用的text,data,bss段的总大小大。允许多余的空间为运行在系统的应用大小增加备用。readelf arch工具(如readelfppc)可以用于确定text,data,bss段大小。

另外,text和data段的页边界应该考虑(bss段已经由包含在数据段大小对齐)。根据一个对齐的基本原则,使用use readelfarch –l(如,readelfppc),针对显示在MemSiz域中的每个段大小,达到一页。

如,一个text段的MemSiz为0x16c38,将要达到的值是0x17000;对于一个带有MemSiz 域的数据段(没有使用FileSiz域,若不考虑bss段大小,会比较小)是0x12a8,将要达到的值是0x02000。这两个段大小加起来将要达到0x19000。

当你尝试选择最大的用户域为RTP代码域,为了适应系统上可能运行的最大RTP应用,这样可能没有足够的空间预留给系统需要的共享数据域,共享库或其他公共映射。

用户域选择

RTP代码域不能跨越用户域。必须在一个用户域中。

RTP代码域和公共映射域时互斥的,因为所有RTPs的公共映射出现在相同的地址,可能你使用的时候。因为虚拟内存中公共映射的位置不是由应用程序本身控制的,是使用自适应算法自动分配的,所以存在阻塞的风险。

RTP代码域基地址选择

为了简单起见,设置RTP代码域的基地址为一个用户域的基地址。若RTP代码域设置在一个用户域的任何位置,确保基地址是页对齐的。目标体系结构的页大小可以通过vmPageSizeGet()函数获取,可以再目标shell中直接调用。

RTP代码域大小

当确定RTP代码区域大小时,确保是页对齐的。目标体系结构的页大小可以通过vmPageSizeGet()函数获取,可以再目标shell中直接调用。

为RTP代码区域设置配置参数

默认,VxWorks配置为flat虚拟内存模型。为了使用重叠内存模型,下面列车的参数必须正确设置。他们为重叠虚拟内存模型服务,并且要定义虚拟内存代码域。

提醒:重叠虚拟内存模型需要MMU支持,默认由VxWorks提供——除了MIPS 体系结构。对于MIPS,MMU保护需要一个映射内核,有INCLUDE_MAPPED_KERNEL组件提供。这管组件内核中默认没有,需要手动添加。更多信息,参考VxWorks Architecture Supplement。

RTP代码区域组件参数

关于确定虚拟内存地址的信息,你需要设置RTP_CODE_REGION_START and

RTP_CODE_REGION_SIZE参数。参考2.6 Using the Overlapped RTP Virtual Memory Model and specifically 2.6.1 About User Regions and the RTP Code Region。

RTP_OVERLAPPED_ADDRESS_SPACE

设置为TRUE,改变flat虚拟内存模型为重叠虚拟内存模型。默认是FALSE。为TRUE情况下,下面参数才有效。

RTP_CODE_REGION_START

标示一个用户区域中虚拟内存地址,这个地址是RTP代码区域启动的地方。也就是说,RTP应用的text,data,bss段要安装的内存区域基地址。若RTP代码区域设置在用户区域的任何

地方,确保它的基本地址是页对齐的。更多信息,参考Identifying the RTP Code Region。

注明VxWorks内核通常位于低内存地址,除非体系结构要求(MIPS实例)。这种情况下,用户模式虚地址空间出现在地址范围更高位置。当改变内核配置时(增加组件或设备)将会对目前的用户区域基地址产生影响,也会影响RTP代码区域的基地址和大小。

RTP_CODE_REGION_SIZE

安装RTP应用的text、data、bss段的到虚拟内存区域的大小。选择的大小要大于运行在系统上text、data、bss段大小。确信,大小是页对齐的。更多信息,参考Identifying the RTP Code Region。

当RTP_OVERLAPPED_ADDRESS_SPACE设置为TRUE,和RTP_CODE_REGION_START和

RTP_CODE_REGION_SIZE都设置值,不为0。

提醒:若选择重叠虚拟内存(设置RTP_OVERLAPPED_ADDRESS_SPACE为TRUE),之后用户应该正确设置RTP_CODE_REGION_START和RTP_CODE_REGION_SIZE参数。若这项没有定义,或若区域大小太小,绝对链接可执行文件将会被加载到另外一个用户区域若空间足够。否则,RTP发起失败。另外,若可执行文件越界,也不能再其它用户区域加载,RTP发起失败。

针对多个进程设置RTP代码区域参数

一单参数RTP_OVERLAPPED_ADDRESS_SPACE,RTP_CODE_REGION_START 和

RTP_CODE_REGION_SIZE 设置后,针对多个工程配置可以通过创建一个定制组件描述文件来保存这些设置。使用一个CDF文件意味着参数不需要每次都设置(使用Workbench或vxprj)。若文件在编译之前拷贝到一个工程目录下,应用这些设置到那个工程。若在工程创建之前拷贝到BSP目录,随后基于那个BSP应用到所有工程。

本地CDF文件的内容(如,00rtpCodeRegion.cdf)如下所示:

Parameter RTP_OVERLAPPED_ADDRESS_SPACE {

DEFAULT TRUE

}

Parameter RTP_CODE_REGION_START {

DEFAULT 0xffc00000

}

Parameter RTP_CODE_REGION_SIZE {

DEFAULT 0x100000

}

关于CDF文件的信息,文件命名传统,文件的优先级等,参考VxWorks Kernel Programmer’s Guide: Kernel Customization。

2.6.3 使用带重叠RTP虚拟内存的RTP应用

为了充分高效的利用重叠虚拟内存模型提供的优势,RTP应用必须编译为一个绝对链接

的可执行文件。他们以相同的方式启动,作为重定位RTP可执行文件,也可以运行在配置为flat虚拟内存模型上,当时将会重定位。绝对链接可执行文件可能剥离他们的特征来减小他们的大小,但是会在flat虚拟内存模型系统上运行失败。

编译绝对链接RTP可执行文件

为了充分利用重叠内存模型提供的高效,RTP应用必须编译为一个绝对链接可执行文件。这个通过使用一个专门的链接选项定义一个链接地址完成。选项可以用Wind River或GNU工具链直接使用,或使用Wind river Workbench GUI选项或命令行make宏直接使用。简而言之,为所有的可执行文件使用相同的链接地址最有用(考虑每个可执行文件都存放在RTU代码域)。

选择链接地址

技术上RTP可执行文件的链接地址可以是RTP代码区域的任何地方(提供的地址要足够低来保证为应用的text,data,bss段预留足够的空间),风河推荐设置为用户区域的基地址(RTP_CODE_REGION_START配置参数指定的地址,参考Setting Configuration Parameters for the RTP Code Region)

链接器选项

如下链接器选择必须用于产生带预定义链接地址的可执行文件(text段的基地址):

-Wl,-Bt

■ Wind River Compiler (diab):

-Wl,--defsym,__wrs_rtp_base

■ GNU compiler:

这项链接器选择当默认使用的跨平台开发环境的VxWorksmakefile规则自动触发。

数据段的链接地址不能单独指定。根据设计,一个应用的数据段应该在text段后面,要考虑页对齐限制。安装在一块的端口在分配内存的一块上。

注明风河Workbench 提供GUI选项用于定义基地址和命令行编译环境,为做相同的事情提供一个make宏。

RTP_LINK_ADDR Make Macro

RTP_LINK_ADDR make 宏可用于设置绝对链接可执行文件的链接地址,当用命令行使用VxWorks编译环境。如,在installDir/vxworks-6.x/target/usr/apps/sample/helloworld路径下执行如下命令:

% make CPU=PENTIUM4 TOOL=gnu RTP_LINK_ADDR=0xe0000000

剥离绝对链接RTP可执行文件

执行绝对链接RTP可执行文件

执行重定位RTP可执行文件

当RTP地址空间是重叠时,支持重定位可执行文件。像往常一样,重定位安装在RTP代码区域他们的text,data,bss段,RTP 代码区域要足够大。若比较小,他们可以安装在任何地方,用户区域内可以提供足够大小空间的地址。

3 RTP应用

3.1 介绍

3.2 针对RTP应用配置Vxworks

3.3 开发RTP应用

另外,应用可以使用ROMFS文件系统捆绑操作系统到一个单一镜像中(参考3.7 Bundling RTP Applications in a System using ROMFS)。ROMFS技术对于部署系统尤其有用。允许开发者绑定应用可执行文件和操作系统到一个单一镜像中。不同其它操作系统,没有根文件系统(NFS 或软磁盘)要求保持应用二进制文件,配置文件等。

带共享库和插件的RTP应用

使用共享库和插件的应用的特殊需求相关的信息,参考4.8.9 Developing RTP Applications That Use Shared Libraries, p.69 and 4.9.3 Developing RTP Applications That Use Plug-Ins。

针对重叠虚拟内存模型的RTP应用

已经配置了重叠虚拟内存模型的系统可能要重新加载RTP应用可执行文件。然而,为了充分发挥这个模型的优势,RTP应用必须编译为一个绝对链接可执行文件。更多信息,参考2.6.3 Using RTP Applications With Overlapped RTP Virtual Memory。

针对UP和SMP配置的VxWorks RTP应用

移植内核应用到RTP应用

3.4 开发静态库,共享库和插件

3.5 创建和使用共享数据区域

3.6 执行RTP应用

3.7 使用ROMFS在系统中捆绑RTP应用

VxWorks常用命令汇总

VxWorks常用的命令 1.与任务相关的命令 sp function,[arg1],...,[arg9] -启动任务,最多接受9个参数,默认的优先级100、堆栈20000字节 period n,function,[arg1],...,[arg8] -创建一个周期调用function的任务,周期为n秒,最多接受8个参数 repeat m,function,[arg1],...,[arg8] -创建一个反复调用function的任务,调用次数为m,m=0时永久调用,最多也是8个参数 ts tidX -挂起任务 tr tidX -恢复挂起的任务 td tidX -删除任务 i tidX -显示任务基本信息,参数为0时显示全部任务 ti tidX -显示任务详细信息,包括寄存器、堆栈等 tt tidX -显示任务的函数调用关系 checkStack tidX -显示任务堆栈使用的历史统计,参数为0时显示全部任务 [其中tidX可以为任务ID 也可以为任务名] 2、系统信息 lkup ["string"] -在系统符号表中查找并列出含有"string"字符的函数及全局变量,有两个特殊参数: 0,给出符号表统计;""(空字符串),列出全部符号 lkAddr addr -显示addr地址附近的符号表 l addr,[n] -显示addr地址开始的n条指令的反汇编,n省略时默认为10条指令 h [n] -n为0时列出最近执行的shell命令,默认20条;n非0时,设定shell记录的历史命令的数目 d [addr,[number],[width]] -显示addr地址开始的number个单元的内容,width定制每个单元的宽度,可以是1、2、4、8 m addr,[width] -按width宽度修改addr地址的内容,width可以是1、2、4、8 memShow 1 -显示系统分区上空闲和已分配空间的总数等 printErrno value -打印系统定义的错误码的宏 3、与网络相关的命令 ifShow ["ifname"] - show info about network interfaces inetstatShow - show all Internet protocol sockets tcpstatShow - show statistics for TCP udpstatShow - show statistics for UDP ipstatShow - show statistics for IP icmpstatShow - show statistics for ICMP arpShow - show a list of known ARP entries

Tornado_VxWorks官方培训教程1

嵌入式培训专题 微迪软件培训中心Tornado &VxWorks 培训 深圳市微迪软件技术有限公司 培训中心

嵌入式培训专题 微迪软件培训中心实时系统概念 ?实时系统是对外来事件在限定时间内能做出反应的系统。 ?指标 –响应时间Response Time –生存时间Survival Time –吞吐量Throughput

嵌入式培训专题 微迪软件培训中心实时系统与普通系统 ? 在实时计算中,系统的正确性不仅仅依赖于计算的逻辑结果而且依赖于结果产生的时间?对于实时系统来说最重要的要求就是实时操作系统必须有满足在一个事先定义好的时间限制中对外部或内部的事件进行响应和处理的能力 ? 此外作为实时操作系统还需要有效的中断处理能力来处理异步事件和高效的I /O 能力来处理有严格时间限制的数据收发应用

嵌入式培训专题 微迪软件培训中心实时系统分类 ?根据不同的分类方法可以分为几种。 –方法一是分为周期性的和非周期性的(p e r i o d i c 和 a p e r i o d i c ) –方法二是分为硬实时和软实时(h a r d r e a l _t i m e 和s o f t r e a l _t i m e ) –专用系统和开放系统 –集中式系统和分布式系统

嵌入式培训专题 微迪软件培训中心实时多任务操作系统与分时多任务操作系统? 分时操作系统,软件的执行在时间上的要求,并不严格,时间上的错误,一般不会造成灾难性的后果。?实时操作系统,主要任务是对事件进行实时的处理,虽然事件可能在无法预知的时刻到达,但是软件上必须在事件发生时能够在严格的时限内作出响应(系统响应时间),即使是在尖峰负荷下,也应如此,系统时间响应的超时就意味着致命的失败。另外,实时操作系统的重要特点是具有系统的可确定性,即系统能对运行情况的最好和最坏等的情况能做出精确的估计。

嵌入式实时操作系统VxWorks入门

嵌入式实时操作系统VxWorks入门 VxWorksVxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。在美国的 F-16、FA-18 战斗机、B-2隐形轰炸机和爱国者导弹上,甚至连1997年4月在火星表面登陆的火星探测器上也使用到了VxWorks。VxWorks原先对中国区禁止销售,自解禁以来,在我们的军事、通信、工业控制等领域得到了非常广泛的应用。 VxWorks的实时性体现在能于限定的时间内执行完所规定的功能,并能在限定的时间内对外部的异步事件作出响应。因此,实时性系统主要应用于过程控制、数据采集、通信、多媒体信息处理等对时间敏感的场合。本文将对这个操作系统进行一个入门级的、全面的介绍。为力求展示其全貌,全文共分五章: (1)搭建VxWorks嵌入式开发环境; (2)简要介绍VxWorks的基本组成,内核的基本结构; (3)概述VxWorks板级支持包(BSP)的概念及VxWorks的启动过程; (4)介绍VxWorks设备驱动的架构及编写方法; (5)指明VxWorks应用开发的思路,任务调度及任务同步、中断与任务的同步机制。 以上各章中将贯穿着许多实例,由于本文定位于入门级教程,所以文中的实例都将十分简单。下面我们进入第一章内容的讲解。 嵌入式系统的调试调试方法一般为通过PC(宿主机)上的集成开发环境交叉编译针对特定电路板(目标机)的程序,然后将程序通过目标板的JTAG、串口或网口等途径下载到目标板上运行。因此,为了构造一个嵌入式系统的学习环境,拥有一块包含CPU、存储器及I/O 电路(构造计算机系统)的目标电路板往往是必要的。虽然许多集成开发环境附带模拟软件,但仅限于指令集的模拟,均无法模拟物理的目标机硬件平台,因而在其上只能进行应用程序的象征性模拟开发。但是,并非所有人都能拥有一块物理的电路板。在这种情况下,我们如何构造一个模拟的开发环境,其学习效果就如同拥有完全真实的电路板一样呢?本文试图解答此问题,主体内容包括四个方面: (1) 利用VMware等软件模拟真实的目标机; (2) 构建VMware虚拟PC上VxWorks BSP,建立Bootrom和OS映像; (3) 修改Tornado相关设置,连接宿主机与目标机,建立调试通道; (4) 写一个简单的应用程序并下载到目标系统运行。 图1 嵌入式系统的调试 本章工作的最终目标为: (1)VxWorks在VMware启动成功并顺利运行,的开发模型: 图4 PC作为目标机 很遗憾,这种方法实际上非常麻烦,同时开动两台PC进行调试将使你和你的室友饱受折磨,既然他如此地热切于游戏和上网。因此,我们可以借助VMware来在本机上虚拟出另一PC。 VMware的确是天才的作品!在同一PC上,利用VMware几乎可以安装所有的操作系统,而且操作系统之间的切换不需要重新启动电脑。VM的意义是Virtual Machine,即虚拟出一个逻辑的电脑,它可以提供基于Intel CPU的虚拟PC系统环境,包括CPU、内存、BIOS、硬盘和其他外围硬件设备。 下面我们讲解用VMware来建立一台虚拟PC的步骤: (1)并安装VMware; (2)使用VMware向导建立一个针对VxWorks的虚拟机;

vxWorks开发环境构建步骤及开发资源

vxWorks开发环境构建步骤及开发资源 技创科技(Technique Innovator Inc.) https://www.sodocs.net/doc/241122159.html, 一、Tornado集成开发环境构成 Tornado是集成开发环境的名称,主要由帮助及参考文档、操作系统vxWorks、开发工具(编译器、调试器、编辑器、target server等,据统计,挂接在Tornado下的可选工具和第三方有数百个)等三部分构成,分别对应三个目录: i.docs/ 所有文档都集中在该目录中, books.html是根索引,入门级开发请务必查看 以下文档: ●如果要熟悉使用界面及Tornado使用、创建工程,请参考:Tornado用户手册 及Tornado集成开发环境的HELP->content调出来的联机帮助文档; ●vxWorks的编译是使用标准GNU Makefile来编译连接的,要了解Makefile语 法请参考”GNU Make”;具体的Make rules存放在target/h/make/目录下。 ●如何调试?请参考“Debugging with GDB” ●vxWorks构成、特点及kernel,编程等:请参考:VxWorks Programmer's Guide, 系统调用、库函数接口标准等,请参考:VxWorks Reference Manual ●有关BSP(board support package)的构成、初始化、底层驱动等,请参考“BSP Reference” ●网络应用编程指南(socket编程): “VxWorks Network Programmer's Guide” ii.host/ 该部分存放主机端(开发机)的工具,如Tornado.exe,make.exe,编译器、调试器及TCL命令解释器等等,开发中要用到的工具都存放在目录 host\x86-win32\bin 下,部分命令是.exe文件,部分是.bat的,其中有torvars.bat文 件,是设置Tornado集成开发环境的环境变量用的,在使用其他工具前,要运行它 设置正确的环境变量及可执行文件搜索路径。 iii.target/ vxWorks操作系统、源码、BSP、设备驱动、头文件、配置文件等config/ BSP的存放地方,底层开发者绝大部分时间在该目录下度过,该目录下除了all/和comps/外,其他每个目录对应一种硬件板的BSP,开发者在 做BSP开发时,原则上除了对应BSP目录能修改外,target/目录下的其他 所有目录都不应该作出改动,否则会影响到其他BSP,常用BSP有: pid7t/ →ARM公司推出的pid7 ARM7TDMI评估板的BSP integratorX/ →ARM公司推出的integratorXXX评估板的BSP tk4510a/ →我们要使用的S3C4510B板的BSP SNDS100/ →三星公司推出的SNDS100(KS3C50100/S3C4510B)板的 BSP h/ 头文件存放地点,包括vxWorks的及所有其他组件的 arch/arm/ ARM体系结构相关头文件 make/ 编译连接时要用到的规则都存放在这里 vxWorks.h wind Kernel(vxWorks的核心”Wind Kernel”的API及常量说明) lib/ vxWorks是一个商用操作系统,其不开放源码部分的.o文件及.a(库文件)文件存放在这里(当然,除了config/目录外,所有其他目录下的*.c源码在编

vxworks653编程手册

一.V xWorks653运行时系统 1.1. 运行时层 一个vxworks653模块由下面四层组成: ■core OS—必需 ■partition—至少需要一个(vThreads 或COIL-based),每个都在一个分区的操作系统之中■APEX shared library—ARINC 653 应用所需 ■POSIX shared library—POSIX 应用所需 1.1.1.Core OS层 核心操作系统提供服务给分区。 缺省的,核心操作系统使用ARINC653规范中的时间抢占的调度(TPS)来调度分区。Vxworks653的核心操作系统还可以采用APPS调度策略在TPS调度的空闲时间内调度优先级

抢占调度(PPS)使能的分区。 核心操作系统提供给每个VThreads分区操作系统的服务包括: ●分区系统资源 ●调度分区 ●代表分区的操作系统执行trap异常 ●定义和强制分区边界 ●装载分区 ●使用端口和通道在分区间传递消息 ●处理I/O ●代表应用完成系统调用 ●支持分区的调试 ●监控分区和系统的健康 1.1. 2.vThreads 层 vThreads分区操作系统在核心操作系统分配给该分区的时间内调度vThreads中的线程。vThreads不直接与设备交互,而是通过核心操作系统的系统调用。 1.1.3.APEX 层 构建在vThreads之上,遵循ARINC653规范,并且提供相应功能和API。 1.1.4.POSIX层 构建在vThreads之上,遵循用于实时扩展的POSIX标准(1003.1b)。 1.2. 装载和启动 当目标板加电时,按照下面的步骤进行装载和启动 ●初始的启动码装载核心操作系统,分区操作系统,共享库,以及应用 ●核心操作系统初始化自身,启动它自己的子系统 ●核心操作系统创建分区 ●核心操作系统启动分区调度器,并且让应用初始化自身 核心操作系统可以在初始化完成之后下载在线装载的应用程序到分区。应用可以在分区运行之时装载到分区。

Vxworks任务创建编程学习代码

任务创建编程学习代码一 此代码主要的是创建若干的任务,来学习任务的创建和删除. 程序的结构是: start函数:任务创建函数 stop函数:任务删除函数 其它为任务 请大家仔细分析代码,理解任务内务的创建和删除.本代码是在tornado2.0版本调试成功. 如有疑问联系作者jdvxworks 邮箱:foxqs@https://www.sodocs.net/doc/241122159.html, /********************************* * date:2006.7.10 time:16.08 * maker: jdvxworks * aim: create 4 task * list: task0 task1 task2 task3 * change:_____________________ *********************************/ #include "stdio.h" #include "taskLib.h" #include "vxWorks.h" //#include "semBLib.h" int taskid0; int taskid1; int taskid2; int taskid3; int loopid; SEM_ID sem_id; STATUS Err; void start(void); void test0(void); void test1(void); void test2(void); void test3(void); void stop(void); void taskloop(void); //start init task void start(void) { int i,o; long p=9999999+100000;

VxWorks操作系统RTP介绍和使用方法

VxWorks 操作系统RTP 介绍和使用方法 从VxWorks 6.x开始引入RTP(VxWorks real time process projec模t) 式编程,这种模式的优点是应用程序相互独立,互不影响,而且增加了内核的稳定性,缺点是由于“内核态”与“用户态”的内存拷贝,其执行效率有所降低,随着CPU 速度越来越快,这点效率的牺牲已经越来越不重要。相比较于传统的DKM (downloadable kernel module project ),RTP适合多个团队独立运作,然后汇总 联试,这种模式除了全局函数不能再shell 里直接调用外,其对应用程序几乎不 做任何约束,原有的DKM 工程代码稍作修改即可正常运行。内核变化较大,需 要添加较多的组件,内存需要较好的划分,为保持应用程序直接调用函数调试的 习惯,需要封装接口供用户使用。 现简单的介绍RTP使用方法,并给出demo 代码供参考。 1. 新建并编译工程: (1) File->new-> VxWorks real time process projec如t, 图【1】 图【1】 (2) 一路next 后,选择如图【2】所示的编译器

图【2】 (3) 选择Finish 后,工程新建完毕。 (4) 导入源文件:这里的源文件名称是fooRtpApp.c ,一种较快捷的方式是选 中新建的工程,按下F5,源文件会出现在工程中. (5) 右键选择编译,出现如图【3】,选择Continue 继续。 图【3】 编译完成后,会生成vxe 格式的可执行文件,此处为usrAppA.vxe 。 2. 下载可执行性文件 待板子启动后,使用ftp 将vxe 文件下载到板子中。步骤如下: (1)运行->cmd,打开对话窗口,如图【4】所示:

vxWorks学习笔记

vxWorks学习笔记 vxWorks学习笔记 2006-07-20 11:141.VxWorks开发方式:交叉开发,即将开发分为主机(host)和目标机(target)两部分。 类似于dos下C语言程序的开发。 合并开发的优点:简单 缺点:资源消耗量大,CPU支持,非标准体系的支持 host (Tornado) target(vxWork) 小程序模块 vxWorks实际采用开发模式 Tornado提供:编辑,编译,调试,性能分析工具,是vxWorks 的开发工具 vxWorks:面向对象可以剪裁的实际运行操作系统 2.vxWorks启动方式 Rom方式(vxWork_rom) vxWorks直接烧入rom Rom引导方式(bootrom+vxWorks) 其中bootrom烧入rom,vxWorks可以通过从串口,网口,硬盘,flash等下载!这里的bootrom不是开发环境中的bootable,在开发环境里bootable指的是vxWorks,downloadable指application 3.调试

attach 用来在多任务调试时将调试对象绑定到某个任务 任务级调试(attach taskName) 单个任务的调试不会影响到其他任务的运行,主要用来调用户的应用程序。 全局断点:在调另一任务或本任务时,系统运行本任务断点,则停下。各任务要配合使用。 任务断点:调本任务时,系统运行到本任务断点,则停下。如果没有attach到本任务,不起作用。 一次性断点:跑到一次之后自动删除。 系统级调试(attach system) 把所有task和系统core、中断看成一个整体,可用于调试系统和中断。对中断调试,如果不是系统级调试,无论是那种断点都不起作用 !wdbAgent不在调试范围内,当任务级调试时工作在中断方式,系统级调试工作在轮询方式。 !可是使用命令行方式的调试,参看crossWind教程。 4.调度 优先级调度(无条件) 时间片:同优先级,如果时间片没有打开,任务采取先到先运行,运行完毕在交出cpu,如果打开,则轮流使用cpu。!死循环使比它优先级低的任务都不能运行。

EPON常用命令讲解

EPON常用命令讲解 ?数据业务基本排查 ?语音业务基本排查 ?930软件脚本简介 ?其他常用命令 ?典型案例分析 数据业务基本排查 基本思路: 在PON系统内GSWC、EC2、ONU各业务环节上应保证: 配置正确 配置生效 MAC地址正确转发 ?FTTH型ONU ?FTTB型ONU 配置核查 Onu switch目录: show vlan all显示所有端口vlan; show vlan 查看交换芯片单个vlan及其所属端口的信息,如果此端口配置为出口剥离vlan,相应端口显示为UN;反之显示为VF show vlan default 显示所有端口的untag属性的vlanid; Onu Debug下相关命令: ddd show port [|all] vlan config显示系统QinQ不使能下的Fe端口vlan的配置信息show port [|all] vlan service显示系统QinQ使能下的Fe端口vlan的配置信息show port [|all] vlan translation table显示端口的软件vlan转换表 EC2 Pon目录: show qinq_config <1-2> <1-24> 查询qinq模式下ONU端口业务信息 端口检查 show port status查看交换芯片端口的状态,可以查看用户端口是否接了终端,工作模式是否正确等 查看地址转发表

ONU swtich目录 show arl查看mac地址转发表,会显示学习到的端口、vlanid和mac地址,如果用户的vlan id同时上下行数据中学到,其中26端口( CPU端口)表示下行数据正常,用户端口1-24表示上行数据正常; OLT fdb目录 show fdb slot <1-8,11-18>查看上行数据时,查看业务卡(EC2)fdb表 show fdb slot 29查看下行数据时,查看上联口fdb表 主控盘学的地址的VID应该是最外层VLAN的VID。 如果,上下行fdb表都正确,但是拨号拨不上去,可以在OL T的上连口抓包,查看进出的包内容。如果有出去的包而无回来的包,则可以判断出是上游设备出问题。 如果fdb表学习不正确,则VLAN配置有问题,可以根据fdb表的情况,先判断问题出现在哪一个设备上,再查看VLAN配置有无问题。 其他处理方式: 如时延大、丢包、组播业务等问题,可分别在EPON系统与其他系统的接口处利用抓包工具查看定位,由于上联口只能封装单层vlan,Qinq和单层vlan方式会略有差别。 FTTN型ONU 与其他ONU差异 FTTN型ONU相对其他类型ONU比较独立,对于普通的数据、语音业务,OLT相当于“透传”的通道。 配置核查: FSWB Profile目录下 创建/修改/查看ADSL2+端口模板参数: add xaplus profile ; set dsl-profile ; show dsl-profile ; 主要查看4个方面: 1.编码类型(lineCoding) 一般编码类型在开通的下行速率低于8Mb/s时采用G .dmt,大于8M时采用adsl2plusauto。 2.线路类型(channelMode) 线路类型采用interleaved更为稳定 3.训练速率(dnFastMaxTxRate,dnIntlMaxTxRate,upFastMaxTxRate,upIntlMaxTxRate) ADSL 一般最大上行可达速率为800Kb/s,下行可达速率为8Mb/s ADSL2+一般最大上行可达速率为1Mb/s,下行可达速率为28Mb/s 配置时上行速率不要超过1Mb/s,推荐640Kb/s

Dos引导VxWorks

CF卡上引导VxWorks的三种方法 方法一. 直接引导: 引导扇区 >> bootrom.sys >> VxWorks 这种方法最快,但要求bootrom.sys保持连续性(可用chkdsk检查)。 方法二. FreeDOS引导: 引导扇区 >> FreeDOS >> https://www.sodocs.net/doc/241122159.html, >> bootrom.sys >> VxWorks 这种方法牺牲少量启动时间换取灵活性,因为你可以为FreeDOS增加菜单实现选择性启动,而且许多维护性工作也可在DOS下进行。 方法三. GRUB引导: 引导扇区 >> GRUB >> FreeDOS启动盘映像 >> FreeDOS >> https://www.sodocs.net/doc/241122159.html, >> bootrom.sys >> VxWorks 这种方法比上一种更进一步,你可以利用GRUB的强大功能实现多系统引导,不过不是所有的主板都支持GRUB。 grub> kernel --type=netbsd /vxWorks 一共两个分区,都是主分区。C盘为Fat32格式,设为活动分区。D盘为Fat格式,设为非活动分区。C盘装的Winxp,用XP引导Grub4DOS。把DOS的系统文件(IO.sys,MSDOS.sys,https://www.sodocs.net/doc/241122159.html,)拷贝到D盘根目录。 修改menu.lst如下: title DOS6.22 root (hd0,1) chainloader (hd0,1)/IO.SYS title DOSDOS find --set-root (hd0,1)/io.sys chainloader (hd0,1)/io.sys title FINDDOSACT find --set-root (hd0,1)/io.sys

VxWorks操作系统MakeFile

VxWorks操作系统MakeFile(一) 时间:2008-8-24 夜 版权申明:本文为水煮鱼为水煮鱼@博客园撰写,不得用于商业用途,如需摘用,请与水煮鱼联系。 1、介绍 本文将介绍为什么要将你的C源代码分离成几个合理的独立文档,什么时候需要拆分,那又怎么拆分呢? 然后再介绍如何使用GUN Make使你的编译和链接步骤自动化。可能你使用的是其他的make工具,但是其实道理都差不多。当然如果你对自己的编程工具有怀疑的话,可以不妨实际的试试。 2、多文件项目介绍 a. why? 为什么使用多文件项目?他们有什么好处呢? 从表面上看,多文件项目是够复杂的了,又要头文件,又需要extern申明,并且如果你要查找一个文件的话,还需要在更多的文件里搜索。 但是如果把其考虑成一个项目,那一个项目根据功能划分为小的模块,那就不难理解了。 想想如果是一个一万行代码,如果你把其放到一个文件里,则在编译的时候,则需要对一万行代码进行重新编译。不过如果你如果把其放到不同的文件里,那修改一行,则只需要编译一个文件就可以了。可能你会说,一万行代码,就算全部编译,那点时间也基本可以忽略不计,但是实际情况是,在一个大的系统里,可能代码达到几十万甚至上百万,千万行代码的规模。以我们的项目为例,目前代码规模已经达到了上千万行的级别,如果全部重新编译,则将耗费几个小时甚至半天的时间。如果将其划分多多个文件,则修改一行所引入的编译代码,将不会随着你代码规模的增大而增大。所以多个文件的优点不言自明了。 不过对于不便于搜索的问题,其实只要文件划分得当,也并不会造成多大的困难。其实,从多个目标文件生成一个程序包比从一个单一文件生成程序包要好的多。当然,实际上这是不是一个优势还与你所使用的系统有关。但是当使用gcc/ld(一个GUN C编译器/连接器)把一个程序包连接到一个程序时,在连接的过程中,它会尝试不去连接没有使用到的部分,但它每次只能从程序包中把一个完整的目标文件排除在外。因此,如果你修改了一个程序包中某一个目标文档中任何一个符号的话,那么这个目标文件整个都会被连接进来。要是一个程序包被非常充分的分解的话,那么经过链接后,得到的可执行文件会比从一个大目标文件组成的程序包连接得到的文件小的多。 并且常常我们的程序是模块化的,高内聚,低耦合,使得文件之间共享部分被减少到了最少,因此采用多文件的方式,可以比较容易的找到代码中的bug。 b.when? 那什么时候分解你的项目? 如果你开发的是一个大项目,在开始前,应该好好考虑一下你将如何实现,并且将生成几个文件来存放你的代码。当然,在项目的开发过程中,你可以建立新的我文件,但是这将打乱你的整体布局,可能造成你整体结构的调整。因此特别建

VxWorks实时操作系统SIGNAL机制的应用

[摘要] 介绍VXWORKS实时操作系统的信号机制以及各种处理方法,特别是利用该机制实现异常情况的恢复和处理。 1.概述 信号可用来在同一任务内部或不同任务之间实现异步通信,从而改变对多个任务的控制流程。所有任务或中断服务程序均能向指定的任务发送信号,该信号的接收任务将立刻挂起当前的执行线程,而激活任务指定的信号处理程序。信号处理程序是由用户定义的,它关联与特定的信号,而且任务接收到该指定信号时的所有必要处理都在该程序中实现。信号的这种机制使得它特别适合于用来实现差错和异常处理。 2.信号屏蔽 在信号处理时,可通过信号屏蔽来选择需要进行处理的信号,接收到被屏蔽的信号,即使指定了相应的处理程序,也不作任何处理。 为了实现对信号的屏蔽,需要定义数据类型为sigset_t的变量,同时必须包含头文件“signal.h”。 下面介绍实现这一功能的函数: int sigemptyset ( sigset_t *pSet ) 该函数初始化信号集,使得该信号集不包含任何信号; int sigfillset ( sigset_t *pSet ) 该函数初始化信号集,使得该信号集包含所有信号; int sigaddset ( sigset_t *pSet , int signo ) 该函数向信号集中增加新的信号; int sigdelset ( sigset_t *pSet , int signo ) 该函数删除信号集中的信号; int sigismember ( sigset_t *pSet , int signo ) 该函数用来判断信号集是否包含某信号; int sigprocmask ( int how, const sigset_t *pSet, sigset_t *pOset ) 该函数用来设置信号屏蔽;这里,pSet为新的信号集,pOset为当前的 信号集,而how则指示处理方式,其取值与处理方式对应关系如下: SIG_BLOCK 结果信号集为当前信号集和指定信号集二者的并集,通过这种方式,可向当前信号集增添指定的元素; SIG_UNBLOCK 结果信号集为指定信号集的补集和当前信号集二者的交集;通过这种方式,可从当前信号集删除指定的元素;

MPC8377硬件环境下vxworks仿真的建立过程

MPC8377硬件环境下vxworks仿真的建立过程 2012-8-7 U-BOOT常用命令: 重启:reset 查看环境变量:printenv 修改环境变量:例如修改PC机IP,setenv serverip “……” 保存环境变量:saveenv 下载bootrom:run laodvx 如果需要用到其他命令,在命令行输入“?”查看。 1.首先,需要在FLASH中烧写好U-BOOT,把串口和网线连接好(如果多串口和网口的话,请检查并接在正确的位置),打开串口调试工具并设置在数据读取状态,然后上电,在倒计时读秒完成前在命令输入行输入任何信息进入U-BOOT层。 命令行 U-BOOT读秒区 2.在命令行输入printenv命令会显示U-BOOT的信息,如果ip不是我们想要的,可以通过setenv serverip “……”来修改,如下图中就把ip从192.168.1.24

改为192.168.1.43,修改完成后需要saveenv,然后reset,整个修改完成。 Printenv命令后的ip信息 Setenv serverip ”192.168.1.43” 后的结果 3.下载bootrom。先找到vxworks编译好的bootrom.bin文件,例如:本PC 上的路径C:\WindRiver-GPPVE-3.6-PPC-Eval\vxworks-6.6\target\config\mds837x,如下图。 需要的bootrom文件 把bootrom复制到tftp软件所在的位置,如下图。

放置好的bootrom文件 然后启动tftp软件,并在命令行输入:run loadvx,成功后如下图,至此bootrom 下载完毕。 下载成功后tftp显示信息 4.Vxworks下载。首先启动Vxworks6.6自带的ftp server,并配置好登陆用户和密码以及相关设置,主要有两部分设置,如下图。

学习vxworks中遇到的问题

1预期目标 用两台pc机建立起由网络进行通讯的vxworks开发环境,开发工具是tornado 2.2 for pentium,vxworks版本为5.5。 2硬件描述 宿主机是一台装有windows xp和tornado 2.2的带有网络接口的笔记本电脑,ip设置为192.168.1.101,目标机是研华的610L型号工控机,后发现在vxworks系统下驱动工控机自带网卡有困难,于是购置了一块tp-link的pci网卡,装在工控机上,网卡芯片是realtek 8139d。 3建立开发环境的方案 目标工控机上已经装有windows xp,文件系统是fat32,经试验得知工控机支持usb-zip启动,考虑到不对windows系统产生影响,决定使用u盘启动作为系统启动的方式。用u盘启动bootrom后通过网络下载存放在笔记本电脑上的vxworks系统镜像,宿主机和目标机通过网络通讯,从而建立起x86构架下的vxworks开发环境。 4工作现状 u盘启动盘通过ultraISO和tornado 2.2自带的一些工具制作成功,并能在工控机上把bootrom 启动起来到命令行,但是在加载vxworks镜像的时候不能成功。 5遇到的问题 在bsp中添加rtl8139网卡驱动,添加驱动的过程如下 (a)下载rtl8139驱动vxworks-8139(140),是适用于tornado 2.0的。 (b)将目录下的h和src两个文件夹复制到tornado 2.2下target文件夹里,把sysRtl81x9End.c 复制到bsp文件夹下。 (c)运行命令行,在C:\Tornado2.2\target\src\drv\end\unsupported目录下运行 make CPU=PENTIUM 成功,但有警告(环境变量已设置好), 在C:\Tornado2.2\target\lib\objPENTIUMgnuvx目录下生成了rtl81x91.o。 (d)修改bsp文件夹里的config.h 修改的第一处 #elif (CPU == PENTIUM) #define DEFAULT_BOOT_LINE \ "rtl(0,0)host:vxWorks h=192.168.1.101 e=192.168.1.102 u=target pw=target" 修改的第二处 #define INCLUDE_END /* Enhanced Network Driver Support */ #undef INCLUDE_DEC21X40_END /* (END) DEC 21x4x PCI interface */ #undef INCLUDE_EL_3C90X_END /* (END) 3Com Fast EtherLink XL PCI */ #undef INCLUDE_ELT_3C509_END /* (END) 3Com EtherLink III interface */ #undef INCLUDE_ENE_END /* (END) Eagle/Novell NE2000 interface */ #undef INCLUDE_FEI_END /* (END) Intel 8255[7/8/9] PCI interface */ #undef INCLUDE_GEI8254X_END /* (END) Intel 82543/82544 PCI interface */ #undef INCLUDE_LN_97X_END /* (END) AMD 79C97x PCI interface */

实时操作系统包括硬实时和软实时的区别

一.什么是真正的实时操作系统 做嵌入式系统开发有一段时间了,做过用于手机平台的嵌入式Linux,也接触过用于交换机、媒体网关平台的VxWorks,实际应用后回过头来看理论,才发现自己理解的肤浅,也发现CSDN上好多同学们都对实时、嵌入式这些概念似懂非懂,毕竟如果不做类似的产品,平时接触的机会很少,即使做嵌入式产品开发,基本也是只管调用Platformteam封装好的API。所以在此总结一下这些概念,加深自己的理解,同时也给新手入门,欢迎大家拍砖,争取写个连载,本文先总结一下实时的概念,什么是真正的实时操作系统 1. 首先说一下实时的定义及要求: 参见Donal Gillies 在Realtime Computing FAQ 中提出定义:实时系统指系统的计算正确性不仅取决于计算的逻辑正确性,还取决于产生结果的时间。如果未满足系统的时间约束,则认为系统失效。 一个实时操作系统面对变化的负载(从最小到最坏的情况)时必须确定性地保证满足时间要求。请注意,必须要满足确定性,而不是要求速度足够快!例如,如果使用足够强大的CPU,Windows 在CPU空闲时可以提供非常短的典型中断响应,但是,当某些后台任务正在运行时,有时候响应会变得非常漫长,以至于某一个简单的读取文件的任务会长时间无响应,甚至直接挂死。这是一个基本的问题:并不是Windows不够快或效率不够高,而是因为它不能提供确定性,所以,Windows不是一个实时操作系统。 根据实际应用,可以选择采用硬实时操作系统或软实时操作系统,硬实时当然比软实时好,但是,如果你的公司正在准备开发一款商用软件,那请你注意了,业界公认比较好的VxWorks(WindRiver 开发),会花光你本来就很少的银子,而软实时的操作系统,如某些实时Linux,一般是开源免费

打通VxWorks调试环境 Step by Step(X86)

打通VxWorks调试环境Step by Step 1 引言 1.1 编写目的 概要说明如何建立使用Tornado开发、调试VxWorks的环境(X86版本)。 1.2 背景 1.3 定义 HOST:主机,运行Tornado集成环境,FTP Server,Target Server,以及编辑、build 工程、下载目标文件的各种软件工具; TARGET:目标机,HOST产生的vxWorks映像运行的位置,对于X86版本来说也是一台PC ; TORNADO:C:\Tornado,安装Tornado的路径; BSPNAME:C:\Tornado\target\config\pc486,BSP的路径,本例中我们选择pc486;PROJECT:C:\Tornado\proj\Project2,我们自己创建的工程的路径; BIN:C:\Tornado\host\x86-win32\bin,Tornado的可执行程序的路径; HOME:C:\Tornado\host\x86-win32\bin,FTP用户的根目录。 1.4 参考资料 Tornado User’s G uide (Windows Version), 2.0, Edition 1 VxWorks Programmer’s Guide, 5.4, Edition 1 2 总体描述 2.1 硬件环境 HOST与TARGET通过以太网互连,并且位于同一网段;同时,串口通过直连电缆(NULL Modem Cable)连接。目标机配置有软盘驱动器,网卡为3com 3c905B. 2.2 软件环境 主机操作系统为Windows 2000简体中文专业版(SP3);安装Tornado Version 2.0和Win 2k 补丁。 (CD No. TDK-12835-ZC-01 & TDK-13127-ZC-00, T2 LM for x86) 2.3 预览 在VxWorks调试环境中,HOST与TARGET之间连接的方式有多种,比如串口和网络;引导TARGET的方式也有多种,当然对X86平台来说最简单的是软盘引导了。在本文档中我们以网络连接、软盘引导为例,建立起调试环境。主要步骤包括: HOST上启动FTP Server, 配置BSP 创建可以引导TARGET的Boot ROM, 制作引导盘(软盘), 用软盘引导TARGET, TARGET通过网络连接从HOST下载vxWorks映像文件, TARGET运行vxWorks, HOST上启动Target Server连接Target Agent,成功建立调试环境之后,就可以在HOST 生成目标模块,下载到TARGET运行,并通过Tornado集成环境进行调试。

VxWorks 基本概念

VxWorks基本概念 Bootrom和Boot image的区别,Boot image和VxWorks image的联系和区别 bootrom 是指on-chip bootrom,在CPU芯片内部,内嵌有小的boot程序(bootloader),类似于PC机主板上的BIOS的存储区域。和boot image不是一回事。VxWorks文档中的bootrom区是指boot image存放的位置。 boot image的作用是把VxWorks image 加载到主板。boot image只初始化很少的硬件系统如串口,网口等。为加载VxWorks image做准备,当VxWorks系统下载完毕后,b oot image的作用也就完成了。 VxWorks image含有完整的VxWorks OS.是真正运行于目标板上的操作系统。应用程序运行于VxWorks系统之上。 boot image 和VxWorks image生成在使用BSP文件上的区别在于:在启动顺序中Bootrom调用bootConfig.c,而VxWorks调用usrConfig.c. 在ROM中VxWorks运行的方式(和bootrom编译到一起还是单独固化到ROM中),在ROM中的内存分配? VxWorks加载到主板运行,分不同的情况,如果VxWorks是压缩的,加载时解压到RAM的RAM_HIGH_ADRS.如果是ROM based VxWorks,VxWorks image的data段复制到RAM的LOCAL_LOW_ADRS, text部分留在ROM并在ROM中执行。 既不压缩又不ROM based的VxWorks直接copy到RAM_LOW_ADRS运行。 若在config.h中修改系统设置,如增加网卡等,是否需要重新烧bootrom?如果增加其他oem产品呢? 如果主板中有Boot image存在则不需要重新烧,用FTP等download加载VxWorks 即可。 VxWorks 系统编程中任务级与中断级的通讯如何实现? 中断是由硬件触发,软件的作用只是将中断服务例程(ISP)与中断事件连接起来。 1.使能中断,函数intEnable()。 2.用intConnect()登记中断号,和相应的中断例程ISR.这样一旦有中断发生,系统自动跳转到相应位置执行ISR.

vxworks培训教程(10)

Wind River Systems Tornado Training Workshop ? Copyright Wind River Systems 10-1Chapter 10 Exceptions, Interrupts,and Timers Exception Handling and Signals Interrupt Service Routines System Clock, Auxiliary Clock, Watchdog Timers

Wind River Systems Tornado Training Workshop ? Copyright Wind River Systems 10-2Exceptions, Interrupts, and Timers 10.1Exception Handling and Signals Interrupt Service Routines Timers Exception handling Using signals Installing user-de?ned signal handler

Wind River Systems Tornado Training Workshop ? Copyright Wind River Systems 10-3Exception Handling Overview ?An exception is an unplanned event generated by the CPU. Examples include: trap or breakpoint instruction, divide by zero, ?oating point or integer over?ow, illegal instruction, or address error. ?An exception will generate an “internal” interrupt. ?VxWorks installs exception handlers at system startup.These handlers will run on an exception and will try to invoke a user-de?ned exception handler. ? A VxWorks exception handler communicates with a user tasks by sending a signal. The user-installed handler will then run. ?Exceptions vary across CPU architectures. The help page for excLib contains information about generic exception handling, while the page for excArchLib discusses architecture-speci?c routines.

相关主题