vxworks 核心 shell 用法詳解

來源:互聯網
上載者:User

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,為自己總結,可能理解有誤,僅供參考。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.