VxWorks 6.3 编程调试要点

合集下载

VxWorks调试环境构建全过程

VxWorks调试环境构建全过程

VxWorks 调试环境构建全过程设定VxWorks开发环境如下:宿主机端(Host):普通PC机一台;Tornado2.0 IDE;BSP为x86 Pentium3架构。

目标机(Target): x86 Pentium3 CPU, 网卡为intel8255x系列(标识:fei)。

主机和目标机通过网线连接,制作步骤详述如下(为了图文一致,以下假设目标机BSP文件夹名为:pcPentium):1 .修改配置文件我们要修改编译VxWorks的配置头文件Config.h中定义的一些参数,使编译出来的系统引导程序和VxWorks的映象符合我们的要求。

(1)定位到目录C:\tornado2.2\target\config\pcPentium并打开该目录下Config.h文件;(2)查找到定义DEFAULT_BOOT_LINE宏的地方,修改预处理条件CPU == PENTIUM3分支下的定义如下:#define DEFAULT_BOOT_LINE \"fei(0,0)host: vxWorks h=192.168.80.169 e=192.168.80.254 u=target pw=target tn=target"其中:∙fei(0,0)指定了使用第0个网卡和第0个处理器,fei这个标识代表intel8255x系列100M网卡,若目标机为intel8255x系列网卡,则标识为gei;∙host指定你的主机的名字,使用host就可以;∙vxWorks指定了VxWorks映象下载的完整路径(后面会有说明);∙h=192.168.80.169是宿主机的IP地址,可以根据实际情况修改;∙e=192.168.80.254是目标机的IP地址,可以根据实际情况修改;∙u=target指定了FTP服务器的用户名,这个FTP就是用来下载VxWorks 映象的;∙pw=target是FTP服务器与用户名target对应的密码;∙tn=target指定目标机的名字,任意指定即可。

VxWorks调试手段和方法总结

VxWorks调试手段和方法总结
终止调试 可以通过以下两种方式终止调试(Stop Debugging): l 在以上 CrossWind 工具栏中,单击 图标 l 在 Debug 下拉菜单中单击 Stop Debugging 选项 终止调试将关闭调试器,相应的调试工具选项将变成灰色,如需进行调试,需重新启 动调试器。 中断 Debugger 单击 CrossWind 工具栏中的 图标或选择 Debug 下拉菜单中的 Interrupt Debugger 选 项可以中断程序的执行。若当前调试的任务正处于全速运行的状态,可以中断其执行。
: 中断程序的执行。若当前调试的任务正处于全速运行的状态,可以中断其执行。
:使程序继续执行(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。

(完整word版)VxWorksSMP多核编程指南

(完整word版)VxWorksSMP多核编程指南

VxWorks SMP多核编程指南本文摘自vxworks_kernel_programmers_guide_6.8 第24章1.介绍VxWorks SMP是风河公司为VxWorks设计的symmetric multiprocessing(SMP)系统。

它与风河公司的uniporcessor(UP)系统一样,具备实时操作系统的特性。

本章节介绍了风河VxWorks SMP系统的特点。

介绍了VxWorks SMP的配置过程、它与UP编程的区别,还有就是如何将UP代码移植为SMP代码。

2.关于VxWorks SMP多核系统指的是一个系统中包含两个或两个以上的处理单元。

SMP是多核技巧中的一个,它的主要特点是一个OS运行在多个处理单元上,并且内存是共享的。

另一种多核技巧是asymmetric multiprocessing(AMP)系统,即多个处理单元上运行多个OS。

(1)技术特点关于CPU与处理器的概念在很多计算机相关书籍里有所介绍。

但是,在此我们仍要对这二者在SMP系统中的区别进行详细说明。

CPU:一个CPU通常使用CPU ID、物理CPU索引、逻辑CPU索引进行标示。

一个CPU ID通常由系统固件和硬件决定。

物理CPU索引从0开始,系统从CPU0开始启动,随着CPU个数的增加,物理CPU索引也会增加。

逻辑CPU索引指的是OS实例。

例如,UP 系统中逻辑CPU的索引永远是0;对于一个4个CPU的SMP系统而言,它的CPU逻辑索引永远是0到3,无论硬件系统中CPU的个数。

处理器(processor):是一个包含一个CPU或多个CPU的硅晶体单元。

多处理器(multiprocessor):在一个独立的硬件环境中包含两个以上的处理器。

单核处理器(uniprocessor):一个包含了一个CPU的硅晶体单元。

例如:a dual-core MPC8641D指的是一个处理器上有两个CPU;a quad-core Broadcom 1480指的是一个处理器上有四个CPU。

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命令来查看系统中的中断信息。

vxworks653编程手册

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. 装载和启动当目标板加电时,按照下面的步骤进行装载和启动●初始的启动码装载核心操作系统,分区操作系统,共享库,以及应用●核心操作系统初始化自身,启动它自己的子系统●核心操作系统创建分区●核心操作系统启动分区调度器,并且让应用初始化自身核心操作系统可以在初始化完成之后下载在线装载的应用程序到分区。

应用可以在分区运行之时装载到分区。

1.3. 运行时模型核心操作系统处理来自每个分区的系统调用,并且在运行系统调用前校验每个系统调用的语句。

VxWorks的调试手段

VxWorks的调试手段

2.Browser
• 可对系统对象(任务、消息队列、信号量等)和 存储器使用情况进行观察的浏览器。可以方便地 监视用户的 目标系统。Browser汇总了应用进程, 内存消耗和一个目标内存的映像。通过 Browser, 用户可以观察信号量、消息队列、内存分配、看 门狗计时器、堆栈使用情况、目标 CPU使用率、 对象模块结构和符号表以及每个任务的详细信息。 • 可以分析: 内存泄漏、内存碎片、堆栈溢出、优先 级反转






如何查看error.log文件 如何查看error.log文件
记下了发生异常的任务号、进程号、当前处理消息、内存占用情况、堆 栈调用关系等有用信息: Current call stack: nargs=10; 0x1157c02 : 0x115f80 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) nargs= 1; 0x115f91 : 0x11c09f (0) nargs= 1; 0x11c106 : 0x11e89c (0x1d8db07b) nargs= 1; 0x11e8c5 : 0x11bac8 (0x1d8db07b) nargs= 0; 0x11bae0 : 0x11e91c () nargs= 3; 0x11e947 : 0x15a1f0 (0x1df0c7fb, 0, 0) nargs= 1; 0x15a2e4 : 0x15a640 (0x1df0c7fb)
VxWorks & 支撑系统 调试手段
2004-082004-08-17
Tornado:Vxworks集成开发环境 Tornado:Vxworks集成开发环境
调试机(Host)与目标机(Target)
一 Tornado的调试工具 Tornado的调试工具

