| 网站首页 | 新闻 | SOPC | FPGA | DSP | ARM | 嵌入式操作系统 | 下载 | 所有产品 | 留言 | 论坛 | 购买指南 | 网络协议 | 驱动设计 | 
您现在的位置: 21嵌入式控制研究室 >> 嵌入式操作系统 >> Vxworks >> 文章正文 用户登录 新用户注册
VxWorks使用说明书(4)     ★★★★★ 【字体:
VxWorks使用说明书(4)
作者:佚名    文章来源:21control    点击数:    更新时间:2005-12-22
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的接收队列中。

文章录入:fengfeiyi    责任编辑:fengfeiyi 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • 基于VxWorks实现自动发送彩信…

  • VxWorks实时操作系统下MPC82…

  • VxWorks及其在综合航空电子系…

  • 嵌入式移动数据库的特性

  • 嵌入式系统与普适计算

  • 利用VxWorks作Internet电话网…

  • Tornado开发工具

  • VxWorks组成部分

  • Vxworks下8139驱动加载step …

  • VxWorks/Tornado建立调试环境…

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)