Zephyr subsystem Shell使用说明

Creative Commons
本作品采用知识共享署名

本文介绍了zephyr shell的操作方法,并说明如何配置和添加shell命令

概述

Zephyer shell在终端提供一个交互式的CLI,用于在程序运行时执行特定的命令。
Zephyer shell的特点:

  • shell cmd分level
  • 按照module分类cmd
  • 预制module shell cmd
  • 支持传参-最大10个参数
  • 可自定义prompt

配置和使用

配置

在app的~/work/project/zephyr_app/test/中的prj.conf中增加下面配置选项

1
2
CONFIG_CONSOLE_SHELL=y
CONFIG_KERNEL_SHELL=y

编译后启动app会开启shell

使用

命令使用

help 显示[Modules]和[Commands]两个分类,[Modules]下面列出了有shell cmd的module,[Commands]下面列出了基础命令。例如下图,有sample_moduel和kernel两个模块,version和noprompt两个基础命令
overview
基础命令是可以直接执行的命令,例如:
Infrastructure
help <commond> 显示commond的帮助信息,例如:
helpcmd
help <module> 显示module的commond,例如:
help
help <module commond> 显示Module内commond的帮助信息,例如:
helpm
<module> <commond> 执行模块命令, 例如
mcmd
select <module> 选择进入模块,进入模块后prompt会变为模块名,此时执行help显示模块支援的commond,键入commond会直接执行模块内部的命令,例如:
select
exit 退出当期模块,例如
exit

shell cmd的level的说明

zephyr的shell命令分为两个level,一个基础level,一个模块level。在系统启动进入shell后默认在基础level下,基础level可以同时执行基础level和模块level的cmd,通过select <module> 选择模块后就只能执行模块内命令。

Infrastructure level:基础level

配置CONFIG_CONSOLE_SHELL选项开启shell功能同时会开启基础level

Module/Subsystem level:模块level

Zephyr有本身的subsystem或模块level通过配置可以直接开启,例如配置CONFIG_KERNEL_SHELL选项开启zephyr kernel的cmd

1
CONFIG_KERNEL_SHELL=y

也可以自定义注册module cmd

添加Shell命令

在代码中使用下面方法添加shell命令

添加基础命令

增加一个shell cmd函数并实现需要的功能:

  1. 实现功能函数
  2. 用宏SHELL_CMD_VERSION来注册,第一个参数是命令名,第二个参数是功能函数,第三个参数是帮助信息
    version命令的参考代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <shell/shell.h>
    //1. 实现功能函数
    static int shell_cmd_version(int argc, char *argv[])
    {
    ARG_UNUSED(argc);
    ARG_UNUSED(argv);

    printk("Zephyr version %s\n", KERNEL_VERSION_STRING);
    return 0;
    }

    #define SHELL_CMD_VERSION "version"
    2. 用宏SHELL_CMD_VERSION注册命令
    SHELL_REGISTER_COMMAND(SHELL_CMD_VERSION, shell_cmd_version, "Show kernel version");

添加模块&模块命令

  1. 增加模块命令的功能函数
  2. 定义shell_cmd 数组管理模块命令的功能函数
  3. 用宏SHELL_REGISTER注册模块
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #define MY_SHELL_MODULE "sample_module"
    //1. 增加模块命令的功能函数
    static int shell_cmd_ping(int argc, char *argv[])
    {
    ARG_UNUSED(argc);
    ARG_UNUSED(argv);

    printk("pong\n");

    return 0;
    }

    static int shell_cmd_params(int argc, char *argv[])
    {
    int cnt;

    printk("argc = %d\n", argc);
    for (cnt = 0; cnt < argc; cnt++) {
    printk(" argv[%d] = %s\n", cnt, argv[cnt]);
    }
    return 0;
    }

    //2. 定义shell_cmd 数组管理模块命令的功能函数
    static struct shell_cmd commands[] = {
    { "ping", shell_cmd_ping, NULL },
    { "params", shell_cmd_params, "print argc" },
    { NULL, NULL, NULL }
    };

    3. 用宏SHELL_REGISTER注册模块
    SHELL_REGISTER(MY_SHELL_MODULE, commands);

以上代码添加的模块功能如下
msample

参考

http://docs.zephyrproject.org/subsystems/shell.html
https://github.com/zephyrproject-rtos/zephyr/tree/master/samples/subsys/shell/shell_module/src