?? vxworks使用說明書.txt
字號:
卸載一個加載的模塊
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的
接收隊列中。
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繼續運行程序。
* 如果產生相應的中斷,程序就會在中斷服務程序的斷點處停下。進行需要的調試。
------------------------全文完------------------------------
應用示例分析(demo例子程序windDemo.c)
通過對一具體實例的分析,對任務的創建、任務間通信、內存分配、消息管理等VxWorks系統應用更進一步的了解。
/* windDemo - repeatedly test various kernel function */
/*
modification history
--------------------
02c,23aug93,jcf fixed synchronization.
02b,01aug93,dvs fixed loop count printing.
02a,18mar93,dvs took out timer/benchmark information.
ansified code.
general cleanup of code to use as MicroWorks demo.
01a,12nov90,shl written.
*/
/*
DESCRIPTION
This program repeatedly exercises different kernel facilities of
the Wind kernel.
The functions involved include the use of semaphores as sychronization
and mutual exclusion primitives, the use of taskSuspend()/taskResume() for task control, the use of message queues for
communication and the
use of watchdogs for task timeouts.
To exercise these kernel facilities two tasks are used, a high priority task and a low priority task. The high priority
task executes functions with which the resources are not available. As the high priority task blocks, the low priority
task takes over and makes available the resources that the high priority task is waiting for. This may sound simple at
first but the underlying execution of this test program involves context switching, rescheduling of tasks, and shuffling
of the ready queue, pend queue, and the timer queue.
These functions are chosen because they are the most commonly used
functions in sychronization, mutual exclusion, task control, inter-task communication and timer facilities. These are
the basic building blocks of the operating system itself and also used in applications. Repeatedly execution of this
"death loop" is a good indication of how the system will perform in real-life as these functions are utiltized heavily
in every application.
The following is the thread of execution of this test program.
Higher Priority Lower Priority
Task1 Task2
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -