📄 使用vxworks的一些总结.txt
字号:
x vxWorks_rom :可以写到ROM的、没有带符号表和Shell的、没有压缩的vxWorks。
x vxWorks.st :带有符号表的vxWorks。x vxWorks.st_rom:可以写到ROM的、带有符号表和Shell的、压缩的vxWorks。
x vxWorks.res_rom :可以写到ROM的、带有符号表和Shell的、只有数据段拷贝到内存的、没有压缩的vxWorks。
x vxWorks.res_rom_nosym:可以写到ROM的、只有数据段拷贝到内存的、没有压缩的vxWorks。x bootrom:压缩的 bootrom
x bootrom_uncmp:没有压缩的bootrom7、调试时的常用方法下面是一些调试手段在调试器中的相应命令(操作)调试手段 相应操作设置断点 菜单命令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的堆栈检查窗口注:
x Shell可以通过菜单命令Debug | Shell启动
x Shell的原语可以通过在Shell中输入help列出x Browser可以通过菜单命令Debug | Browser启动x 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\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);}多任务调试步骤:
x 用-g选项编译源代码产生目标文件x 下载产生的目标文件
x 在MultiTaskTestInit函数的开始设置断点
x 把MultiTaskTestInit设置为调试任务的人口函数
x 单步执行产生MultiTaskTestTaskA任务的语句后可以在串口(超级终端)上看到字符串Hello from MultiTaskTestTaskA,用Browser查看任务,可以看到任务MultiTaskTestTaskA出于挂起态(suspended),表明程序执行了taskSuspend(0)语句。
x 运行另一个Tornado集成环境
x Attach任务MultiTaskTestTaskA,
x 在语句msgQReceive(g_MsgQ2id,cMsgFromTaskB,100,WAIT_FOREVER)的下一条语句处设置断点
x 运行任务MultiTaskTestTaskA。可以看到没有执行到断点处,用Browser查看任务状态,MultiTaskTestTaskA出于阻塞态(pended),因为它在等待消息。
x 单步执行MultiTaskTestInit到产生MultiTaskTestTaskB任务的下一条语句,可以看到MultiTaskTestTaskB任务处于挂起态x 再运行另一个Tornado集成环境
x Attach任务MultiTaskTestTaskB,
x 在语句msgQReceive(g_MsgQ1id,cMsgFromTaskA,100,WAIT_FOREVER)下一条语句处设置断点
x 运行任务MultiTaskTestTaskB。可以看到执行到断点处停下。这是因为MultiTaskTestTaskA任务已经发送一条消息到MultiTaskTestTaskB的接收队列中。
x 此时,可以看到MultiTaskTestTaskA任务也运行到断点处,因为为MultiTaskTestTaskB任务已经发送一条消息到MultiTaskTestTaskA的接收队列中。
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);。多任务调试步骤:
x 用-g选项编译源代码产生目标文件。
x 下载产生的目标文件。
x 在MultiTaskTestInit函数的开始设置断点。
x 在Debugger命令窗口输入命令attachs/20060907_164540_564.rar system进入系统调试模式。
x 在Shell窗口输入命令sp MultiTaskTestInit产生一个以MultiTaskTestInit为入口函数的任务,因为整个系统都停下了,新产生的任务还没有执行,这可以通过在Debugger命令窗口输入命令info threads显示当前系统中的任务列表看出来。
x 执行菜单命令Debug | Continue继续运行程序。
x 系统在设置的断点处停下。
x 在函数MultiTaskTestTaskA中的语句msgQReceive(g_MsgQ2id,cMsgFromTaskB, 100,WAIT_FOREVER)的下一条语句处设置断点。
x 在函数MultiTaskTestTaskB中的语句msgQReceive(g_MsgQ1id,cMsgFromTaskA, 100,WAIT_FOREVER)的下一条语句处设置断点。
x 执行菜单命令Debug | Continue继续运行程序。
x 程序在任务MultiTaskTestTaskB中的断点处停下(为什么不是在任务MultiTaskTestTaskA中停下?请考虑)。
x 执行菜单命令Debug | Continue继续运行程序。
x 程序在任务MultiTaskTestTaskA中的断点处停下。
x 执行菜单命令Debug | Continue继续运行程序。
x 程序又一次在任务MultiTaskTestTaskA中的断点处停下(为什么停两次?请考虑)。
x 执行菜单命令Debug | Continue继续运行程序。
x 程序在任务MultiTaskTestTaskB中的断点处停下。
9.2 中断服务程序的调试中断服务程序只能在系统调试模式下调试,不能在任务调试模式下调试。因为中断服务程序是作为系统的一部分运行,不是以任务方式运行,因此不需要为它产生任务。
中断服务程序调试步骤:
x 用-g选项编译源代码产生目标文件。
x 下载产生的目标文件。
x 在MultiTaskTestInit函数的开始设置断点。
x 在Debugger命令窗口输入命令attachs/20060907_164540_564.rar system进入系统调试模式。
x 执行菜单命令Debug | Continue继续运行程序。
x 如果产生相应的中断,程序就会在中断服务程序的断点处停下。进行需要的调试。
10、目前存在的问题目前,在Tornado1.0集成环境中,在PPC平台上,在系统调试模式下,无法进行多任务调试。即:无法在产生的任务中设置断点进行跟踪调试。但是,可以调试中断服务程序。在X86平台上,在系统调试模式下,可以进行多任务和中断服务程序调试。估计可能是PPC平台上的BSP有问题。据Wind River公司技术支持人员说,Tornado2.0集成环境可能会解决这个问题,因为新的BSP已经加到Tornado2.0集成环境中。在Tornado1.0集成环境中,设置断点,有时会不显示标志。但是,断点确实是设置了,据Wind River公司技术支持人员说,Tornado2.0集成环境已经解决了这个问题。
总的看来VxWorks的调试工具使用不是很方便(与pSOS操作系统的调试工具SingleStep等相比),但是它提供了一组调试工具CrossWind、WindSh、Browser,实现了完备的调试功能,这主要体现在以下几个方面:
x 源码级调试器不能实现全部调试功能,如:内存、寄存器、变量的修改,应用模块的卸载等。
x Shell可以实现全部的调试功能。
但是,它不是源码级调试器。
x 分为两种调试模式:任务调试模式和系统调试模式。在任务调试模式中,要调试多任务需要打开多个Tornado集成环境,并且不能调试中断服务程序。
x 软件复位需要重新加载系统内核和应用模块。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -