学习vxworks中遇到的问题

合集下载

学习vxworks中遇到的问题

学习vxworks中遇到的问题

学习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:\T ornado2.2\target\lib\objPENTIUMgnuvx目录下生成了rtl81x91.o。

vxworks使用过程中的100个疑问与解答

vxworks使用过程中的100个疑问与解答

vxworks使用过程中的100个疑问与解答1. VxWorks是什么?VxWorks是一种实时操作系统(RTOS),由美国Wind River公司开发,适用于嵌入式系统。

2. VxWorks有哪些特点?VxWorks具有高度可靠性、实时性、可移植性和可扩展性等特点。

3.如何安装VxWorks?安装VxWorks需要下载安装包,然后按照安装指南进行安装。

4.如何创建VxWorks任务?可以使用taskSpawn函数来创建任务,指定任务的入口函数、优先级等参数。

5. VxWorks如何进行任务间通信?任务间可以使用消息队列、信号量、共享内存等机制进行通信。

6.如何调试VxWorks程序?可以使用Wind River公司的调试工具Wind River Workbench进行调试。

7. VxWorks支持哪些开发语言?VxWorks主要支持C和C++开发,也可以使用汇编语言和Java等。

8.如何加载和运行VxWorks程序?VxWorks程序可以通过TFTP、FTP等网络协议加载到目标设备上,然后使用命令运行。

9. VxWorks是否支持多任务?是的,VxWorks支持多个任务的同时运行,并通过任务调度器进行任务切换。

10.如何实现任务间的同步?可以使用信号量、事件标志等机制实现任务间的同步。

11. VxWorks中如何实现中断处理?VxWorks提供了中断服务例程(ISR)和处理器驱动程序(DPC)来处理中断。

12.如何列出VxWorks系统中的任务?可使用taskShow命令列出系统中所有任务的详细信息。

13.如何获取任务的优先级?可以使用taskPriorityGet命令获取任务的优先级。

14.如何设置任务的优先级?可以使用taskPrioritySet命令设置任务的优先级。

15.如何控制任务的时间片轮转?可以使用taskDelay命令来控制任务的时间片轮转。

16.如何查看VxWorks系统的中断信息?可以使用intShow命令来查看系统中的中断信息。

VxWorks中的中断应用设计要点

VxWorks中的中断应用设计要点

VxWorks中的中断应⽤设计要点硬件中断处理是实时系统设计中的关键性问题,设计⼈员有必要对其作深⼊研究,以更好地满⾜开发⼯作需要。

⽂中以VxWorks操作系统为软件平台,讨论了在实时系统中进⾏中断应⽤设计时要注意的⼀些问题。

由于软硬件的相关性,选⽤⼴泛应⽤的X86架构的嵌⼊式汁算机为硬件平台,对PenriumCPU和计算机主板对硬件中断的管理机制也做了详细介绍所得出的研究结论在具体的开发项⽬中均得以验证,可供相关技术⼈员参考。

硬件中断处理是实时系统设计中最重要、最关键的问题。

⽂中综合软硬件,从⼯程应⽤的⾓度对此问题加以讨论。

⽂中所述内容针对的软件平台是VxWorks实时操作系统,硬件平台选⽤⼴泛使⽤的X86架构的嵌⼊式计算机,全⽂按照CPU、主板、操作系统⾃下⽽上的顺序展开。

1 Pentium CPU的中断类型有两类事件可引起Pentium挂起当前的指令流,即中断和异常。

中断是由外部事件引发的,在程序执⾏的任何时刻都可能出现;异常也称异常中断,是由内部事件引发的。

中断和异常各有两类触发源:(1)中断。

可屏蔽中断:CPU的INTR引脚收到有效信号,如果Pentium标志寄存器IF位为1,则允许中断,否则信号在CPU内被屏蔽。

⾮屏蔽中断:CPU的NMI引脚收到有效信号⽽引发的中断,这类中断不能被阻⽌。

(2)异常。

执⾏异常:CPU试图执⾏⼀条指令的过程中出现错误、故障等不正常条件⽽引发的异常中断。

执⾏软件中断指令:Pentium指令系统中包括⼀些如INTO,INT n这类软件中断指令,执⾏时产⽣异常中断。

详细分类的话,Pentium可以识别256种中断和异常。

每种中断给予⼀个编号,即0~255,称为中断向量号(interrupt vector number)。

其中NMI、异常以及系统保留占⽤中断向量号0~31,⽽32~255为⽤户中断向量号,可供INTR和⾃定义软件中断(如汇编中的INT指令)使⽤。

最新-VxWorks汉字显示解决方案 精品

最新-VxWorks汉字显示解决方案 精品

VxWorks汉字显示解决方案摘要论述上对多字节码的显示支持,着重讨论其存储结构和意义,并给出汉字显示的实现方法。

关键词操作系统组件汉字点阵国标编码1操作系统图形显示方案作为嵌入式实时操作系统,在国内应用已非常广泛,但原厂商没有直接提供完备的汉字显示解决方案。

本文这个热点论题,通过对显示组件的分析,具体给出一种汉字显示的方案。

的汉字显示首先需要一种图形解决方案,只有工作在图形模式下才可能显示汉字。

有三种显示方案可供选择。

1+是-的简称,其中包含。

该组件直接控制显示硬件,主要提供显示模式设置、标准输入输出控制、点线面作图等函数,编程接口很类似于、里的图形库。

基于,提供了类风格的接口,有各种控件被封装于内,编程接口很类似于编程。

2+提供的支持,在上启动虚拟机来解释语言;图形开发编程接口是语言,虚拟机的图形实现基于。

3+++使显示编程接口成为编写网页,可以通过远程的来访问而使设备具有远程显示接口,也可以在本机做使设备具有本机显示接口。

该的实现需要或的支持。

上述方案内,纯的方案不需要本地汉字显示,只要在网页上放国标码或码等,由远程的去实现显示;其它方案基本上都需要的支持,这是因为系统里所有底层的显示操作都是通过实现的。

2汉字显示方案实现本地汉字显示的方案一定会涉及到,只是不同的方案对的依赖程度有所不同,一般有如下几种。

①利用对双字节编码的支持,实现对汉字的点阵存储、点阵获取、点阵显示的全过程,并使用的双字节显示函数实现汉辽码到汉字显示。

这种方法使用了系统机制,最根本的解决方法,并使的其它上层组件很方便地实现汉字显示。

②自己开发点阵存储、点阵获取、点阵显示,改造的双字节和单字节显示函数,使其能判断汉字码,一旦判断出汉字码,则使用自己开发的点阵获取、点阵显示等把汉字显示出来。

该方法对点阵的操作更加灵活,适合非标准的点阵算法,或者当开发者已有成熟的点阵操作方法时,把该方法绑接到上。

③完全自己开发一套点阵存储、点阵获取、点阵显示、汉字显示函数,使用者使用特定的汉字显示函数把汉字显示出来。

VxWorks系统异常分析方法

VxWorks系统异常分析方法

1、任务异常的一般表现:i)指令异常:系统打印program异常或instruction access异常。

ii) 访问非法地址异常,串口打印data access异常。

iii)中断处理中产生的异常。

data accessException current instruction address:0x00187d4cMachine Status Register:0x00009030Data Access Register: 0x8003435cCondition Register:0x48000080Data storage interrupt Register:0x0000000bTask:0xc844f0 "XXX"2、可能的原因:i)堆栈写越界,主要是数组写越界,导致前面声明的变量(因为堆栈是从下往上增长的)或者函数的参数或者函数返回的地址被改写为无效值。

ii) 堆栈溢出,堆栈声明过小,而函数又声明了大数组,超出堆栈的容量。

iii) 内存改写,这是最通常出现的原因。

包括,指针没有初始化,导致访问随机地址;访问空指针;内存操作范围越界,例如在使用memcpy/memset等函数使用的长度超过所分配,导致改写了其他的指针。

因此在定位异常问题过程中,可以通过内存管理先查看一下先前是否有内存写越界的记录,但是内存写越界只有在释放该内存区时才能检查到,如果该内存没有被释放,则即使写越界也是不知道的。

iv)系统调用不当,在中断回调中,使用printf,semTake之类可能引起阻塞的操作;printf等使用不当导致内存改写,这些函数在中断回调函数中是严格禁止的。

v) 增量编译引起的问题,Tornado和workbench增量编译有时会出现问题,导致古怪的异常,重新全量编译后,可能个会解决问题。

vi)多任务抢占引起的问题,当多个任务共同访问一个或者多个变量时,如果互斥不当,可能会产生同步或互斥的问题,比较典型的是:任务A和B都使用一个变量指针P;而A和B的优先级不同(即存在任务抢占),则他们在释放或者修改这个变量指针的时候,可能会出现随机的异常访问问题。