VxWorks操作指南

VxWorks操作指南

VxWorks操作指南项目\子项目名称:3G BTS平台分系统拟制部门:科技发展部拟制日期:2000.2.28目录1. 实时嵌入式操作系统V X W ORKS (3)2.V X W ORKS和T ORNADO (4)3.T ORNADO的配置 (5)3.1 主机的设置:Tornado Register (5)3.2 目标的设置 (6)4.T ORNADO开发工具的使用介绍 (7)4.1 Editor (7)4.2 Projects(Tornado 2.0版本特有) (7)4.3 Shell (8)4.4 Debugger (9)4.5 Browser (10)4.6 GNU工具 (10)4.7 Target Server (11)5.V X W ORKS的启动过程及相关例程 (12)5.1 VxWorks启动的一般原理 (12)5.2 MSDOS的启动过程 (13)6.V X W ORKS的多任务管理 (14)6.1多任务 (14)6.2任务状态转换 (14)6.3 wind任务的排序(scheduling)机制 (14)6.4 任务控制 (15)6.5 任务的删除和删除安全 (15)6.6 任务异常处理 (16)6.7 VxWorks系统任务 (16)7任务间通信(原语消息的传递) (16)7.1 概述 (16)7.2 互斥 (17)7.3 同步 (18)7.4 删除安全 (19)7.5 中断和任务间的通信 (19)8应用程序的加载 (19)1.实时嵌入式操作系统VxWorksVxWorks操作系统是一种应用广泛的嵌入式实时多任务操作系统。

其内核WIND具有强占式优先级排序的多任务处理能力,提供了任务间同步和通信的机制,支持中断处理、看门狗定时器和内存管理功能。

VxWorks的开发环境是Tornado,应用程序的开发语言是ANSI C和C++。

VxWorks的开发体系是代理-服务器(Agent-Server)结构体系,即驻留在主机(Host)的开发工具Tornado通过目标服务器(Target Server)指示目标上的目标代理(Target Agent)进行目标板上的操作并将结果返回给主机。

精Vxworks教程

精Vxworks教程

06 VxWorks内存管 理编程实践
动态内存分配策略
分段内存管理
将内存划分为不同大小的段,根据需求动态分配和释 放内存段。
内存池管理
创建多个内存池,每个内存池管理特定大小的内存块 ,提高内存分配效率。
自定义内存分配器
根据应用需求,实现自定义的内存分配器,以满足特 定场景下的内存管理需求。
内存泄漏检测工具使用
优化内存使用技巧
减少全局变量使用
尽量避免使用全局变量,以减少内存占用和 提高程序可维护性。
合理使用指针和引用
在传递数据时,尽量使用指针和引用而非直 接传递数据,以降低内存消耗。
及时释放不再使用的内存
在程序运行过程中,及时释放不再使用的内 存资源,避免造成不必要的内存浪费。
使用内存对齐和压缩技术
合理利用内存对齐和压缩技术,提高内存使 用效率并降低内存碎片化的风险。
01
根据目标硬件平台和开发需求选择合适的编译器,如GNU
Compiler Collection (GCC) 或 Wind River Diab Compiler。
设置编译器选项
02
在Workbench中配置编译器的选项,如优化级别、警告级别、
语言标准等。
编译项目
03
使用选定的编译器对项目进行编译,生成可在目标硬件上运行
同步与互斥机制实现
互斥锁
条件变量
互斥锁是一种用于实现互斥访问共享 资源的同步机制。在VxWorks中,互 斥锁通过`mutexCreate()`函数创建, 并通过`mutexLock()`和 `mutexUnlock()`函数进行锁的获取 和释放。当一个任务获取了互斥锁时 ,其他试图获取该锁的任务将被阻塞 ,直到锁被释放。

Vxworks下如何建立在线调试环境

Vxworks下如何建立在线调试环境

Vxworks下如何建立在线调试环境在VxWorks下建立可进行单步调试的环境。

本教程以图为主。

方便初级用户学习。

此调试环境由两个步骤:1)制作可引导型bootrom,从网络加载Vxworks.2)建立可下载型工程,编写测试代码。

1. 制作可引导型的bootrom.sys其它默认选择默认设置项。

修改target/config/LX3060_BSP/config.h文件,使其从硬盘引导:最后编译生成bootrom,制作并生成bootrom.sys。

