vxworks shell又稱為核心shell,即運行在開發板上的shell程式,能在主機上通過串口或telnet串連上去,shell下輸入i可以看到“tShell”任務(取決於建立時起的名字),這就是核心shell的任務。
C語言解譯器和命令直譯器
核心shell包含2個解譯器,C語言解譯器和命令直譯器。
shell前面為“->”表示C語言解譯器,前面為“[vxWorks *]#”表示命令直譯器。
C語言解譯器可以通過函數名調用程式中的函數(這些函數位於系統符號表中,系統符號表解釋見另一篇博文),所以可以通過它來直接在shell中調用某個函數進行調試。比如輸入help,會顯示出協助資訊,結尾還會輸出value = 1 = 0x1,其實help是核心中定義的一個help函數(查看系統符號表會發現有help函數),在C語言解譯器輸入help會調用核心的help函數,最後函數的傳回值為1。shell下常見的調試函數(如b、tt等)就在dbgLib庫中定義,其它命令類似。
疑問:
C語言解譯器對於不在符號表中的函數,可以通過nm工具擷取地址進行調用,這個不知如何使用。
核心shell和主機shell的區別
之所以叫核心shell,因為還有一個主機shell,即電腦workbench上啟動並執行host shell,需要加以區分。
兩個shell的不同點就是一個運行在電腦上,一個運行在開發板上,所以host shell使用主機資源(如lkup( ), ld( )等需要申請記憶體的命令),而核心shell使用開發板核心資源。電腦上的主機shell比開發板核心shell支援更多的解譯器,比如支援TCL解譯器(前面為“tcl>”)、gdb解譯器(前面為“(gdb)”)等。總之各有各的好處,都可以使用。
還有當在shell中輸入x = "hello there"時shell會動態申請記憶體,而不會自動釋放,所以為了防止記憶體流失,最好在用完了之後free (x)一下。即使輸入一個沒有和變數關聯的字串,也會申請記憶體並且不會釋放。如printf ("hello there"),這時可以用strFree()函數釋放。
疑問:
我這塊開發板的核心shell上輸入cd "e:",然後輸入pwd可以顯示host:e:,核心shell支援訪問主機嗎,怎麼實現的。
設定組態變數
shell的組態變數可以用於設定不同的shell(一個shell可以被多個使用者使用,組態變數不同)。shell的組態變數(shellLib定義)和vxworks環境變數不同(envLib定義)。?shConfig命令可以查看當前shell的組態變數。
-> ?shConfig
ALLOW_HOST_PATH_SEARCH = on
BP_PRINT = on
CPLUS_SYM_MATCH = off
C_OUTPUT_GET = off
DSM_HEX_MODE = off
EXC_PRINT = on
INTERPRETER = C
LD_CALL_XTORS = target
LD_COMMON_MATCH_ALL = on
LD_PATH = .
LD_SEND_MODULES = on
LD_UNLOAD_FIRST = on
......
組態變數中定義了一些常用的變數。如INTERPRETER定義了使用何種解譯器(c),LINE_EDIT_MODE定義了使用何種行編輯模式(vi),LINE_LENGTH設定shell一行有多長(256)等等。這些組態變數的值由vxworks核心的配置和wpj檔案中的定義決定,當然也可以通過shell的命令動態配置,如[vxWorks]# set config LINE_EDIT_MODE="emacs"。
建立核心shell
程式中,shellGenericInit函數可以建立shell,如
result = shellGenericInit(NULL, 0x10000, "tShell", NULL, TRUE, FALSE, ioGlobalStdGet (STD_IN), ioGlobalStdGet (STD_OUT), ioGlobalStdGet (STD_ERR));
上面函數建立一個名為tShell、堆棧大小為64k、輸入輸出為標準IO的shell。具體參數請參考shellLib中的定義。
shell的控制字元
具體定義請百度搜尋“ VxWorks作業系統shell命令與調試方法總結 ”,可以看到。
其中比較有用的是ctrl+d,可以補全函數名,所以在調用函數的時候就不需要記得完整的函數名了,ctrl+d可以自動搜尋補全。
如果shell卡死可以按ctrl+c重啟。
解譯器的轉換:
可以通過輸入下列字元在解譯器之間進行切換(需要支援該解譯器):
cmd:切換到命令直譯器
C:切換到C語言解譯器
。:切換到tcl解譯器
gdb:切換到gdb解譯器
當然也可以不切換直接調用,比如:
-> cmd emacs:C解譯器中調用命令直譯器
[vxWorks *]# C moduleShow:命令直譯器中調用C解譯器
shell的自動列印函數dprintf
dprintf函數可以實現全域變數的自動列印。
在核心shell下可以全域變數進行列印,dprintf函數讓列印變成自動列印,可以免去重複輸入的麻煩。具體用法請參考下面的測試例子:
寫一個C檔案:
#include <vxWorks.h>
#include <stdio.h>
#include <sysLib.h>
#include <taskLib.h>
int myIntVar = 0;
long long int myLongLongVar = 0;
char * myString;
void myLoop (void)
{
myIntVar ++;
myLongLongVar += 10;
sprintf (myString, "%d %lld", myIntVar, myLongLongVar);
}
void myTest (void)
{
myString = malloc (100);
myString[0] = EOS;
while (1)
{
myLoop ();
taskDelay (sysClkRateGet ());
}
}
輸入命令實現變數的自動列印:
-> ld < myTest.o
value = 1634729040 = 0x616ffc50 = 'P'
-> dprintf myLoop,0,0,"myIntVar = %d\n",&myIntVar
value = 0 = 0x0
-> dprintf myLoop,0,0,"myLongLongVar = %lld\n",&myLongLongVar
value = 0 = 0x0
-> dprintf myLoop,0,0,"string = %s\n", &myString
value = 0 = 0x0
-> dprintf myLoop,0,0,"int = %d, llong = %lld, string = %s\n",
&myIntVar, &myLongLongVar, &myString
value = 0 = 0x0
-> sp myTest
Task spawned: id = 0x604c1a38, name = t1 value = 1615600184 = 0x604c1a38 = '8' =
myString + 0x6c8
-> 0x604c1a38 (t1): myIntVar = 0
0x604c1a38 (t1): myLongLongVar = 0
0x604c1a38 (t1): string =
0x604c1a38 (t1): int = 0, llong = 0, string =
0x604c1a38 (t1): myIntVar = 1
0x604c1a38 (t1): myLongLongVar = 10
0x604c1a38 (t1): string = 1 10
0x604c1a38 (t1): int = 1, llong = 10, string = 1 10
0x604c1a38 (t1): myIntVar = 2
0x604c1a38 (t1): myLongLongVar = 20
0x604c1a38 (t1): string = 2 20
0x604c1a38 (t1): int = 2, llong = 20, string = 2 20
0x604c1a38 (t1): myIntVar = 3
0x604c1a38 (t1): myLongLongVar = 30
0x604c1a38 (t1): string = 3 30
0x604c1a38 (t1): int = 3, llong = 30, string = 3 30
0x604c1a38 (t1): myIntVar = 4
0x604c1a38 (t1): myLongLongVar = 40
0x604c1a38 (t1): string = 4 40
0x604c1a38 (t1): int = 4, llong = 40, string = 4 40
0x604c1a38 (t1): myIntVar = 5
0x604c1a38 (t1): myLongLongVar = 50
0x604c1a38 (t1): string = 5 50
0x604c1a38 (t1): int = 5, llong = 50, string = 5 50
建立使用者命令和解譯器
使用者還可以建立自己的shell命令和解譯器。
命令建立參考installDir/vxworks-6.x/target/src/demo/shell/tutorialShellCmd.c檔案。
解譯器建立參考installDir/vxworks-6.x/target/src/demo/shell/shellInterpDemo.c檔案。
本文參考官方文檔《vxworks kernel shell users guide 6.9》第二章kernel Shell,為自己總結,可能理解有誤,僅供參考。