vxworks 内核 shell 用法详解

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函数,最后函数的返回值为1shell下常见的调试函数(如btt等)就在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、输入输出为标准IOshell。具体参数请参考shellLib中的定义。


shell的控制字符

具体定义请百度搜索 VxWorks操作系统shell命令与调试方法总结 ”,可以看到。

其中比较有用的是ctrl+d,可以补全函数名,所以在调用函数的时候就不需要记得完整的函数名了,ctrl+d可以自动搜索补全。

如果shell卡死可以按ctrl+c重启。


解释器的转换:

可以通过输入下列字符在解释器之间进行切换(需要支持该解释器):

cmd:切换到命令解释器

C:切换到C语言解释器

?:切换到tcl解释器

gdb:切换到gdb解释器

当然也可以不切换直接调用,比如:

-> cmd emacsC解释器中调用命令解释器

[vxWorks *]# C moduleShow:命令解释器中调用C解释器


shell的自动打印函数dprintf

dprintf函数可以实现全局变量的自动打印。

在内核shell下可以全局变量进行打印,dprintf函数让打印变成自动打印,可以免去重复输入的麻烦。具体用法请参考下面的测试例子:

写一个C文件:

#include

#include

#include

#include

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,为自己总结,可能理解有误,仅供参考。

你可能感兴趣的:(vxworks)