,如下图:小技巧:1)制作bootrom.sys时,可在PC机上虚拟出A盘(使用RamDiskNT工具)。

2)制作bootrom.sys的命令,可使用批处理来完成,个人使用的批处理内容如下:call C:\T ornado2.2\host\x86-win32\bin\torvars.batcd C:\T ornado2.2\target\config\LX3060_BSP\make bootrommkboot A: bootrom2. 在可引导型工程上编译Vxworks2.1在工程的“Vxworks”选项卡中,选择所需要的组件。

如果要包含Shell组件,则如下图所示:如果要想使用”cd”, “pwd”, “copy”命令,应包含如下组件:编译并生成Vxworks镜像文件(位于当前工程的default目录下)2.2设置FTP启动Tornado2.2.1的FTP Server,启动方法是如下图2-6所示:(图2-6)首先进入用户设置窗口,操作方法如下图2-7所示:(图2-7)弹出的用户设置窗口如下图2-8所示:(图2-8)选择用户user(如果没这个用户,需要创建一个新用户,用户名和口令都是user),在Home Directory中,输入Vxworks镜象文件所在路径,按“Done”按钮确认退出。

启动目标机后,目标机会自动连接 FTP Server,从指定路径下载Vxworks镜像文件。

VxWorks 6.3 编程调试要点

VxWorks 6.3 编程调试要点

VxWorks 6.3 编程调试要点(仅供内部使用)文档作者:周礼兵日期:2007-03-05开发/测试经理:_______________ 日期:___/___/___项目经理:_______________ 日期:___/___/___版权所有不得复制目录目录 (2)1系统特点 (3)2编程调试 (3)2 .1应用程序的运行 (3)2 .1.1Shell 下运行 (3)2 .1.2自启动运行 (4)2 .1.3通过workbench运行 (4)2 .2内核模块的运行 (4)2 .3ROMFS (4)2 .4应用程序的系统调用 (5)2 .4.1系统调用的一些约束 (5)2 .4.2静态的增加系统调用函数 (5)2 .4.3动态的增加系统调用函数 (6)2 .5共享数据区域 (7)2 .6动态库 (7)2 .6.1共享库(Shared Libraries) (7)2 .6.2Plug-ins (7)2 .7多任务 (8)2 .7.1任务变量(Task Variables) (8)2 .7.2VxWorks task (8)2 .7.3POSIX Threads (8)2 .7.4任务调度 (8)2 .8信号量 (8)2 .8.1VxWorks semaphores (8)2 .8.2POSIX Semaphores (8)2 .9消息队列 (8)2 .9.1VxWorks Message Queues (8)2 .9.2POSIX Message Queues (8)2 .10Sockets (8)2 .11Pipes (9)2 .12VxWorks events (9)2 .13POSIX Queued Signals (9)2 .14内存管理 (9)2 .15Shell 解析器 (9)3设计要点 (10)参考文档 (11)VxWorks 6.3 编程调试要点关键词: 内核态、用户态、消息、信号、信号量、管道、任务、线程缩略语说明:RTP(real-time process)、POSIX(Portable Operating System UNIX)、MMU(Memory Management Unit)1 系统特点VxWorks 6.3除了兼容以前低版本(如:VxWorks 5.5)内核外,增加一些其它的功能。

26 VxWorks应用程序编写和调试实验

26 VxWorks应用程序编写和调试实验

实验26 VxWorks应用程序编写和调试实验一实验原理本实验介绍如何在Tornado中编写应用程序控制数码管,并通过Tornado将应用程序下载到目标板运行。

二实验目标1. 学习如何在Tornado中编写应用程序并调试。

三实验步骤1. 建立交叉开发环境,参照实验3将实验2生成的VxWorks映象文件的二进制代码下载到目标机并运行起来,如果成功超级终端中将出现如下界面:2. 配置和启动目标服务器选择Tools→Target Server→Config来新建一个配置,如下图所示。

在上图中选择wdbrpc(即使用以太网连接,因此实验过程必须正确接通网络)。

Target Name/IP Address中设置目标机VxWorks的IP地址,这个地址可在VxWorks控制台下通过version命令查看,如下所示的结果在Boot line的提示中e=192.168.1.100即表示该VxWorks的IP地址为192.168.1.45。

-> versionVxWorks (for CVTECH JX2410-X ARM920T (ARM)) version 5.5.Kernel: WIND version 2.6.Made on Apr 4 2007, 10:43:16.Boot line:rtl(0,0) host_rjxy:vxWorks h=192.168.1.180 e=192.168.1.100 u=vxworks pw=vxworksvalue = 91 = 0x5b = '['在上图的Target Server Properties下拉列表框中选择Core File and Symbols,并在File编辑框中选择实验2中生成的vxWorks文件(请注意不要选择vxWorks.bin),如下图所示选择“E:\ARM9资料\南京大学\实验代码\2\default\vxWorks”。

vxwork调试笔记

vxwork调试笔记

Vxworks的应用程序一方面可以和内核集成在一起进行调试,另外一个方面也可以将应用程序和内核分开来进行调试,当应用程序无误后再集成到内核中。

下面将详细介绍第二种调试方法,这种方法调试最方便。

使用这种方法可以不用每次都将应用程序写好,然后和内核一起编译下载到目标机中,只需动态的向目标机中加载应用程序的.o文件即可以对其进行调试,加快了开发的速度。

要想将应用程序和内核分开来进行开发调试,首先必须有一个可以稳定运行VxWorks 内核,这里可以使用以前做好了的BSP来生成内核。

首先将这个可执行代码下载到目标系统或烧写到目标系统中,将VxWorks内核运行起来,接下来的工作就是配置Tornado。

笔者在调试之前使用的是公司已经移植好了VxWorks 操作系统的平台进行调试的。

调试之前必须保证你的目标机已经上电并通过网络或串口与宿主机相连,下载应用程序的目标代码之前先进行一些配置,按下图所示进行操作:(1)配置Target server当目标系统运行起来后,就可以通过选择Tools->Target Server->Config来新建一个配置,如下图(如果通过串口连接则选择wbdserial,如果是网络连接则选择wbdpc)注意图中画红线的地方,Target Server栏填入宿主机也就是PC机的IP地址,如我的电脑的IP地址为192.168.1.161Target Name/IP Address栏输入移植了Vxworks操作系统的目标机地址,如我调试的目标机的地址为172.96.88.34,设置完成后,点击Lauch按钮,启动Target Server 服务,启动之后,会弹出一个如下图所示的窗口。

(2)当目标系统运行起来,且Target Config也做了正确配置并启动了该配置,就可以在“Tornado Launch”工具条的第一栏选择目标系统,192.168.1.161@liuwei,注意图中画红色圈圈的地方,如下图:(3)编写测试程序代码,测试程序代码如下图所示,所做的功能就是创建两个任务,然后让这两个任务交替的去运行。

VxWorks使用说明书

VxWorks使用说明书
针对不同网卡其名称不同如NE2000及其兼容网卡为ENE3COM以太网卡为ELTIntel网卡为EEX 在config.h文件 中修改相应网卡类型(如网卡为3COM网卡)定义部分:
# IO_ADRS_ELT 网卡I/O地址 # INT_LVL_ELT 网卡中断号
并且修改# DEFAULT_BOOT_LINE定义:
# DEFAULT_BOOT_LINE \ "ene(0,0)host:c:/tornado/target/config/pc486/vxWorks h=129.9.75.39 e=129.9.49.7 u=x86 pw=x86 tn=x86" ene(0,0) /* 启动设备为网卡 */ host /* 主机标识可以任意填写不影响启动过程 */ c:\tornado\target\config\pc486\vxWorks ; /* 需要从主机加载映象文件 */ h=129.9.75.39 ; /* 主机IP地址 */ e=129.9.49.7 /* 目标机IP地址 */ u=x86 ; /* 用户名主机Ftp服务器必须有相应同名用户 */ pw=x86 /* 密码必须与主机Ftp服务器相应同名用户密码相同*/ tn=x86 ; /*目标名可以任意设置不影响启动过程*/
.1 .启动盘制作 在实时应用系统开发调测阶段往往采用以PC机作为目标机来调测主机PC和目标机PC之间可采取串口或是网口 进行联结由于大多数目标已配有网卡网络联结成为最简单快速连接方式串口联结虽通信速率不高也有它自己优 点系统级任务调试(如中断服务ISR)需使通信方式工作在Polled 模式网口联结就不支持因此可以裁剪掉系统 中网络部分以使VxWorks系统更小满足目标板内存约束下面分别对这两种通信方式下目标机VxWorks系统启动 盘制作作简要介绍(以PC机为目标系统)

VxWorks下Shell调试总结

VxWorks下Shell调试总结

