本文介绍了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
2CONFIG_CONSOLE_SHELL=y
CONFIG_KERNEL_SHELL=y
编译后启动app会开启shell
使用
命令使用
help 显示[Modules]和[Commands]两个分类,[Modules]下面列出了有shell cmd的module,[Commands]下面列出了基础命令。例如下图,有sample_moduel和kernel两个模块,version和noprompt两个基础命令
基础命令是可以直接执行的命令,例如:
help <commond> 显示commond的帮助信息,例如:
help <module> 显示module的commond,例如:
help <module commond> 显示Module内commond的帮助信息,例如:
<module> <commond> 执行模块命令, 例如
select <module> 选择进入模块,进入模块后prompt会变为模块名,此时执行help显示模块支援的commond,键入commond会直接执行模块内部的命令,例如:
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的cmd1
CONFIG_KERNEL_SHELL=y
也可以自定义注册module cmd
添加Shell命令
在代码中使用下面方法添加shell命令
添加基础命令
增加一个shell cmd函数并实现需要的功能:
- 实现功能函数
- 用宏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");
添加模块&模块命令
- 增加模块命令的功能函数
- 定义shell_cmd 数组管理模块命令的功能函数
- 用宏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);
以上代码添加的模块功能如下
参考
http://docs.zephyrproject.org/subsystems/shell.html
https://github.com/zephyrproject-rtos/zephyr/tree/master/samples/subsys/shell/shell_module/src