![]() |
![]() |
![]() |
![]() ![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
ISPRO下载型编程器 |
ByteBlaster II Cable |
ISPRO下载型编程器 支持S51/AVR/PIC |
超级51开发板套件 前卫实用超值 |
||||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
51单片机升级STM32 火爆销售中 |
MPLAB-ICD2 火爆销售中 |
LED51开发板 玩具又名图文显示棒 |
面板模块/开发板 |
![]() |
![]() |
![]() |
![]() |
SMS短信模块 工业级/全自动 |
您当前位置:电子技术资料 -> 嵌入式系统 -> VxWorks -> |
![]() ![]() |
VxWorks使用说明书(2)
类别:技术文章 来源:未知 作者:未知 关键字:VxWorks 加入日期:2002-10-10 VxWorks使用说明书(2) 使用步骤 使用Tornado集成环境一般需要经过以下步骤: 运行TCP/IP端口管理器Portmapper(portmap.exe) 运行注册器Tornado Registry(wtxregd.exe)。如果使用的是试用版,注意是否注册成功,是否修改了日期 运行并配置Ftp Server(wtfpd32.exe)。点击菜单命令Security | Users | rights弹出配置窗口,点击New User,在New User弹出窗口加入需要加入的用户名(注意:要与目标机bootrom或启动软盘设置一致),在改变密码弹出窗口设置该用户的密码(注意:要与目标机bootrom或启动软盘设置一致),在Home Directory中设置相应的目录,MCP750为c:\tornado\target\config\mcp750,MCPN750为c:\tornado\target \config\mcpn750,X86为c:\tornado\target\config\pc486 ,配置结束。 目标板上电或复位 在控制台(MCP750/MCPN750为超级终端,X86为目标机显示器)上可以看到启动信息。如果需要修改,在等待用户配置时,按c键,进行相应修改。(注意:配置信息要与主机配置、Ftp服务器配置一致),修改结束后,按@键重新启动目标机。 运行Tornado(tornado.exe) 执行菜单命令Tools | Target Server | Configure,弹出目标服务器设置对话框,点击New产生一个新的配置。设置Description域(可以任意设置);设置Target Server域(可以任意设置);在Change Property域选取Back End项(该项设置主机与目标机如何连接,缺省为网口连接,如果使用串口连接,需要修改configall.h文件,重新编译链接VxWorks映象),如果使用网口调试,选择wdbrpc,在目标IP名或地址域中给出目标机的IP名或地址(建议给出IP名,因为这样会快得多),如果给出的是IP名,需要在HOSTS文件中给出IP名与IP地址的对应关系,如果用串口调试,选择wdbserial,选择相应的串口和波特率(注意:此处的串口是指主机的串口不是目标机的串口);在Change Property域选取Core File and Symbols项,选中File项输入相应的文件(MCP750c:\tornado\target\config\mcp750\vxWorks,MCPN750为c:\tornado\target \config\mcpn750\vxWorks,在X86平台上为c:\tornado\target\config\pc486\vxWorks),点击Launch,运行目标服务器。 执行菜单命令File | New 创建一个新的文件,并打开编辑器Editor(该编辑器功能不是很强大,可以使用其它编辑器如Source Insight)。 单独编译生成的源文件,生成目标文件(.o),编译连接过程的详细介绍请见后面。 选取相应的目标服务器。 执行菜单命令Tools | Debugger运行调试器。 执行菜单命令Debug | Download下载要调试的目标文件(.o) 在Editor窗口设置断点。 执行菜单命令Debug | Run弹出对话框,要求输入调试入口函数,输入要调试的函数。 进行源码级调试 执行菜单命令Tools | Shell运行Shell。可以在Shell窗口查看/修改全局变量、内存,查看任务列表、各模块使用内存的情况、对象(如任务、队列、信号量、定时器、内存分区)等信息。 执行菜单命令Tools | Browser运行Browser。在Browser中可以查看任务列表、各模块使用内存的情况、对象(如任务、队列、信号量、定时器、内存分区)等信息。 6、编译链接 VxWorks的开发调试环境可以把VxWorks内核和应用分开,分别加载。 VxWorks内核在目标机启动过程中通过ftp协议加载到目标机中运行,应用模块在调试中动态下载,目标代理把下载的应用模块动态链接到系统中,应用模块的调试是通过在用户执行运行命令时提供入口函数实现的。这样做的好处是需要调试哪个模块就下载那个模块调试,不需下载其它模块,前期调试一般使用这种编译方式。 VxWorks的开发调试环境也提供把应用模块与系统内核链接在一起,通过ftp协议加载执行。这需要经过两个步骤:把应用模块的入口代码加到usrConfig.c文件中的usrRoot函数的尾部;把应用模块编译链接到VxWorks内核中,这种编译链接方式一般用于后期调试。 下面分类对编译链接进行介绍 6.1 单个应用模块的编译 单个应用模块的编译可以通过使用菜单命令Project | Make Current Source File进行编译,要编译的源文件必须已经用Editor打开并且为当前窗口。如果要编译的源文件所在目录没有makefile文件,系统会提示创建一个新的makefile文件,确定。在弹出的创建缺省makefile窗口的CPU域选择相应的项(MCP750/MCPN750选择PPC604,X86选择I80486),在ADDED_FLAGS域输入-g,确定。系统对源文件进行编译,生成目标文件(.o)。生成的目标文件在Debugger环境中动态加载,与内核动态链接到一起。 6.2 系统内核vxWorks的编译链接 系统内核vxWorks是调试中使用最多的内核映象。它被通过Ftp协议从主机加载到目标机中。它的作用通常是进行软硬件初始化,等待加载应用模块,进行程序调试。 在Project菜单下,选择相应硬件平台的生成vxWorks的命令,进行编译链接。在编译链接之前先使用clean命令删除以前生成的文件。 6.3 应用模块与系统内核一起编译链接 VxWorks的开发调试环境也提供把应用模块与系统内核链接在一起,通过Ftp协议加载,vxWorks内核自动执行应用模块。这需要经过两个步骤:把应用模块的入口代码加到usrConfig.c文件中的usrRoot函数的尾部;在makefile中把待生成的应用模块的目标文件名加到宏定义MACH_EXTRA中,再把相应的编译规则加到makefile中。编译链接生成vxWorks映象。 6.4 Project菜单下其它编译链接命令介绍 * vxWorks_rom :可以写到ROM的、没有带符号表和Shell的、没有压缩的vxWorks。 * vxWorks.st :带有符号表的vxWorks。 * vxWorks.st_rom:可以写到ROM的、带有符号表和Shell的、压缩的vxWorks。 * vxWorks.res_rom :可以写到ROM的、带有符号表和Shell的、只有数据段拷贝到内存的、没有压缩的vxWorks。 * vxWorks.res_rom_nosym:可以写到ROM的、只有数据段拷贝到内存的、没有压缩的vxWorks。 * bootrom:压缩的 bootrom * bootrom_uncmp:没有压缩的bootrom ※ 作 者: helpyou 01-2-8 下午 08:29:03 ※ 7、调试时的常用方法 下面是一些调试手段在调试器中的相应命令(操作) 调试手段 相应操作 设置断点 菜单命令Debug|Toggle BreakPoint 删除断点 菜单命令Debug|Toggle BreakPoint 运行 菜单命令Debug|Run 单步执行(进入函数) 菜单命令Debug|Step 单步执行(不进入函数) 菜单命令Debug|Next 继续执行(停下后的程序) 菜单命令Debug|Continue 执行完当前的函数,停在调用它的函数的下一条语句 菜单命令Debug|Finish 查看变量的值 菜单命令Debug|Inspect 查看当前函数的所有局部变量 菜单命令Debug|Locals 查看内存 菜单命令Debug|Memory 查看寄存器 菜单命令Debug|Registers 修改内存 Shell命令m 修改寄存器 Shell命令mRegs 修改变量 在Shell中直接给该变量赋值(局部变量无法用此方法修改) 卸载一个加载的模块 Shell命令unld 删除任务 Shell命令td 复位目标机 Shell命令reboot 用该命令的好处:目标服务器自动与目标代理重新链接,Shell自动重启 查看任务 在Browser对象信息窗口输入待查看的任务名或ID 查看信号量 在Browser对象信息窗口输入待查看的信号量名或ID 查看消息队列 在Browser对象信息窗口输入待查看的消息队列命或ID 内存分区 在Browser对象信息窗口输入待查看的内存分区ID 看门狗 在Browser对象信息窗口输入待查看的看门狗ID 类(class) 在Browser对象信息窗口输入待查看的类的ID 查看内存使用(模块使用内存的情况) Browser的内存使用窗口 查看任务列表(系统里的所有任务) Browser的任务列表窗口 查看CPU占用率 Browser的Spy窗口 查看堆栈使用情况 Browser的堆栈检查窗口 注: * Shell可以通过菜单命令Debug | Shell启动 * Shell的原语可以通过在Shell中输入help列出 * Browser可以通过菜单命令Debug | Browser启动 * Debugger命令窗口的命令可以通过在命令窗口输入help列出 8、任务调试模式下的多任务调试 在任务调试模式下,在一个集成环境中,在一个任务中调试,在另一个任务中设置断点,设置的断点不起作用。这是因为一个调试器只能处理一个TCB(任务控制块),每个任务都有一个TCB,因此一个调试器只能调试一个任务,要调试几个任务就要启动几个调试器。一个集成环境只能启动一个调试器,所以要调试几个任务就要启动几个集成环境。另外,需要在被调试的任务的待调试的第一条语句前加入taskSuspend(0)语句,挂起该任务,否则任务就可能会在调试前被执行。 下面是多任务调试的测试用例的源代码 /* VxWorks includes */ #include "vxWorks.h" #include "taskLib.h" #include "stdio.h" #include "msgQLib.h" int g_lTaskATid; int g_lTaskBTid; MSG_Q_ID g_MsgQ1id; MSG_Q_ID g_MsgQ2id; void MultiTaskTestTaskA(void) { char cMsgToTaskB[100]; char cMsgFromTaskB[100]; sprintf(cMsgToTaskB,"To TaskB \n"); printf(" Hello from MultiTaskTestTaskA \n"); /*start point of debugging for MultiTaskTestTaskA*/ taskSuspend(0); for(;;) { printf(" Hello from MultiTaskTestTaskA \n"); /*Send message to MultiTaskTestTaskB*/ msgQSend(g_MsgQ1id,cMsgToTaskB,sizeof(cMsgToTaskB),WAIT_FOREVER, MSG_PRI_NORMAL); /*Receive message from MultiTaskTestTaskB*/ msgQReceive(g_MsgQ2id,cMsgFromTaskB,100,WAIT_FOREVER); printf("%s",cMsgFromTaskB); } } void MultiTaskTestTaskB(void) { char cMsgToTaskA[100]; char cMsgFromTaskA[100]; sprintf(cMsgToTaskA,"To TaskA \n"); printf(" Hello from MultiTaskTestTaskB \n"); /*start point of debugging for MultiTaskTestTaskA*/ taskSuspend(0); for(;;) { printf(" Hello from MultiTaskTestTaskB \n"); /*Send message to MultiTaskTestTaskA*/ msgQSend(g_MsgQ2id,cMsgToTaskA,sizeof(cMsgToTaskA),WAIT_FOREVER, MSG_PRI_NORMAL); /*Receive message from MultiTaskTestTaskA*/ msgQReceive(g_MsgQ1id,cMsgFromTaskA,100,WAIT_FOREVER); printf("%s",cMsgFromTaskA); } } /*This function spawns MultiTaskTestTaskA and MultiTaskTestTaskB , creates g_MsgQ1id and g_MsgQ2id , is entry for debugging.*/ void MultiTaskTestInit(void) { printf(" Hello from MultiTaskTestInit \n"); g_MsgQ1id=msgQCreate(20,100,MSG_Q_FIFO); if(g_MsgQ1id==NULL) { printf(" ERROR: create g_MsgQ1 error \n"); } g_MsgQ2id=msgQCreate(20,100,MSG_Q_FIFO); if(g_MsgQ1id==NULL) { printf(" ERROR: create g_MsgQ2 error \n"); } printf(" Spawning a new task called MultiTaskTestTaskA \n\n"); g_lTaskATid = taskSpawn("MultiTaskTestTaskA", 100,0,10000, (FUNCPTR)MultiTaskTestTaskA, 0,0,0,0,0,0,0,0,0,0); if(g_lTaskATid == ERROR) { printf(" ERROR: task did not spawn \n"); exit(1); } printf(" Spawning a new task called MultiTaskTestTaskB \n"); g_lTaskBTid = taskSpawn("MultiTaskTestTaskB", 100,0,10000, (FUNCPTR)MultiTaskTestTaskB, 0,0,0,0,0,0,0,0,0,0); if(g_lTaskBTid == ERROR) { printf(" ERROR: task did not spawn \n"); exit(1); } exit(0); } 多任务调试步骤: * 用-g选项编译源代码产生目标文件 * 下载产生的目标文件 * 在MultiTaskTestInit函数的开始设置断点 * 把MultiTaskTestInit设置为调试任务的人口函数 * 单步执行产生MultiTaskTestTaskA任务的语句后可以在串口(超级终端)上看到字符串Hello from MultiTaskTestTaskA,用Browser查看任务,可以看到任务MultiTaskTestTaskA出于挂起态(suspended),表明程序执行了taskSuspend(0)语句。 * 运行另一个Tornado集成环境 * Attach任务MultiTaskTestTaskA, * 在语句msgQReceive(g_MsgQ2id,cMsgFromTaskB,100,WAIT_FOREVER)的下一条语句处设置断点 * 运行任务MultiTaskTestTaskA。可以看到没有执行到断点处,用Browser查看任务状态,MultiTaskTestTaskA出于阻塞态(pended),因为它在等待消息。 * 单步执行MultiTaskTestInit到产生MultiTaskTestTaskB任务的下一条语句,可以看到MultiTaskTestTaskB任务处于挂起态 * 再运行另一个Tornado集成环境 * Attach任务MultiTaskTestTaskB, * 在语句msgQReceive(g_MsgQ1id,cMsgFromTaskA,100,WAIT_FOREVER)下一条语句处设置断点 * 运行任务MultiTaskTestTaskB。可以看到执行到断点处停下。这是因为MultiTaskTestTaskA任务已经发送一条消息到MultiTaskTestTaskB的接收队列中。 * 此时,可以看到MultiTaskTestTaskA任务也运行到断点处,因为为MultiTaskTestTaskB任务已经发送一条消息到MultiTaskTestTaskA的接收队列中。 酸菜 (1899-12-30) 9、系统调试模式下程序的调试 Tornado集成环境提供两种调试模式:任务调试模式和系统调试模式。在任务调试模式下,在一个集成环境下一个时间内只能调试一个任务。调试只影响当前被调试的任务,其它任务正常运行。在系统调试模式下,可以同时调试多个任务、中断服务程序(ISR),调试影响整个系统。 Tornado1.0集成环境下,在系统模式下进行程序调试,主机与目标机之间必须使用串口通信。Tornado2.0集成环境提供了通过网口进行系统模式调试的功能。 系统缺省使用网口通信,如果需要使用串口通信,需要修改文件C: \ Tornado \ target \ config } all \ configAll.h的一些宏定义,修改为: #define WDB_COMM_TYPE WDB_COMM_SERIAL /*使用串口通信*/ #define WDB_TTY_CHANNEL 0 /*使用第一个串口*/ #define WDB_TTY_BAUD 38400 /*波特率:38400bps*/ 重新编译链接vxWorks。 在启动目标服务器时,要选择串口通信,并进行相应配置。 9.1 系统调试模式下多任务的调试: 调试使用的源代码与任务调试模式中使用的代码相同。但是,需要去掉为了能够在任务调试模式下进行多任务调试的MultiTaskTestTaskA和MultiTaskTestTaskB中的语句taskSuspend(0);。 多任务调试步骤: * 用-g选项编译源代码产生目标文件。 * 下载产生的目标文件。 * 在MultiTaskTestInit函数的开始设置断点。 * 在Debugger命令窗口输入命令attach system进入系统调试模式。 * 在Shell窗口输入命令sp MultiTaskTestInit产生一个以MultiTaskTestInit为入口函数的任务,因为整个系统都停下了,新产生的任务还没有执行,这可以通过在Debugger命令窗口输入命令info threads显示当前系统中的任务列表看出来。 * 执行菜单命令Debug | Continue继续运行程序。 * 系统在设置的断点处停下。 * 在函数MultiTaskTestTaskA中的语句msgQReceive(g_MsgQ2id,cMsgFromTaskB, 100,WAIT_FOREVER)的下一条语句处设置断点。 * 在函数MultiTaskTestTaskB中的语句msgQReceive(g_MsgQ1id,cMsgFromTaskA, 100,WAIT_FOREVER)的下一条语句处设置断点。 * 执行菜单命令Debug | Continue继续运行程序。 * 程序在任务MultiTaskTestTaskB中的断点处停下(为什么不是在任务MultiTaskTestTaskA中停下?请考虑)。 * 执行菜单命令Debug | Continue继续运行程序。 * 程序在任务MultiTaskTestTaskA中的断点处停下。 * 执行菜单命令Debug | Continue继续运行程序。 * 程序又一次在任务MultiTaskTestTaskA中的断点处停下(为什么停两次?请考虑)。 * 执行菜单命令Debug | Continue继续运行程序。 * 程序在任务MultiTaskTestTaskB中的断点处停下。 9.2 中断服务程序的调试 中断服务程序只能在系统调试模式下调试,不能在任务调试模式下调试。因为中断服务程序是作为系统的一部分运行,不是以任务方式运行,因此不需要为它产生任务。 中断服务程序调试步骤: * 用-g选项编译源代码产生目标文件。 * 下载产生的目标文件。 * 在MultiTaskTestInit函数的开始设置断点。 * 在Debugger命令窗口输入命令attach system进入系统调试模式。 * 执行菜单命令Debug | Continue继续运行程序。 * 如果产生相应的中断,程序就会在中断服务程序的断点处停下。进行需要的调试。 ------------------------全文完------------------------------ 您可能还会关注的相关技术资料: |
中国电子网 |
www.EC66.com |
QQ:34740080 EMAIL:iloveaoe@163.com |
最佳浏览:1024*768 |
Copyright (C) 2001-2010 EC66.COM All Rights Reserved |
Aoe/帝国 制作维护 |
粤ICP备18061901号 |
![]() |