VxWorks任务编程中常见异常分析

VxWorks任务编程中常见异常分析

VxWorks任务编程中常见异常分析在任务运行过程中,会出现一些异常的情况,导致任务不能正常运行或者对操作系统造成影响。

一般来说,这些异常是由程序的逻辑错误造成的,防止这些异常情况的出现和出现后进行补救就有格外重要的意义。

1 代码重入与共享在应用中,可能会出现多个任务调用同一段代码的情况,由于任务占用CPU是串行的,不会出现代码资源使用冲突。

但是,不同优先级的任务同时调用同一段代码,则可能出现低优先级任务执行某一函数时被执行该函数的高优先级任务打断的情况,如果函数中要改写全局变量而没有使用互斥,就有可能导致错误的存取。

例如在中断中调用内存分配或者释放函数,如果某个任务正在调用内存分配函数或者是内存释放函数,打断该任务时会造成异常,可能导致内存泄漏,甚至有可能会因在中断中异常而reboot。

另外,如果多个任务共用的代码中有全局变量且使用目的不同,或者多个任务的代码中有全局变量同名的情况,则有可能造成变量使用中的错误。

VxWorks提供了任务变量(taskVar)的方法来解决这个问题,任务可以将使用的全局变量作为任务变量独立使用,添加的任务变量保存在任务的上下文中,任务切换时保存当前内容。

2 符号表的使用VxWorks中有模块(module)的概念。

装载模块完成目标代码文件在内存中的链接,并可以将目标代码文件中的函数与全局变量加入符号表。

符号表中的符号对C语言编写的函数以原来名字命名,对于C++语言的函数则是在后面加上形参的数据类型作为符号名。

如f1( )的符号名为f1__Fv,最后的v表示void类型;f2(int)符号名为f2__Fi,f3(int,int)为f3__Fii,依此类推。

代码的编译过程中并不对要使用的函数和变量进行检查。

例如调用一个并不存在的函数编译并不报错,编译器认为此函数可能在操作系统内核中或者已经下载的目标文件中,但在目标文件下载时会找不到要调用的函数。

如果符号表中的符号出现了重名,譬如两次下载的目标文件中有函数重名,则要作散列处理,之后对该函数的调用是最后加入符号表的函数,而之前已经装载的模块则不会受到影响。

第4.3节 VxWorks信号中断和定时

第4.3节 VxWorks信号中断和定时
ISR没有任务控制块(TCB),并且所有的 ISR共享一个堆栈
18
VxWorks中断处理流程
保存CPU寄存器 从中断控制器读中断向量号 顺序调用该中断服务程序 通知中断控制器中断服务程序结束 恢复CPU寄存器 返回
第4章
.
19
中断和优先级
第4章
.
20
ISR的使用限制
第4章
.
ISR执行完成之前,其它任务不能执行 ISR中不能调用某些VxWorks函数,尤其是,ISR不
信号量
ISR释放信号量,任务等待接收信号量
消息队列
ISR发送消息,任务等待接收消息,如果消息队列满,该消息被丢弃
管道
ISR向管道写消息,任务读消息
信号
ISR可以向任务发送signal。
23
调试中断
第4章
.
中断处理程序可以调用logMsg()向系统输出诊断信 息
logMsg(“foo = %d\n”,foo,2,3,4,5,6) 向tLogTask发送请求为我们实现printf()的功能
轮询硬件 检查系统错误
VxWorks提供对两种定时器的相同的接口
系统时钟 辅助时钟
26
系统时钟
第4章
.
系统时钟完成下列工作
增加ticks计数(使用tickGet()获得计数值)
更新延时和超时计数器
检查循环调度
默认的时钟频率是60Hz
sysClkRateSet()
设置时钟频率
参考sigLib (组件:INCLUDE_SIGNALS)
6
信号编号
第4章
.
31个信号编号,从1-31
#define #define #define #define

VxWorks中文FAQ

VxWorks中文FAQ
前言(Surface): 随着国内使用VxWorks的用户越来越多,为了方便VxWorkers少走一些弯路,特别推出了中文FAQ,其中很多的FAQ来自comp.os.vxworks和原创。(很多FAQ都可以在该新闻组找到英文版)文档的FAQ总共分为7大类: 1.入门FAQ 2.Tornado工具FAQ 3.BSP FAQ 4.文件系统 FAQ 5.网络 FAQ 6.VxWorks操作系统 FAQ 7.其它 FAQ 基本涵盖了Tornado/VxWorks使用中的主要方面。文档组织本身没有逻辑上的关联,经过分类,只是松散的组合在一起,可根据你的需要选择阅读某一部分。为了保持本文档的开放性和可扩充性,欢迎大家把自己曾经碰到过的问题及其解决办法按分类加到文档里来。在修改本文档时,请把修改记录加到历史记录里。欢迎任何人指出文档中的错误之处,请把错误之处发到附录B里的任一个EMAIL里,在此对那些问题的提出者、回答者以及文档的维护者一并表示感谢!当前版本(Current Version): version 0.1 历史(History): 2002-08-27 wys205 create 0.1 version 目录(Content): 1.入门FAQ 1.1 概念 1.2 环境 1.3 编程 2.Tornado工具FAQ 2.1 编译器和链接器 2.2 调试器 2.3 FTP 2.4 主机工具 2.5 安装 2.6 MAKEFILE 2.7 工程 2.8 目标机服务器 2.9 Shell 2.10 Telnet 2.11 Tornado 2.12 版本控制 2.13 Visual Studio集成 2.14 Windsh 2.15 WindView 3.BSP FAQ 3.1 不同BSP 3.2 处理器 3.2.1 Power PC 3.2.2 I960 3.2.3 MIPS 3.2.4 ARM 3.

VxWorks调试手段和方法总结

VxWorks调试手段和方法总结
2
etach and Resume 单击 Detach and Resume 可以使当前任务脱离调试器的控制,并使任务继续执行
4 断点
断点类型 l 任务级断点,仅对当前调试任务有效,设置时单击菜单命令Debug|Toggle BreakPoint
也可将光标放在源文件处,点击 图标 l 全局断点,对所有任务都有效,设置全局断点,采用菜单命令Debug|Toggle Global
: 中断程序的执行。若当前调试的任务正处于全速运行的状态,可以中断其执行。
:使程序继续执行(Continue),F5 :单步(Step Into),F11 :单步(Step Over),F10
4
:跳出当前函数(Step Out),SHIFT+F11 Continue 程序中止以后,可以使用Debug菜单的Continue命令恢复程序执行。如果没有遇到断点、 中断或信号,任务一直运行到结束。 Step Into 单击Step Into,可以单步执行程序。如果打开了调试器的观察窗口(检查数据、内存和 堆栈),窗口中的值会随着程序的单步执行自动更新。如果遇到一个子程序调用,Step Into 会单步运行到子程序的第一行,即可以进入调用的子程序。但是当调用了系统子程序和编译 时不带调试信息的应用子程序时,Step Into不会进入该子程序。 当Editor窗口的当前视图显示出汇编代码(从View下拉菜单中选择Disassembly或Mixed, 或是当前代码没有调试符号),Step Into将会使程序执行到下一条指令,而非下一条源代码。 Step Over 如果需要单步执行程序而不进入其子程序,单击Step Over。Step Over命令与Step Into命 令类似,只是在遇到子函数调用时,Step Over会一次将子函数执行完,并停在子函数调用的 下一条语句。 Step Out 当单步运行一个程序时,可能会发现问题出现在当前子函数的上一级调用函数处。这时 可以使用Step Ou命令继续执行程序直到当前子函数结束。程序停在子函数调用的下一条语 句,Debugger重新获得控制权。 Run to Cursor 为了使程序执行到一个特定的位置,却不想在此设置断点,可以将光标放在所需的代码 行,单击鼠标右键,在弹出的菜单中选择Run to Cursor。

vxWorks学习笔记

vxWorks学习笔记

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 直接烧⼊romRom 引导⽅式( bootrom+vxWorks )其中bootrom 烧⼊rom,vxWorks 可以通过从串⼝,⽹⼝,硬盘,flash 等下载!这⾥的bootrom 不是开发环境中的bootable,在开发环境⾥bootable指的是vxWorks , downloadable 指application3. 调试attach⽤来在多任务调试时将调试对象绑定到某个任务任务级调试( attach taskName) 单个任务的调试不会影响到其他任务的运⾏,主要⽤来调⽤户的应⽤程序。

全局断点:在调另⼀任务或本任务时,系统运⾏本任务断点,则停下。

各任务要配合使⽤。

任务断点:调本任务时,系统运⾏到本任务断点,则停下。

如果没有attach 到本任务,不起作⽤。

⼀次性断点:跑到⼀次之后⾃动删除。

系统级调试(attach system)把所有task和系统core、中断看成⼀个整体,可⽤于调试系统和中断。

对中断调试,如果不是系统级调试,⽆论是那种断点都不起作⽤!wdbAgent 不在调试范围内,当任务级调试时⼯作在中断⽅式,系统级调试⼯作在轮询⽅式。

!可是使⽤命令⾏⽅式的调试,参看crossWind 教程。

VxWorks系统使用中的C语言注意事项

VxWorks系统使用中的C语言注意事项

VxWorks应用中的C语言注意事项
1、仅在本文件中使用的函数,尽量加入static关键限定词。

2、如果要使用“//”来进行注释的话,需要在项目的编译选项中去掉-ansi,因为它不是ansi
C的标准定义的。

3、命名方式尽量统一。

4、尽量减少代码重复,为后期维护减少很大的工作量。

5、Goto函数的使用尽量精简,如果可能尽量不使用,使用时注意嵌套。

6、对于编译出现的告警信息尽可能地全部消除,增加程序可靠性。

7、看门狗喂狗的动作不宜太频繁,500ms一个喂狗动作即可,可使用tick检测方式来实现。

太频繁的喂狗会增加系统负荷,同时可能使其他任务的喂狗动作得不到及时处理而触发看门狗动作。

8、看门狗的注销动作。

9、文件操作中部分函数如rename函数,针对不同BSP或者文件系统,其支持程度不尽相
同,使用时需先验证其支持程度,如果不支持则需要重写该函数。

10、创建一个任务时,首先要确定此任务是否已经创建,同时增加如果已经存在的处理,
删除已启动的任务继续创建还是直接退出。

确认方式检查taskNameToId(taskName)此函数是否返回error。

11、为保证电子盘的使用寿命,对电子盘写操作尽量减少,(次数尽量减少),可以一次
写入的内容不要分成多次写入。

12、避免使用define定义复杂函数。

13、提炼公共函数,将经常使用的代码段提炼成精简的函数,并与同事共享。

(给出函
数头文件及详细说明)
1。

VxWorks下的高速缓冲存储器一致性问题解决方案

VxWorks下的高速缓冲存储器一致性问题解决方案

欢 迎 投 稿
・14・
© 1995-2004 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
3 FEC 发送帧函数3 FEC SEND FRAM E ()
{
3 填写发送 buffer 内容, 实际填写在 data cache 中3 = data; sp tr tx buffer〔 i〕 …… . txB d. dataPo in ter= (char3 ) sp tr tx buffer; fec 3 将填写在 data cache 中的内容写回内存中的实际发 送 buffer ( 即以 sp tr tx buffer 为地址的内存) 中3 cache F lu sh (DA TA CA CH E, sp tr tx buffer, 1518) ; 3 启动发送命令, FEC 控制器发送内存中 buffer 内容 而非 data cache 中内容3 3 (U I N T 32 3 ) V X I m m rGet () + M O T FEC TX A CT O FF ) ) = M O T FEC TX A CT; } 3 FEC 接收帧函数3 FEC R ECE I V E FRAM E () { 3 取得实际接收 buffer 的地址3 pB uffer= (vo id 3 ) fec. rxB d. dataPo in ter; 3 将 RXBD 对应的内存中接收 buffer 中内容写回 data cache 中3 cache Invalidate (DA TA CA CH E, pB uffer, 1520) ; 3 vp tr buffer= pB uffer; 3 以后 CPU 可以安全使用接收 buffer 中的内容3 3 vp tr buffer 了3 } 参 考 文 献

VxWorks系统下软件异常运行的故障定位方法

VxWorks系统下软件异常运行的故障定位方法

Science and Technology &Innovation ┃科技与创新2023年第19期·89·文章编号:2095-6835(2023)19-0089-03VxWorks 系统下软件异常运行的故障定位方法赵昶宇(天津津航计算技术研究所,天津300308)摘要:在VxWorks 软件系统下,受限于目前的测试手段和技术,在应用程序测试阶段容易忽略一些隐蔽的程序缺陷或者错误,导致应用程序在运行过程中出现软件死机和系统复位的现象。

对于软件开发人员而言,软件运行过程中死机和系统复位的现象不一致,随机出现且很难复现,给程序缺陷和错误的定位造成了很大的困难。

总结了VxWorks 操作系统中软件死机和系统复位等异常的故障定位方法,能够帮助软件开发人员和测试人员在最短的时间内定位并解决故障,保证VxWorks 软件系统稳定运行。

关键词:VxWorks 系统;软件死机;系统复位;故障定位中图分类号:TP311文献标志码:ADOI :10.15913/ki.kjycx.2023.19.027在VxWorks 系统下开发实时软件的过程中,由于软件开发人员的经验或技术能力不足,导致开发出的软件在后期运行的过程中偶尔出现软件死机或者系统复位的现象。

这些VxWorks 系统下的异常现象往往是内存泄漏、堆栈溢出或非法指针操作等原因造成的系统崩溃。

由于出现这些故障的现象不一,而且往往很难故障复现,所以故障定位异常困难。

通常情况下采用在线调试(通过网络或是串口)的手段对VxWorks 系统下出现的软件故障进行跟踪调试。

但是一旦VxWorks 系统出现死机或者复位时,就无法进行在线调试。

现有的解决VxWorks 系统下死机或复位的方法有基于堆栈异常定位故障、任务死循环定位、堆栈回溯分析法、看门狗电路等。

这些方法大多只是针对某一种故障现象提出定位方法,或者只是能够检测软件出现故障,不能定位故障,对于VxWorks 系统下死机和复位故障定位提供的帮助有限。

VxWorks任务挂死实战分析

VxWorks任务挂死实战分析

VxWorks任务挂死实战分析背景描述操作系统:VxWorks 5.5CPU:MIPS32 74Kc内核CPU现象描述:联调代码时发现应⽤层代码调⽤以下接⼝函数必现任务挂死,检查代码发现⼊参均合法,代码逻辑没问题,未发现异常。

/******************************************************************************* FunctionName : switch_port_qconfig_set* Author : justin* CreateDate : 20210606* Description : set port cosq qcofnig cell* InputParam : int unit* int ponno, PON⼝号,取值范围0~15* int cosq, 0~7 for UNI ports* int port_guarantee_cells, THDO_QCONFIG_CELL[Q_MIN_CELL]* int q_shared_alpha, THDO_QCONFIG_CELL[Q_SHARED_ALPHA_CELL]* OutputParam : NA* ReturnValue : 0 - ok; <0 - error;* Relation : NA* OtherInfo : NA******************************************************************************/int switch_port_qconfig_set(int unit, int ponno, int cosq, int port_guarantee_cells, int q_shared_alpha){int switchport = 0;/*参数初始化*/int cpu_cosq_num = NUM_CPU_COSQ_MAX;int port_cosq_num = 0;int thdo_qconfig_cell_queue_no = 0;uint32 thdo_qconfig_cell_entry = 0;/* 检查⼊参 */if (port_guarantee_cells < THDO_QCONFIG_CELLS_MIN){return RV_ERROR;}/* 限定最⼤值 */if (port_guarantee_cells > THDO_QCONFIG_CELLS_MAX){port_guarantee_cells = THDO_QCONFIG_CELLS_MAX;}/* alpha值取值范围为0~9 */if ((q_shared_alpha < THDO_QCONFIG_ALPHA_MIN) || (q_shared_alpha > THDO_QCONFIG_ALPHA_MAX)){return RV_ERROR;}/* 只⽀持配置UNI端⼝ */if ((ponno < linecard_pon_port_begin()) || (ponno > linecard_pon_port_end())){return RV_ERROR;}switchport = switch_oldport_to_newport(ponno);/* 获取端⼝COSQ队列数 */BCM_IF_ERROR_RETURN(bcm_cosq_config_get(unit, &port_cosq_num));/* 计算指定端⼝指定COS队列的序号 */thdo_qconfig_cell_queue_no = cpu_cosq_num + (switchport - 1) * port_cosq_num + cosq;BCM_IF_ERROR_RETURN(READ_MMU_THDO_QCONFIG_CELLm(unit, MEM_BLOCK_ANY, thdo_qconfig_cell_queue_no, &thdo_qconfig_cell_entry));/* 保存默认配置 */if (0 == g_switch_pon_qconfig[ponno][cosq].flag){g_switch_pon_qconfig[ponno][cosq].q_min_cell = soc_mem_field32_get(unit, MMU_THDO_QCONFIG_CELLm,&thdo_qconfig_cell_entry, Q_MIN_CELLf);g_switch_pon_qconfig[ponno][cosq].q_shared_alpha = soc_mem_field32_get(unit, MMU_THDO_QCONFIG_CELLm,&thdo_qconfig_cell_entry, Q_SHARED_ALPHA_CELLf);g_switch_pon_qconfig[ponno][cosq].flag = 1;}{soc_mem_field32_set(unit, MMU_THDO_QCONFIG_CELLm,&thdo_qconfig_cell_entry, Q_MIN_CELLf, g_switch_pon_qconfig[ponno][cosq].q_min_cell);soc_mem_field32_set(unit, MMU_THDO_QCONFIG_CELLm,&thdo_qconfig_cell_entry, Q_SHARED_ALPHA_CELLf, g_switch_pon_qconfig[ponno][cosq].q_shared_alpha);}else if ((THDO_QCONFIG_CELLS_MIN != port_guarantee_cells) && (THDO_QCONFIG_ALPHA_MIN != q_shared_alpha)){soc_mem_field32_set(unit, MMU_THDO_QCONFIG_CELLm,&thdo_qconfig_cell_entry, Q_MIN_CELLf, port_guarantee_cells);soc_mem_field32_set(unit, MMU_THDO_QCONFIG_CELLm,&thdo_qconfig_cell_entry, Q_SHARED_ALPHA_CELLf, q_shared_alpha);}BCM_IF_ERROR_RETURN(WRITE_MMU_THDO_QCONFIG_CELLm(unit, MEM_BLOCK_ANY, thdo_qconfig_cell_queue_no, &thdo_qconfig_cell_entry));return RV_OK;}根本原因1、bcopy()拷贝越界导致2、调试过程中发现,交换SDK库⽂件指定-O2编译选项,此时r30寄存器被当作通⽤寄存器s8使⽤;⽽其他模块使⽤默认的-O0编译选项,此时r30寄存器被当作fp(frame pointer)指针使⽤。

