| | 网站首页 | 新闻 | SOPC | FPGA | DSP | ARM | 嵌入式操作系统 | 下载 | 所有产品 | 留言 | 论坛 | 购买指南 | 网络协议 | 驱动设计 | | |
![]() |
![]() |
| 您现在的位置: 21嵌入式控制研究室 >> 嵌入式操作系统 >> Vxworks >> 文章正文 |
|
|||||
| VxWorks使用说明书(4) | |||||
| 作者:佚名 文章来源:21control 点击数: 更新时间:2005-12-22 | |||||
|
下面是一些调试手段在调试器中的相应命令(操作) 调试手段 相应操作 设置断点 菜单命令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 | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 | | |
![]() |
站长:康草科技 |