FD_SET(_ULONG32)sddl_console_fd, &readfd);
在判断fd中是否有数据也是通过readfd和一个宏来实现的
FD_ISSET(_ULONG32)cl_v_shell_out_fd,&readfd)
FD_ISSET(_ULONG32)sddl_console_fd,&readfd)
#ifdef _CL_TARGET_SHELL_INPUT_USE_PIPE_
cl_v_shell_in_fd = cl_v_shell_input_pipe_fd;
#else
cl_v_shell_in_fd = (_LONG32)sddl_console_fd;
cl_v_shell_taskId = taskNameToId("tShell");
pipeDevCreate(“pe/v_sh_out",_CL_V_SHELL_PIPE_MSG_MAX_NUMBER_, _CL_V_SHELL_PIPE_MSG_MAX_LEN_)
cl_v_shell_output_pipe_fd = open (“pe/v_sh_out", O_CREAT | O_RDWR, 0644);
ioctl (consoleFd, FIOBAUDRATE, (int)baudrate);
ioGlobalStdSet( STD_OUT,sddl_console_fd );
ioGlobalStdSet( STD_ERR,sddl_console_fd );
这样主命令行任务起来后,注册一个命令用来调用Shell,比如调用Shell的回调函数为switch_to_vxWorks_shell(),那么就在这个函数里面实现创建tShell任务,创建管道,重定向串口和字符处理的功能。如下

Vxworks操作系统下基本程序的编写和说明

Vxworks操作系统下基本程序的编写和说明
Vxworks操作系统下基本程序的编写
-------
BJTU
第一章 多任务
多任务运行的实现实际上是靠CPU(中央处理单


元)在许多任务之间转换、调度。 CPU只有一个,轮番服务于一系列任务中的某一 个。 任务在自己的时间内运行,因时间片相当短,因 此,给用户的感觉,就好像任务是同时运行的一 样。 如果计算机拥有多个CPU,任务就能真正意义上 同时运行了。 多任务运行使CPU的利用率得到最大的发挥(流 水线),并使应用程序模块化。
轮转调度:优先级相同、处于就绪态的任务公平的分配CPU
时间片轮番调度法(不讲)

I. II.
当两个或两个以上任务有同样优先级,内核允 许一个任务运行事先确定的一段时间,叫做时 间额度(quantum),然后切换给另一个任务。 也叫做时间片调度。 内核在满足以下条件时,把CPU控制权交给 下一个任务就绪态的任务: 当前任务已无事可做 当前任务在时间片还没结束时已经完成了
不可重入型函数
int Temp; //全局变量 void swap(int *x, int *y) //形参,作用域为 此函数执行时 { Temp = *x; *x = *y; *y = Temp; }
非重入性(Reentrancy)
使Swap()函数具有可重入性



把Temp定义为局部变量(任务有自己的动态堆 栈,每个任务只是在自己的堆栈内进行操作。) 调用Swap()函数之前关中断,调用后再开中断 (牺牲了实时性): int locknumber = intLock( );//关中断 intUnlock ( locknumber ); //开中断 禁止任务抢占调度: taskLock(); //禁止抢占调度 taskUnlock(); //恢复抢占调度 用信号量禁止该函数在使用过程中被再次调用

设置vxWorks硬件断点调试

设置vxWorks硬件断点调试

设置vxWorks硬件断点调试设置vxWorks硬件断点调试分类: vxworks 2011总结 2011-11-28 19:13 72人阅读评论(0) 收藏举报In VxWorks 5.5 shell, we could use the following tool to set hardware breakpoint:-> bh address, access, task, count, quietaccess: 0 - instruction,1 - read/write data,2 - read data,3 - write dataFor example, if you want to monitor the data write to the address 0x27b5600, you could use:-> bh 0x27b5600, 3, 0, 0, 0When any tasks try to write data to the address 0x27b5600, it will break and the related task will be suspended.Here is an example on how to debug stack overflow using the hardware breakpoint. It is related to an IPv6 CR, which is good for demonstration.---------------------1. Background---------------------In IPv6, when an interface is configured with a new address, the switch would send out a NS message to determine if the given address has been used by another switch.If yes, the switch would get a response NA message, then it would give up the given address. This process is called DAD(duplicate address detection). DAD is performed for bothIPv6 management interface and the other general IPv6 interfaces.----------------2. Problem----------------When the tester assigns the duplicate IPv6 management address on the different switches, she gets the following error message:SW WARNING checkStack: task: 2 tid: 0x27699a8 name: tNetTask size: 9984 cur: 248 high: 9984 margin: 0It means that the task tNetTask is overflow or is corrupted in the processing of the incoming DAD NA message.----------------------3. Investigation----------------------This issue might be caused by stack overflow or corruption, we need reproduce it and analyze the stack information.Step (1): Make the related tasks breakable. Since the tNetT ask is overflow in this case, we make it first.In the shell, run the following command:-> taskOptionsSet(tNetTask, 7, 5)Step (2): Select the address to be monitored.We need select an address in the stack of tNetTask as the one to be monitored.In the shell, we could use the following command to get some general stack information of the task tNetTask.-> ti tNetTask---------------------------------------------------------------------------------------------------------------NAME ENTRY TID PRI STATUS PC SP ERRN O DELAY------------- ----------- -------- ---- ------------ ------- -------- ------- -----tNetTask netTask 2692518 50 READY 1423c0 2692420 0 0stack: base 0x2692518 end 0x268fe08 size 9984 high 2344 margin 7640options: 0x5VX_SUPERVISOR_MODE VX_DEALLOC_STACKVxWorks Events--------------Events Pended on : Not PendedReceived Events : 0x0Options : N/Ar0 = 0 sp = 2692420 r2 = 0 r3 = 0 r4 = 0 r5 = 0 r6 = 0 r7 = 0 r8 = 0 r9 = 0 r10 = 0 r11 = 0 r12 = 0 r13 = 0 r14 = 0 r15 = 0r16 = 0 r17 = 0 r18 = 0 r19 = 0r20 = 0 r21 = 0 r22 = 0 r23 = 0r24 = 0 r25 = 0 r26 = 0 r27 =r28 = 0 r29 = ffffffff r30 = b030 r31 = 17e0700msr = b030 lr = 0 ctr = 0 pc = 1 423c0cr = 20000043 xer = 0value = 0 = 0x0-------------------------------------------------------------------------------------------------------------As we can see, the stack end address is 0x268fe08. Let us display the memory nearby this address.-> d 0x268fe08, 20, 4-------------------------------------------------------------------------------------------------0268fe00: 744e6574 5461736b * tNetTask*0268fe10: 00eeeeee eeeeeeee eeeeeeee eeeeeeee *................*0268fe20: eeeeeeee eeeeeeee eeeeeeee eeeeeeee *................*0268fe30: eeeeeeee eeeeeeee eeeeeeee eeeeeeee *................*0268fe40: eeeeeeee eeeeeeee eeeeeeee eeeeeeee *................*0268fe50: eeeeeeee eeeeeeee *................*value = 21 = 0x15--------------------------------------------------------------------------------------------------As it is shown above, the tNetTask's name is saved at its stack end address. Normally, it should not be changed except for stack overflow or corruption. Let us select this address as the one to be monitored.-> bh 0x268fe08,3,0,0,0Step (3): Reproduce the problemWhen I reproduce the problem, it breaks by the hardware breakpoint with the following information:------------------------------------------------------------------------------------------------------------------------------------------------Break at 0x0268fe08: G_MacAddrCapacity+0x4933c0 Task: 0x2692518 (tNet T?/}DìWò?°:ú7ePe)------------------------------------------------------------------------------------------------------------------------------------------------It is obviously that the address 0x268fe08 is corrupted by tNetTask itself. I could guess that the problem is not caused by the stack corruption. But I still need dump and analyze the satck information to confirm and to find out the reason for the stack overflow.Step (4): Dump and Analyze the stack of tNetTaskThis time, we can not display the information of tNetTask using "ti tNetTask" as before, since the stack end part has been corrupted.-> ti tNetTask----------------------------------------Undefined symbol: tNetTask-----------------------------------------We could try its TID. The TID of tNetT ask is given in Step (4), 0x2692518. We could also get the TID using command "i".-> ti 0x2692518----------------------------------------------------------------------------------------------------------------------NAME ENTRY TID PRI STATUS PC SP E RRNO DELAY---------- ------------ -------- --- ---------- -------- -------- ------- -----tNet•T?/}DnetTask 2692518 50 SUSPEND a0d08 268f8b 0 0 0stack: base 0x2692518 end 0x268fe08 size 9984 high 9984 margin 0options: 0x5VX_SUPERVISOR_MODE VX_DEALLOC_STACKVxWorks Events--------------Events Pended on : Not PendedReceived Events : 0x0Options : N/Ar0 = ba78c4 sp = 268f8b0 r2 = 0 r3 = 12be6e8r4 = 268fe0c r5 = 412 r6 = 0 r7 = 3e07841cr8 = 0 r9 = 1520000 r10 = 14c r11 = 0r12 = 0 r13 = 0 r14 = 0 r15 = 0r16 = 0 r17 = 0 r18 = 0 r19 = 124d1b8r20 = 2690b40 r21 = 420 r22 = 124d1bc r23 = 2690e60r24 = 0 r25 = 0 r26 = 2690d40 r27 = 4r28 = 268f930 r29 = 268f930 r30 = 15235a8 r31 = 2690d60msr = b030 lr = 107a04 ctr = 137 pc = a0d08cr = 20842043 xer = 0value = 0 = 0x0----------------------------------------------------------------------------------------------------------------------We can see that tNetTask is suspended by the hardware breakpoint. The sp register has the top stack frame address, it has the value 0x268f8b0, which is lower than the stack end address 0x268fe08. The stack grows from high address to low address.VxWorks has a shell tool to do stack trace on task:-> tt 0x2692518--------------------------------------------------trcStack aborted: error in top frame--------------------------------------------------In our case, It doesn't work since the overflow part of the stack might be corrupted by other tasks. I have to dump the call stack by myself.-> d 0x268f8b0, 50, 4--------------------------------------------------------------------------------------------------0268f8b0: 0268f8d0 00000000 00000000 00000000 *.h..............*0268f8c0: 00000000 0268f930 015235a8 02690d60 *.....h.0.R5..i.`*0268f8d0: 0268f910 00ba78c4 00000000 00000000 *.h....x.........*0268f8e0: 00000000 00000000 00000000 00000000 *................*0268f8f0: 00000000 00000000 02690d40 02690e60 *.........i.@.i.`*0268f900: 0268f930 0268f920 02690d60 02690d60 *.h.0.h. .i.`.i.`*0268f910: 026909a0 004ca2ec 00000000 00000000 *.i...L..........*0268f920: 00000000 00000000 00000000 00000000 *................*0268f930: 00000000 00000000 00000000 00000000 *................*0268f940: 00000000 00000000 00000000 00000000 *................*0268f950: 00000000 00000000 00000000 00000000 *................*0268f960: 00000000 00000000 00000000 00000000 *................*0268f970: 00000000 00000000 *................*value = 21 = 0x15--------------------------------------------------------------------------------------------------The data at address 0x268f8b0 has the value 0x0268f8d0, which is the address of the next level stack frame. Let us analyze this stack frame:-------------------------------------------------------------------------------------------------0268f8d0: 0268f910 00ba78c4 00000000 00000000 *.h....x.........*-------------------------------------------------------------------------------------------------The data at address 0x0268f8d4 is the return address. We could find the related function it belongs to.-> lkAddr 0x00ba78c4----------------------------------------------------------0x00ba780c BF_set_key text0x00ba7a30 BIO_new text0x00ba7ac8 BIO_set text0x00ba7b80 BIO_free text0x00ba7c50 BIO_read text0x00ba7d8c BIO_write text0x00ba7efc BIO_puts text0x00ba8014 BIO_gets text0x00ba813c BIO_int_ctrl text0x00ba8164 BIO_ptr_ctrl text0x00ba81a0 BIO_ctrl text0x00ba82b8 BIO_callback_ctrl textvalue = 0 = 0x0-----------------------------------------------------------So, it belongs to the function BF_set_key. Using the similar method, we finally could get the whole call stack as follows: -------------------------------------vxTaskEntry()netTask()dec21x40RxIntHandle()dec21x40Recv()endRcvRtnCall()muxReceive()endEtherInputHookRtn()rcip6InputSniffer()ipv6ProcessFrame()ifyDipRx()processIngressPacket()ifyRpcInProcLocalPkt()v6ProcLocalPkt()v6InnerProcLocalPtk()v6NdRx()v6procNbrAdv()ifyDADComplete()duReport()bf_encrypt_NP_info()BF_set_key()---------------------------------------------------------4. Root Cause---------------------According to some investigation, the call stack itself has no errors. But when I look into the code of the function bf_encrypt_NP_info, I find it declares a huge local struct data as follows:int bf_encrypt_NP_info(const unsigned char *inText, char *retText){char iv[8];int enc_data_length=0;BF_KEY key;…}typedef struct bf_key_st{BF_LONG P[BF_ROUNDS+2];BF_LONG S[4*256]; --> 4*4*256 = 4096 bytes} BF_KEY;In Step (2), we could see that the stack size for tNetTask is only 9984, which is much less than that of tMainTask(81232). When the function bf_encrypt_NP_info is called, its local parameters run out of the free space of the stack, which makes it overflow.。

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

VxWorks 6.3 编程调试要点(仅供内部使用)文档作者:周礼兵日期:2007-03-05开发/测试经理:_______________ 日期:___/___/___项目经理:_______________ 日期:___/___/___版权所有不得复制目录目录 (2)1系统特点 (3)2编程调试 (3)2 .1应用程序的运行 (3)2 .1.1Shell 下运行 (3)2 .1.2自启动运行 (4)2 .1.3通过workbench运行 (4)2 .2内核模块的运行 (4)2 .3ROMFS (4)2 .4应用程序的系统调用 (5)2 .4.1系统调用的一些约束 (5)2 .4.2静态的增加系统调用函数 (5)2 .4.3动态的增加系统调用函数 (6)2 .5共享数据区域 (7)2 .6动态库 (7)2 .6.1共享库(Shared Libraries) (7)2 .6.2Plug-ins (7)2 .7多任务 (8)2 .7.1任务变量(Task Variables) (8)2 .7.2VxWorks task (8)2 .7.3POSIX Threads (8)2 .7.4任务调度 (8)2 .8信号量 (8)2 .8.1VxWorks semaphores (8)2 .8.2POSIX Semaphores (8)2 .9消息队列 (8)2 .9.1VxWorks Message Queues (8)2 .9.2POSIX Message Queues (8)2 .10Sockets (8)2 .11Pipes (9)2 .12VxWorks events (9)2 .13POSIX Queued Signals (9)2 .14内存管理 (9)2 .15Shell 解析器 (9)3设计要点 (10)参考文档 (11)VxWorks 6.3 编程调试要点关键词: 内核态、用户态、消息、信号、信号量、管道、任务、线程缩略语说明:RTP(real-time process)、POSIX(Portable Operating System UNIX)、MMU(Memory Management Unit)1 系统特点VxWorks 6.3除了兼容以前低版本(如:VxWorks 5.5)内核外,增加一些其它的功能。

其中最明显的是引入了用户态的应用程序及POSIX的一些特性功能(如线程、线程调度、互斥锁、信号量、消息等),这样就有内核态和用户态之分。

内核模块是运行在内核态的,应用程序是运行在用户态的。

这里所指的应用程序就是VxWorks RTPs(real-time processes),与Unix、Linux的应用程序有相似性,它在用户态下运行,当被加载到内存运行时,每个RTP都会被分配不同的虚拟的地址空间,包括代码段、数据段、及堆栈等。

当启用MMU时,各应用程序之间及与内核之间是不能随意互相访问的(注:如果是simulate 内核的调试的话,MMU组件是不支持区分超级用户和普通用户的,应用程序可以访问内核的内存空间,这样子的话,内核的任务有可能被应用程序的任务破坏),如果需要进行数据传递,则可通过消息、管道、信号、共享内存、SOCKET等。

应用程序还可通过系统调用来提升操作权限,如操作内核或配置硬件资源等。

应用程序间可以动态的调用共享库的函数来执行,但要注意共享库的函数可重入性。

引用POSIX的一些特性功能主要为了方面从POSIX中移植程序及增强系统功能。

2 编程调试本文的大部分调试过程是通过wind river workbench2.5开发环境进行的,该环境与以前的Tornado5.5虽然有一定的差别,但基本原理是相似的。

具体应用可以参考文档《wr_workbench_vxworks_users_guide_2.5.pdf》。

2 .1应用程序的运行2 .1.1Shell 下运行使用C解析器:如:rtpSp "host:c:/myInstallDir/vxworks-6.1/target/usr/root/PPC32diab/bin/myVxApp.vxefirst second third"对应的可以用kill( ) 或者rtpDelete( )来终止运行。

提示符:->一般为C解析器可用shConfig "INTERPRETER=Cmd" 来切换到command解析器下使用shell command解析器:如:rtp exec host:c:/myInstallDir/vxworks-6.1/target/usr/root/PPC32diab/bin/myVxApp.vxefirst second third对应的可以用rtp delete、kill、rtpd shell命令来终止运行,如果运行在前台的话,还可用CTRL+C来终止运行。

(后台运行可在rtp exec命令后或应用程序名后加&)。

如:rtp exec host:c:/myInstallDir/vxworks-6.1/target/usr/root/PPC32diab/bin/myVxApp.vxefirst second third &提示符:[vxWorks]# 一般为C解析器可用set config INTERPRETER=C 来切换到C解析器下2 .1.2自启动运行通过脚本运行,需在RTP Startup Facility定义如:在NAME为RTP_APPL_CMD_SCRIPT_FILE的Value栏里加入"/romfs/VxScript"(目的是为了执行romfs里的脚本VxScript)VxScript脚本内容示意:rtpSp "/romfs/RtpTest1.vxe"rtpSp "/romfs/RtpTest2.vxe"通过字符串解析运行,需在RTP Startup Facility定义如:在NAME为RTP_APPL_INIT_STRING的Value栏里加入"#/romfs/RtpTest1.vxe#/romfs/RtpTest2.vxe" (目的是为了执行romfs里的应用程序RtpTest1.vxe及RTPTest2.vxe #号为多个应用程序的分隔符)2 .1.3通过workbench运行可以通过workbench连接到目标板上,然后选中已编译好的vxe文件点击右键选择Run RTP on Target就s可以运行了。

2 .2内核模块的运行与VxWorks5.5类似。

2 .3ROMFSVxWorks的一种只读文件系统,一般是用作把应用程序、脚本文件、共享库等打包在ROMFS里并连同内核一起编译成VxWorks Image文件。

当内核运行时,通过devs命令看到设备描述符/romfs。

可以通过read或fread来读取内容。

创建ROMFS可以通过workbench来创建,把ROMFS工程当作是内核Image工程的子工程。

也可通过命令行手动配置,如:1)cd c:\myInstallDir\vxworks-6.1\target\proj\wrSbc8260_diab2)mkdir romfs3)copy c:\allMyVxApps\myVxApp.vxe romfs4)make TOOL=diab如果不想在内核工程目录下创建romfs目录,可以在其它地方创建,但在make内核时,必须指明romfs的目录,如:make TOOL=diab ROMFS_DIR="c:\allMyVxApps"2 .4应用程序的系统调用VxWorks6.3 的内核态和用户态有不同的指令集及MMU设置,应用程序是运行在用户态的。

只要MMU打开的时候,它是不能直接调用系统函数或数据结构。

为了解决这种情况,系统调用可以为应用程序提供一种优先级比较高的操作,如操作内核或配置硬件资源等。

所有可用的系统调用函数(包括自定义的系统调用函数)都可以通过syscall.h来查询。

2 .4.1系统调用的一些约束1)可自定义的组号为2到7,每一系统调用组最多可有64个函数2)函数参数最多只支持8个32位的参数(32位体系结构的CPU),如果是64位的参数则需要按两个32参数来计算,不支持浮点或中断向量类型的参数,如果多于8个参数则需通过结构来定义参数。

3)函数返回值为32位(32位体系结构的CPU),如果是64位的话则需通过get64BitValue来获取。

4)系统调用处理函数的命名必须和系统调用函数命名一致,然后追加Sc,例如系统调用函数名为user0SysCallFunc0,则系统调用处理函数必须命名为user0SysCallFunc0Sc5)系统调用处理函数的参数只能为一个指向某种结构类型的指针,必须把系统函数的所有参数定义成结构,且结构命名为系统调用处理函数名+Args,如:struct user0SysCallFunc0Sc{int a;int b;char *c;……}6)建议在系统调用处理函数中使用scMemValidate函数来验证应用程序传递过来参数的可访问性,如指针所指向的内容是否可访问。

2 .4.2静态的增加系统调用函数1)增加系统调用组在文件syscallUsrNum.def(在目录VxWorks6.3\share\h里,如果没有则需要在此目录新建一个)里增加,内容示意如下:SYSCA LL_GROUP SCG_USER0 2 INCLUDE_USER_SYSCA LL0 user0SysCallFunc01 user0SysCallFunc12 user0SysCallFunc2解释:第一行SYSCALL_GROUP指明是系统调用,SCG_USER0为组名(标红色的地方可以自己命名),2 为组号(只有2-7可用),INCLUDE_USER_SYSCALL为组件定义,如果没有定义则该组的所有函数都不会被包含。

第二到第四行为函数号及函数名称定义2)增加系统调用函数定义user0SysCallFunc0 3 [ int a; int b; char *c; ]user0SysCallFunc1 3 [ int a; int b; char *c; ]user0SysCallFunc2 3 [ int a; int b; char *c; ]解释:user0SysCallFunc0为函数名,3为参数个数,[ int a; int b; char *c; ] 为参数形式3)增加系统调用处理函数int user0SysCallFunc0Sc(struct user0SysCallFunc0ScArgs *pArgs){……return OK;}int user0SysCallFunc1Sc(struct user0SysCallFunc1ScArgs *pArgs){……return OK;}int user0SysCallFunc2Sc(struct user0SysCallFunc2ScArgs *pArgs){……return OK;}4)重编译内核代码和用户态代码到目录:installDir/vxworks-6.x/target/src 及installDir/vxworks-6.x/target/usr/src执行:make CPU=cpuType TOOL=toolType5)在应用程序运行,示意如下syscall (12345678, 78654321, (int)&c, 0, 0, 0, 0, 0,SCN_user0SysCallFunc0);SCN_user0SysCallFunc0 为当重新编译时自动产生的宏定义,方便调用2 .4.3动态的增加系统调用函数1)编写系统调用函数的符号表如:_WRS_DATA_ALIGN_BYTES(16) SYSCA LL_RTN_TBL_ENTRY testScRtnTbl [] ={{(FUNCPTR) testFunc0, 1, "testFunc0", 0}, /* routine 0 */{(FUNCPTR) testFunc1, 1, "testFunc1", 1}, /* routine 1 */{(FUNCPTR) testFunc2, 1, "testFunc2", 2}, /* routine 2 */{(FUNCPTR) testFunc3, 1, "testFunc2", 3} /* routine 3 */};_WRS_DATA_ALIGN_BYTES(16)告诉编译器以16字节对齐,目的是为了改善性能2)编写系统调用函数如:int testFunc0(int a,int b,……){…….}……3)注册系统调用函数如:syscallGroupRegister (2, "testGroup", 4, testScRtnTbl, 0);第一个参数为组号,第二个参数为组名,第三个参数为函数个数,第四个参数为系统调用符号表(如果是在shell下调用的话需加&号,如& testScRtnTbl),第五个参数为是否要覆盖已存在的注册项。

相关文档
最新文档