Zephyr subsystem Shell使用说明

本文介绍了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中增加下面配置选项

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

CONFIG_KERNEL_SHELL=y

也可以自定义注册module cmd

添加Shell命令 链接到标题

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

添加基础命令 链接到标题

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

  1. 实现功能函数
  2. 用宏SHELL_CMD_VERSION来注册,第一个参数是命令名,第二个参数是功能函数,第三个参数是帮助信息 version命令的参考代码:
#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注册模块
#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