TA的每日心情 | 无聊 3 天前 |
---|
签到天数: 530 天 连续签到: 2 天 [LV.9]测试副司令
|
本帖最后由 测试积点老人 于 2018-12-19 16:28 编辑
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文件。
|
|