漏洞分析VxWorks系统典型漏洞分析与影响范围统计

漏洞分析VxWorks系统典型漏洞分析与影响范围统计

漏洞分析VxWorks系统典型漏洞分析与影响范围统计一、VxWorks系统概述VxWorks是美国风河(Wind River)公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。

良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。

VxWorks支持几乎所有现代市场上的嵌入式CPU,包括x86系列、MIPS、PowerPC、Freescale ColdFire、Intel i960、SPARC、SH-4、ARM、StrongARM以及xScale CPU。

它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。

正因为VxWorks操作系统的开放性、模块化和可扩展性的系统结构特征以及能在多线程、多任务的系统环境中达到高实时要求的PLC 控制要求,在保证实时性的同时,实现多点位、复杂功能的PLC系统控制目标,因此被广泛用于物联网嵌入式设备及工业控制领域。

西门子、施耐德、罗克韦尔的多款PLC设备软件搭载在VxWorks系统上运行。

二、VxWorks漏洞统计根据威努特IVD工控漏洞库()的统计,当前VxWorks操作系统存在16个漏洞,其中有CVE编号的漏洞数量为13个。

虽然VxWorks操作系统的CVE漏洞数量控制的很好,但是由于其应用的广泛性,上述漏洞的影响范围依旧很大。

图1、威努特IVD工控漏洞库中VxWorks漏洞的统计三、VxWorks系统在中国的联网分布根据威努特ICS-Radar(https://)的统计,截止2017年12月13号,在中国的互联网上共发现8600个运行VxWorks系统的设备,其中开放wdbrpc这种高危服务的有3561个,占41.4%。

ICS-Radar对wdbrpc v1和wdbrpc v2协议均支持探测,通过探测发现中国的VxWorks系统主要集中在VxWorks 5.5.x和VxWorks 5.4.x版本上,VxWorks 6.x版本系统占比较小,详细统计见图2。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 */#undef INCLUDE_ULTRA_END /* (END) SMC Elite16 Ultra interface */#define INCLUDE_RTL_81X9_END /* Realtek 81x9 Fast Ethernet Controller */修改的第三处#if defined (INCLUDE_LN_97X_END) || defined (INCLUDE_EL_3C90X_END) || \ defined (INCLUDE_FEI_END) || defined (INCLUDE_DEC21X40_END) || \defined (INCLUDE_GEI8254X_END) || defined (INCLUDE_AIC_7880) || \defined (INCLUDE_WINDML) || defined (INCLUDE_USB) || \defined (INCLUDE_RTL_81X9_END)# define INCLUDE_PCI修改的第四处#define INCLUDE_PC_CONSOLE /* PC keyboard and VGA console */(e)修改bsp文件夹里的configNet.h修改的第一处#ifdef INCLUDE_RTL_81X9_END/** load string format* <devMemAddr>:<devIoAddr>:<pciMemBase:<vecnum>:<intLvl>:<memAdrs>:* <memSize>:<memWidth>:<csr3b>:<offset>:<flags>*/#define RTL_81X9_BUFF_LOAN_0 1#define RTL_81X9_LOAD_FUNC sysRtl81x9EndLoad#define RTL_81X9_LOAD_STR_0 endLoadStr[0] /* First entry loc */#define RTL_81X9_LOAD_COUNT 4IMPORT END_OBJ * RTL_81X9_LOAD_FUNC (char *, void *);char endLoadStr [RTL_81X9_LOAD_COUNT] [END_DESC_MAX];#endif /* INCLUDE_RTL_81X9_END */修改的第二处#ifdef INCLUDE_RTL_81X9_END{0, RTL_81X9_LOAD_FUNC, RTL_81X9_LOAD_STR_0, TRUE, NULL, FALSE},#endif /* INCLUDE_RTL_81X9_END */(f)修改bsp文件夹里的sysLib.c修改的第一处#ifdef INCLUDE_RTL_81X9_END#include "sysRtl81x9End.c"#endif /* INCLUDE_RTL_81X9_END */修改的第二处#ifdef INCLUDE_RTL_81X9_ENDsysRtl81x9PciInit ();#endif /* INCLUDE_RTL_81X9_END */(g)编译不通过,显示没有rtl81x91.h的规则。

之后在bsp目录下的makefile文件中的TGT_DIR = $(WIND_BASE)/target一行下面添加了一行ADDED_MODULES += rtl81x9.o,并把rtl81x9.o拷贝到bsp目录下。

编译通过并启动运行,但是加载vxworks镜像不成功。

(好像也可以改另外一处:MACH_EXTRA = rtl81x9.o。

)运行时的一些现象如下目标机即工控机运行到bootrom后自动加载笔记本电脑里的vxworks镜像,屏幕显示Loading (XXXXX)Starting at 0x308000然后停止不动了宿主机即笔记本上的ftp窗口没有任何信息显示笔记本的网络接口灯是亮的,在目标机显示下载的时候还有闪烁,感觉网络链路上有数据传送。

在改变宿主机ftp里的vxworks镜像时,loading后面的数字也随着变化,与生成vxworks镜像时显示的大小对应,感觉目标机下载镜像了。

6不解之处1)不知道经过上面的步骤是否将rtl8139驱动添加成功,在书中看到还有添加网卡中断号宏定义的内容,但是找不到添加的位置。

2)不知道除了添加网卡驱动之外,是否还需要对bsp其他地方进行必要的修改。

对照你们做的半实物仿真系统电脑里的bsp包还发现了一些修改,比如对INCLUDE_WINDML,VIRTUAL_WIRE_MODE,RAM_LOW_ADRS,RAM_HIGH_ADRS的修改,这些是否是必须的。

3)不知道对vxworks的镜像制作有没有要求,上面的试验中用到的系统镜像是对使用了修改后的bsp建立的可启动工程编译得到的,除了添加了shell没有对工程其他地方进行修改。

(后来在建立工程后,在工程的Builds/default/property/macros中,在Name填入ADDED_MODULES,在Value中填入rtl81x9.o,然后点Add/Set,点Apply,OK,编译得到系统镜像,用这样的镜像后,宿主机的ftp服务器界面显示下载成功,目标机还是下载后就停止不动了。

)4)另外在目标机上现安装了两块网卡一块为8139d另一块为intel的pro/1000 Pl的千兆网卡,在试验时没有将千兆网卡卸下,不知是否对8139的链接产生影响。

5)对于处理器的型号,我们选择的是pentium,而半实物仿真系统里使用的是pentium2,不知是不是处理器型号选择不正确的原因。

6)不知道怎么样能够在wdb agent和target server建立连接之前进行调试,很是苦恼,只能改一点,试一次。

由于本人刚刚接触vxworks,思路还不太清晰,表达可能会有疏漏,看完上面的内容可能花费你不少时间,对此深表歉意。

对于上面提到的不解之处,希望你能帮忙讲解一下,不胜感激。

相关文档
最新文档