?? 使用vxworks的一些總結(jié).txt
字號(hào):
x vxWorks_rom :可以寫到ROM的、沒有帶符號(hào)表和Shell的、沒有壓縮的vxWorks。
x vxWorks.st :帶有符號(hào)表的vxWorks。x vxWorks.st_rom:可以寫到ROM的、帶有符號(hào)表和Shell的、壓縮的vxWorks。
x vxWorks.res_rom :可以寫到ROM的、帶有符號(hào)表和Shell的、只有數(shù)據(jù)段拷貝到內(nèi)存的、沒有壓縮的vxWorks。
x vxWorks.res_rom_nosym:可以寫到ROM的、只有數(shù)據(jù)段拷貝到內(nèi)存的、沒有壓縮的vxWorks。x bootrom:壓縮的 bootrom
x bootrom_uncmp:沒有壓縮的bootrom7、調(diào)試時(shí)的常用方法下面是一些調(diào)試手段在調(diào)試器中的相應(yīng)命令(操作)調(diào)試手段 相應(yīng)操作設(shè)置斷點(diǎn) 菜單命令Debug|Toggle BreakPoint刪除斷點(diǎn) 菜單命令Debug|Toggle BreakPoint運(yùn)行 菜單命令Debug|Run單步執(zhí)行(進(jìn)入函數(shù)) 菜單命令Debug|Step單步執(zhí)行(不進(jìn)入函數(shù)) 菜單命令Debug|Next繼續(xù)執(zhí)行(停下后的程序) 菜單命令Debug|Continue執(zhí)行完當(dāng)前的函數(shù),停在調(diào)用它的函數(shù)的下一條語句 菜單命令Debug|Finish查看變量的值 菜單命令Debug|Inspect查看當(dāng)前函數(shù)的所有局部變量 菜單命令Debug|Locals查看內(nèi)存 菜單命令Debug|Memory查看寄存器 菜單命令Debug|Registers修改內(nèi)存 Shell命令m修改寄存器 Shell命令mRegs修改變量 在Shell中直接給該變量賦值(局部變量無法用此方法修改)卸載一個(gè)加載的模塊 Shell命令unld刪除任務(wù) Shell命令td復(fù)位目標(biāo)機(jī) Shell命令reboot用該命令的好處:目標(biāo)服務(wù)器自動(dòng)與目標(biāo)代理重新鏈接,Shell自動(dòng)重啟查看任務(wù) 在Browser對(duì)象信息窗口輸入待查看的任務(wù)名或ID查看信號(hào)量 在Browser對(duì)象信息窗口輸入待查看的信號(hào)量名或ID查看消息隊(duì)列 在Browser對(duì)象信息窗口輸入待查看的消息隊(duì)列命或ID內(nèi)存分區(qū) 在Browser對(duì)象信息窗口輸入待查看的內(nèi)存分區(qū)ID看門狗 在Browser對(duì)象信息窗口輸入待查看的看門狗ID類(class) 在Browser對(duì)象信息窗口輸入待查看的類的ID查看內(nèi)存使用(模塊使用內(nèi)存的情況) Browser的內(nèi)存使用窗口查看任務(wù)列表(系統(tǒng)里的所有任務(wù)) Browser的任務(wù)列表窗口查看CPU占用率 Browser的Spy窗口查看堆棧使用情況 Browser的堆棧檢查窗口注:
x Shell可以通過菜單命令Debug | Shell啟動(dòng)
x Shell的原語可以通過在Shell中輸入help列出x Browser可以通過菜單命令Debug | Browser啟動(dòng)x Debugger命令窗口的命令可以通過在命令窗口輸入help列出8、任務(wù)調(diào)試模式下的多任務(wù)調(diào)試在任務(wù)調(diào)試模式下,在一個(gè)集成環(huán)境中,在一個(gè)任務(wù)中調(diào)試,在另一個(gè)任務(wù)中設(shè)置斷點(diǎn),設(shè)置的斷點(diǎn)不起作用。這是因?yàn)橐粋€(gè)調(diào)試器只能處理一個(gè)TCB(任務(wù)控制塊),每個(gè)任務(wù)都有一個(gè)TCB,因此一個(gè)調(diào)試器只能調(diào)試一個(gè)任務(wù),要調(diào)試幾個(gè)任務(wù)就要啟動(dòng)幾個(gè)調(diào)試器。一個(gè)集成環(huán)境只能啟動(dòng)一個(gè)調(diào)試器,所以要調(diào)試幾個(gè)任務(wù)就要啟動(dòng)幾個(gè)集成環(huán)境。另外,需要在被調(diào)試的任務(wù)的待調(diào)試的第一條語句前加入taskSuspend(0)語句,掛起該任務(wù),否則任務(wù)就可能會(huì)在調(diào)試前被執(zhí)行。下面是多任務(wù)調(diào)試的測(cè)試用例的源代碼/* 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);}多任務(wù)調(diào)試步驟:
x 用-g選項(xiàng)編譯源代碼產(chǎn)生目標(biāo)文件x 下載產(chǎn)生的目標(biāo)文件
x 在MultiTaskTestInit函數(shù)的開始設(shè)置斷點(diǎn)
x 把MultiTaskTestInit設(shè)置為調(diào)試任務(wù)的人口函數(shù)
x 單步執(zhí)行產(chǎn)生MultiTaskTestTaskA任務(wù)的語句后可以在串口(超級(jí)終端)上看到字符串Hello from MultiTaskTestTaskA,用Browser查看任務(wù),可以看到任務(wù)MultiTaskTestTaskA出于掛起態(tài)(suspended),表明程序執(zhí)行了taskSuspend(0)語句。
x 運(yùn)行另一個(gè)Tornado集成環(huán)境
x Attach任務(wù)MultiTaskTestTaskA,
x 在語句msgQReceive(g_MsgQ2id,cMsgFromTaskB,100,WAIT_FOREVER)的下一條語句處設(shè)置斷點(diǎn)
x 運(yùn)行任務(wù)MultiTaskTestTaskA。可以看到?jīng)]有執(zhí)行到斷點(diǎn)處,用Browser查看任務(wù)狀態(tài),MultiTaskTestTaskA出于阻塞態(tài)(pended),因?yàn)樗诘却ⅰ?x 單步執(zhí)行MultiTaskTestInit到產(chǎn)生MultiTaskTestTaskB任務(wù)的下一條語句,可以看到MultiTaskTestTaskB任務(wù)處于掛起態(tài)x 再運(yùn)行另一個(gè)Tornado集成環(huán)境
x Attach任務(wù)MultiTaskTestTaskB,
x 在語句msgQReceive(g_MsgQ1id,cMsgFromTaskA,100,WAIT_FOREVER)下一條語句處設(shè)置斷點(diǎn)
x 運(yùn)行任務(wù)MultiTaskTestTaskB。可以看到執(zhí)行到斷點(diǎn)處停下。這是因?yàn)镸ultiTaskTestTaskA任務(wù)已經(jīng)發(fā)送一條消息到MultiTaskTestTaskB的接收隊(duì)列中。
x 此時(shí),可以看到MultiTaskTestTaskA任務(wù)也運(yùn)行到斷點(diǎn)處,因?yàn)闉镸ultiTaskTestTaskB任務(wù)已經(jīng)發(fā)送一條消息到MultiTaskTestTaskA的接收隊(duì)列中。
9、系統(tǒng)調(diào)試模式下程序的調(diào)試Tornado集成環(huán)境提供兩種調(diào)試模式:任務(wù)調(diào)試模式和系統(tǒng)調(diào)試模式。在任務(wù)調(diào)試模式下,在一個(gè)集成環(huán)境下一個(gè)時(shí)間內(nèi)只能調(diào)試一個(gè)任務(wù)。調(diào)試只影響當(dāng)前被調(diào)試的任務(wù),其它任務(wù)正常運(yùn)行。在系統(tǒng)調(diào)試模式下,可以同時(shí)調(diào)試多個(gè)任務(wù)、中斷服務(wù)程序(ISR),調(diào)試影響整個(gè)系統(tǒng)。Tornado1.0集成環(huán)境下,在系統(tǒng)模式下進(jìn)行程序調(diào)試,主機(jī)與目標(biāo)機(jī)之間必須使用串口通信。Tornado2.0集成環(huán)境提供了通過網(wǎng)口進(jìn)行系統(tǒng)模式調(diào)試的功能。系統(tǒng)缺省使用網(wǎng)口通信,如果需要使用串口通信,需要修改文件C: \ Tornado \ target \ config \ all \ configAll.h的一些宏定義,修改為:#define WDB_COMM_TYPE WDB_COMM_SERIAL /*使用串口通信*/#define WDB_TTY_CHANNEL 0 /*使用第一個(gè)串口*/#define WDB_TTY_BAUD 38400 /*波特率:38400bps*/重新編譯鏈接vxWorks。在啟動(dòng)目標(biāo)服務(wù)器時(shí),要選擇串口通信,并進(jìn)行相應(yīng)配置。
9.1 系統(tǒng)調(diào)試模式下多任務(wù)的調(diào)試:
調(diào)試使用的源代碼與任務(wù)調(diào)試模式中使用的代碼相同。但是,需要去掉為了能夠在任務(wù)調(diào)試模式下進(jìn)行多任務(wù)調(diào)試的MultiTaskTestTaskA和MultiTaskTestTaskB中的語句taskSuspend(0);。多任務(wù)調(diào)試步驟:
x 用-g選項(xiàng)編譯源代碼產(chǎn)生目標(biāo)文件。
x 下載產(chǎn)生的目標(biāo)文件。
x 在MultiTaskTestInit函數(shù)的開始設(shè)置斷點(diǎn)。
x 在Debugger命令窗口輸入命令attachs/20060907_164540_564.rar system進(jìn)入系統(tǒng)調(diào)試模式。
x 在Shell窗口輸入命令sp MultiTaskTestInit產(chǎn)生一個(gè)以MultiTaskTestInit為入口函數(shù)的任務(wù),因?yàn)檎麄€(gè)系統(tǒng)都停下了,新產(chǎn)生的任務(wù)還沒有執(zhí)行,這可以通過在Debugger命令窗口輸入命令info threads顯示當(dāng)前系統(tǒng)中的任務(wù)列表看出來。
x 執(zhí)行菜單命令Debug | Continue繼續(xù)運(yùn)行程序。
x 系統(tǒng)在設(shè)置的斷點(diǎn)處停下。
x 在函數(shù)MultiTaskTestTaskA中的語句msgQReceive(g_MsgQ2id,cMsgFromTaskB, 100,WAIT_FOREVER)的下一條語句處設(shè)置斷點(diǎn)。
x 在函數(shù)MultiTaskTestTaskB中的語句msgQReceive(g_MsgQ1id,cMsgFromTaskA, 100,WAIT_FOREVER)的下一條語句處設(shè)置斷點(diǎn)。
x 執(zhí)行菜單命令Debug | Continue繼續(xù)運(yùn)行程序。
x 程序在任務(wù)MultiTaskTestTaskB中的斷點(diǎn)處停下(為什么不是在任務(wù)MultiTaskTestTaskA中停下?請(qǐng)考慮)。
x 執(zhí)行菜單命令Debug | Continue繼續(xù)運(yùn)行程序。
x 程序在任務(wù)MultiTaskTestTaskA中的斷點(diǎn)處停下。
x 執(zhí)行菜單命令Debug | Continue繼續(xù)運(yùn)行程序。
x 程序又一次在任務(wù)MultiTaskTestTaskA中的斷點(diǎn)處停下(為什么停兩次?請(qǐng)考慮)。
x 執(zhí)行菜單命令Debug | Continue繼續(xù)運(yùn)行程序。
x 程序在任務(wù)MultiTaskTestTaskB中的斷點(diǎn)處停下。
9.2 中斷服務(wù)程序的調(diào)試中斷服務(wù)程序只能在系統(tǒng)調(diào)試模式下調(diào)試,不能在任務(wù)調(diào)試模式下調(diào)試。因?yàn)橹袛喾?wù)程序是作為系統(tǒng)的一部分運(yùn)行,不是以任務(wù)方式運(yùn)行,因此不需要為它產(chǎn)生任務(wù)。
中斷服務(wù)程序調(diào)試步驟:
x 用-g選項(xiàng)編譯源代碼產(chǎn)生目標(biāo)文件。
x 下載產(chǎn)生的目標(biāo)文件。
x 在MultiTaskTestInit函數(shù)的開始設(shè)置斷點(diǎn)。
x 在Debugger命令窗口輸入命令attachs/20060907_164540_564.rar system進(jìn)入系統(tǒng)調(diào)試模式。
x 執(zhí)行菜單命令Debug | Continue繼續(xù)運(yùn)行程序。
x 如果產(chǎn)生相應(yīng)的中斷,程序就會(huì)在中斷服務(wù)程序的斷點(diǎn)處停下。進(jìn)行需要的調(diào)試。
10、目前存在的問題目前,在Tornado1.0集成環(huán)境中,在PPC平臺(tái)上,在系統(tǒng)調(diào)試模式下,無法進(jìn)行多任務(wù)調(diào)試。即:無法在產(chǎn)生的任務(wù)中設(shè)置斷點(diǎn)進(jìn)行跟蹤調(diào)試。但是,可以調(diào)試中斷服務(wù)程序。在X86平臺(tái)上,在系統(tǒng)調(diào)試模式下,可以進(jìn)行多任務(wù)和中斷服務(wù)程序調(diào)試。估計(jì)可能是PPC平臺(tái)上的BSP有問題。據(jù)Wind River公司技術(shù)支持人員說,Tornado2.0集成環(huán)境可能會(huì)解決這個(gè)問題,因?yàn)樾碌腂SP已經(jīng)加到Tornado2.0集成環(huán)境中。在Tornado1.0集成環(huán)境中,設(shè)置斷點(diǎn),有時(shí)會(huì)不顯示標(biāo)志。但是,斷點(diǎn)確實(shí)是設(shè)置了,據(jù)Wind River公司技術(shù)支持人員說,Tornado2.0集成環(huán)境已經(jīng)解決了這個(gè)問題。
總的看來VxWorks的調(diào)試工具使用不是很方便(與pSOS操作系統(tǒng)的調(diào)試工具SingleStep等相比),但是它提供了一組調(diào)試工具CrossWind、WindSh、Browser,實(shí)現(xiàn)了完備的調(diào)試功能,這主要體現(xiàn)在以下幾個(gè)方面:
x 源碼級(jí)調(diào)試器不能實(shí)現(xiàn)全部調(diào)試功能,如:內(nèi)存、寄存器、變量的修改,應(yīng)用模塊的卸載等。
x Shell可以實(shí)現(xiàn)全部的調(diào)試功能。
但是,它不是源碼級(jí)調(diào)試器。
x 分為兩種調(diào)試模式:任務(wù)調(diào)試模式和系統(tǒng)調(diào)試模式。在任務(wù)調(diào)試模式中,要調(diào)試多任務(wù)需要打開多個(gè)Tornado集成環(huán)境,并且不能調(diào)試中斷服務(wù)程序。
x 軟件復(fù)位需要重新加載系統(tǒng)內(nèi)核和應(yīng)用模塊。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -