51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 1995|回复: 0
打印 上一主题 下一主题

[转贴] vxworks 内核 shell 用法详解

[复制链接]
  • TA的每日心情
    无聊
    昨天 09:22
  • 签到天数: 402 天

    连续签到: 3 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2018-12-19 16:27:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 测试积点老人 于 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文件。


    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-25 12:58 , Processed in 0.062768 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表