Zephyr Shell完全指南:嵌入式系统的交互式命令行
引言
在嵌入式系统开发中,Shell是一个强大的交互式工具,它允许开发者通过命令行接口与设备进行实时交互。Zephyr RTOS提供了功能丰富的Shell子系统,支持多种传输方式、命令扩展和动态配置。本文将详细介绍Zephyr Shell的功能、特性、用法以及常用命令。
一、Shell是什么?
1.1 定义与定位
Zephyr Shell 是Zephyr RTOS提供的交互式命令行子系统,它允许用户通过串口、网络或其他传输方式与设备进行交互,执行各种调试、配置和管理操作。
1.2 核心价值
| 特性 | 说明 |
|---|---|
| 实时交互 | 通过命令行实时控制设备 |
| 调试支持 | 查看系统状态、内存、线程等信息 |
| 动态配置 | 运行时修改系统参数 |
| 命令扩展 | 支持自定义命令注册 |
| 多传输方式 | 支持串口、Telnet、USB等多种传输 |
1.3 Shell架构
#mermaid-svg-kP8Y9b1LWvfU6cSc{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-kP8Y9b1LWvfU6cSc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-kP8Y9b1LWvfU6cSc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-kP8Y9b1LWvfU6cSc .error-icon{fill:#552222;}#mermaid-svg-kP8Y9b1LWvfU6cSc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kP8Y9b1LWvfU6cSc .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-kP8Y9b1LWvfU6cSc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kP8Y9b1LWvfU6cSc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kP8Y9b1LWvfU6cSc .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-kP8Y9b1LWvfU6cSc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kP8Y9b1LWvfU6cSc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kP8Y9b1LWvfU6cSc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kP8Y9b1LWvfU6cSc .marker.cross{stroke:#333333;}#mermaid-svg-kP8Y9b1LWvfU6cSc svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kP8Y9b1LWvfU6cSc p{margin:0;}#mermaid-svg-kP8Y9b1LWvfU6cSc .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-kP8Y9b1LWvfU6cSc .cluster-label text{fill:#333;}#mermaid-svg-kP8Y9b1LWvfU6cSc .cluster-label span{color:#333;}#mermaid-svg-kP8Y9b1LWvfU6cSc .cluster-label span p{background-color:transparent;}#mermaid-svg-kP8Y9b1LWvfU6cSc .label text,#mermaid-svg-kP8Y9b1LWvfU6cSc span{fill:#333;color:#333;}#mermaid-svg-kP8Y9b1LWvfU6cSc .node rect,#mermaid-svg-kP8Y9b1LWvfU6cSc .node circle,#mermaid-svg-kP8Y9b1LWvfU6cSc .node ellipse,#mermaid-svg-kP8Y9b1LWvfU6cSc .node polygon,#mermaid-svg-kP8Y9b1LWvfU6cSc .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-kP8Y9b1LWvfU6cSc .rough-node .label text,#mermaid-svg-kP8Y9b1LWvfU6cSc .node .label text,#mermaid-svg-kP8Y9b1LWvfU6cSc .image-shape .label,#mermaid-svg-kP8Y9b1LWvfU6cSc .icon-shape .label{text-anchor:middle;}#mermaid-svg-kP8Y9b1LWvfU6cSc .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-kP8Y9b1LWvfU6cSc .rough-node .label,#mermaid-svg-kP8Y9b1LWvfU6cSc .node .label,#mermaid-svg-kP8Y9b1LWvfU6cSc .image-shape .label,#mermaid-svg-kP8Y9b1LWvfU6cSc .icon-shape .label{text-align:center;}#mermaid-svg-kP8Y9b1LWvfU6cSc .node.clickable{cursor:pointer;}#mermaid-svg-kP8Y9b1LWvfU6cSc .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-kP8Y9b1LWvfU6cSc .arrowheadPath{fill:#333333;}#mermaid-svg-kP8Y9b1LWvfU6cSc .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-kP8Y9b1LWvfU6cSc .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-kP8Y9b1LWvfU6cSc .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kP8Y9b1LWvfU6cSc .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-kP8Y9b1LWvfU6cSc .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kP8Y9b1LWvfU6cSc .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-kP8Y9b1LWvfU6cSc .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-kP8Y9b1LWvfU6cSc .cluster text{fill:#333;}#mermaid-svg-kP8Y9b1LWvfU6cSc .cluster span{color:#333;}#mermaid-svg-kP8Y9b1LWvfU6cSc div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-kP8Y9b1LWvfU6cSc .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-kP8Y9b1LWvfU6cSc rect.text{fill:none;stroke-width:0;}#mermaid-svg-kP8Y9b1LWvfU6cSc .icon-shape,#mermaid-svg-kP8Y9b1LWvfU6cSc .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kP8Y9b1LWvfU6cSc .icon-shape p,#mermaid-svg-kP8Y9b1LWvfU6cSc .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-kP8Y9b1LWvfU6cSc .icon-shape .label rect,#mermaid-svg-kP8Y9b1LWvfU6cSc .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kP8Y9b1LWvfU6cSc .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-kP8Y9b1LWvfU6cSc .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-kP8Y9b1LWvfU6cSc :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户输入
Shell核心
命令解析器
命令匹配
内置命令
自定义命令
模块命令
kernel
device
log
应用命令
sensor
gpio
flash
执行结果
输出响应
二、Shell特性详解
2.1 传输方式支持
| 传输类型 | 配置选项 | 适用场景 |
|---|---|---|
| 串口(UART) | CONFIG_SHELL_BACKEND_SERIAL |
最常用的调试方式 |
| Telnet | CONFIG_SHELL_BACKEND_TELNET |
远程网络调试 |
| USB CDC | CONFIG_SHELL_BACKEND_USB |
USB虚拟串口 |
| RTT | CONFIG_SHELL_BACKEND_RTT |
Segger RTT高速传输 |
2.2 命令特性
| 特性 | 说明 |
|---|---|
| 命令自动补全 | Tab键自动补全命令和参数 |
| 历史记录 | 上下箭头键浏览历史命令 |
| 命令帮助 | -h参数显示命令帮助 |
| 参数解析 | 支持多种参数类型和格式 |
| 命令分组 | 模块化组织命令结构 |
2.3 配置选项
conf
# prj.conf Shell配置示例
# 启用Shell子系统
CONFIG_SHELL=y
# 启用串口后端
CONFIG_SHELL_BACKEND_SERIAL=y
# 启用命令历史记录
CONFIG_SHELL_HISTORY=y
# 启用命令自动补全
CONFIG_SHELL_TAB=y
CONFIG_SHELL_TAB_AUTOCOMPLETION=y
# 启用帮助信息
CONFIG_SHELL_HELP=y
CONFIG_SHELL_HELP_ON_ALL=y
# 启用参数解析
CONFIG_SHELL_CMDS_SELECT=y
# Shell栈大小
CONFIG_SHELL_STACK_SIZE=2048
三、Shell使用方法
3.1 启用Shell
步骤一:添加配置
conf
# prj.conf
CONFIG_SHELL=y
CONFIG_SHELL_BACKEND_SERIAL=y
CONFIG_KERNEL_SHELL=y
CONFIG_DEVICE_SHELL=y
CONFIG_LOG_SHELL=y
步骤二:代码集成
c
#include <zephyr/shell/shell.h>
#include <zephyr/shell/shell_uart.h>
/* Shell实例声明 */
SHELL_UART_DEFINE(shell_transport_uart);
SHELL_DEFINE(shell_instance, "zephyr:~$ ", &shell_transport_uart,
10, SHELL_FLAG_OLF_CRLF);
void main(void) {
/* 启动Shell */
shell_init(&shell_instance);
while (1) {
k_msleep(1000);
}
}
3.2 连接Shell
通过串口连接:
bash
# Linux/macOS
minicom -D /dev/ttyUSB0 -b 115200
# 或使用picocom
picocom -b 115200 /dev/ttyUSB0
# Windows
# 使用PuTTY或Tera Term连接串口
连接后输出示例:
uart:~$
uart:~$ help
Help commands:
kernel - Kernel commands
device - Device commands
log - Log commands
shell - Shell commands
3.3 Shell交互示例
bash
uart:~$ kernel version
Zephyr version 3.5.0
uart:~$ kernel threads
Threads:
[0] main READY P:0 STACK:2048
[1] idle READY P:0 STACK:512
[2] shell RUNNING P:5 STACK:2048
uart:~$ device list
Devices:
- uart@40000000
- gpio@40000001
- flash@40000002
四、常用命令详解
4.1 kernel命令组
4.1.1 kernel version
功能:显示Zephyr版本信息
bash
uart:~$ kernel version
Zephyr version 3.5.0
4.1.2 kernel threads
功能:显示系统线程列表
bash
uart:~$ kernel threads
Threads:
[0] main READY P:0 STACK:2048 USED:256
[1] idle READY P:0 STACK:512 USED:64
[2] shell RUNNING P:5 STACK:2048 USED:512
[3] log PENDING P:10 STACK:1024 USED:128
输出字段说明:
| 字段 | 说明 |
|---|---|
[n] |
线程ID |
name |
线程名称 |
state |
状态(READY/RUNNING/PENDING) |
P:n |
优先级 |
STACK:n |
栈大小(字节) |
USED:n |
已使用栈大小 |
4.1.3 kernel reboot
功能:重启系统
bash
uart:~$ kernel reboot
Rebooting system...
4.1.4 kernel uptime
功能:显示系统运行时间
bash
uart:~$ kernel uptime
Uptime: 3600 seconds (1 hours)
4.1.5 kernel suspend
功能:暂停指定线程
bash
uart:~$ kernel suspend shell
Thread shell suspended
4.1.6 kernel resume
功能:恢复指定线程
bash
uart:~$ kernel resume shell
Thread shell resumed
4.2 device命令组
4.2.1 device list
功能:列出所有设备
bash
uart:~$ device list
Devices:
- uart@40000000 (UART_0)
- gpio@40000001 (GPIO_0)
- flash@40000002 (FLASH_0)
- sensor@40000003 (SENSOR_0)
4.2.2 device get
功能:获取设备信息
bash
uart:~$ device get uart@40000000
Device: uart@40000000
Name: UART_0
State: Ready
Driver: uart_nrfx_uarte
4.2.3 device bind
功能:绑定设备驱动
bash
uart:~$ device bind gpio@40000001
Device gpio@40000001 bound to driver gpio_nrfx
4.3 log命令组
4.3.1 log enable
功能:启用日志模块
bash
uart:~$ log enable app
Log module app enabled
uart:~$ log enable all
All log modules enabled
4.3.2 log disable
功能:禁用日志模块
bash
uart:~$ log disable app
Log module app disabled
4.3.3 log level
功能:设置日志级别
bash
uart:~$ log level err app
Log level for app set to ERROR
uart:~$ log level info all
Log level for all modules set to INFO
日志级别说明:
| 级别 | 常量 | 说明 |
|---|---|---|
none |
LOG_LEVEL_NONE | 无日志 |
err |
LOG_LEVEL_ERR | 错误级别 |
wrn |
LOG_LEVEL_WRN | 警告级别 |
inf |
LOG_LEVEL_INF | 信息级别 |
dbg |
LOG_LEVEL_DBG | 调试级别 |
4.3.4 log list
功能:列出日志模块
bash
uart:~$ log list
Log modules:
- app (level: INFO)
- kernel (level: ERROR)
- sensor (level: DBG)
4.3.5 log backend
功能:管理日志后端
bash
uart:~$ log backend list
Log backends:
- uart (enabled)
- rtt (disabled)
uart:~$ log backend enable uart
Log backend uart enabled
uart:~$ log backend disable uart
Log backend uart disabled
4.4 shell命令组
4.4.1 shell help
功能:显示帮助信息
bash
uart:~$ shell help
Shell commands:
help - Show help for commands
history - Show command history
clear - Clear screen
echo - Echo arguments
stats - Show shell statistics
4.4.2 shell history
功能:显示命令历史
bash
uart:~$ shell history
Command history:
1: kernel version
2: kernel threads
3: device list
4: log enable app
4.4.3 shell clear
功能:清屏
bash
uart:~$ shell clear
# 屏幕被清空
uart:~$
4.4.4 shell echo
功能:回显参数
bash
uart:~$ shell echo Hello World
Hello World
uart:~$ shell echo -n "No newline"
No newlineuart:~$
4.4.5 shell stats
功能:显示Shell统计信息
bash
uart:~$ shell stats
Shell statistics:
Commands executed: 25
Commands failed: 2
History size: 10
Buffer size: 256
4.5 sensor命令组
4.5.1 sensor get
功能:读取传感器数据
bash
uart:~$ sensor get sensor@40000003
Sensor: sensor@40000003
Temperature: 25.5 °C
Humidity: 60.2 %
Pressure: 1013.25 hPa
4.5.2 sensor list
功能:列出传感器设备
bash
uart:~$ sensor list
Sensors:
- sensor@40000003 (TEMP_SENSOR)
- sensor@40000004 (LIGHT_SENSOR)
4.6 flash命令组
4.6.1 flash read
功能:读取Flash数据
bash
uart:~$ flash read 0x08000000 256
Reading 256 bytes from 0x08000000:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
...
4.6.2 flash write
功能:写入Flash数据
bash
uart:~$ flash write 0x08000000 "Hello World"
Writing 11 bytes to 0x08000000
Write successful
4.6.3 flash erase
功能:擦除Flash扇区
bash
uart:~$ flash erase 0x08000000 4096
Erasing 4096 bytes from 0x08000000
Erase successful
4.7 gpio命令组
4.7.1 gpio config
功能:配置GPIO引脚
bash
uart:~$ gpio config gpio@40000001 0 output
GPIO 0 configured as output
uart:~$ gpio config gpio@40000001 1 input pull-up
GPIO 1 configured as input with pull-up
4.7.2 gpio set
功能:设置GPIO输出
bash
uart:~$ gpio set gpio@40000001 0 1
GPIO 0 set to 1
uart:~$ gpio set gpio@40000001 0 0
GPIO 0 set to 0
4.7.3 gpio get
功能:读取GPIO输入
bash
uart:~$ gpio get gpio@40000001 1
GPIO 1: 1 (HIGH)
五、自定义命令开发
5.1 注册自定义命令
c
#include <zephyr/shell/shell.h>
/* 自定义命令处理函数 */
static int cmd_myapp_hello(const struct shell *sh, size_t argc, char **argv) {
shell_print(sh, "Hello from myapp!");
if (argc > 1) {
shell_print(sh, "Arguments:");
for (size_t i = 1; i < argc; i++) {
shell_print(sh, " argv[%d]: %s", i, argv[i]);
}
}
return 0;
}
/* 定义子命令 */
SHELL_STATIC_SUBCMD_SET_CREATE(sub_myapp,
SHELL_CMD(hello, NULL, "Print hello message", cmd_myapp_hello),
SHELL_SUBCMD_SET_END
);
/* 注册命令 */
SHELL_CMD_REGISTER(myapp, &sub_myapp, "My application commands", NULL);
5.2 带参数的命令
c
/* 带参数的命令处理函数 */
static int cmd_myapp_config(const struct shell *sh, size_t argc, char **argv) {
if (argc < 3) {
shell_error(sh, "Usage: myapp config <key> <value>");
return -EINVAL;
}
const char *key = argv[1];
const char *value = argv[2];
shell_print(sh, "Setting %s = %s", key, value);
return 0;
}
SHELL_CMD_REGISTER(myapp_config, NULL, "Configure myapp", cmd_myapp_config);
5.3 动态命令注册
c
/* 动态添加命令 */
static int dynamic_cmd_handler(const struct shell *sh, size_t argc, char **argv) {
shell_print(sh, "Dynamic command executed");
return 0;
}
void register_dynamic_command(void) {
shell_cmd_add("dynamic_cmd", NULL, "Dynamic command", dynamic_cmd_handler);
}
六、高级用法
6.1 命令自动补全
bash
uart:~$ ker<Tab>
kernel
uart:~$ kernel v<Tab>
version
uart:~$ kernel version
Zephyr version 3.5.0
6.2 命令历史导航
bash
uart:~$ kernel version
uart:~$ kernel threads
uart:~$ <Up Arrow>
kernel threads
uart:~$ <Up Arrow>
kernel version
uart:~$ <Down Arrow>
kernel threads
6.3 管道和重定向
bash
# 管道(部分支持)
uart:~$ device list | grep gpio
gpio@40000001 (GPIO_0)
# 输出重定向(需要配置)
uart:~$ kernel threads > /tmp/threads.txt
6.4 脚本执行
bash
# 执行脚本文件
uart:~$ shell script /scripts/init.sh
Executing script: init.sh
> kernel version
> device list
> log enable app
Script executed successfully
七、配置详解
7.1 Shell后端配置
conf
# 串口后端配置
CONFIG_SHELL_BACKEND_SERIAL=y
CONFIG_SHELL_SERIAL_BACKEND_DEFAULT_INIT_PRIORITY=40
# Telnet后端配置
CONFIG_SHELL_BACKEND_TELNET=y
CONFIG_SHELL_TELNET_PORT=23
# RTT后端配置
CONFIG_SHELL_BACKEND_RTT=y
CONFIG_SHELL_RTT_MODE=BLOCKING
# USB CDC后端配置
CONFIG_SHELL_BACKEND_USB=y
CONFIG_USB_CDC_ACM=y
7.2 Shell功能配置
conf
# 命令历史
CONFIG_SHELL_HISTORY=y
CONFIG_SHELL_HISTORY_BUFFER=256
# 自动补全
CONFIG_SHELL_TAB=y
CONFIG_SHELL_TAB_AUTOCOMPLETION=y
# 帮助信息
CONFIG_SHELL_HELP=y
CONFIG_SHELL_HELP_ON_ALL=y
CONFIG_SHELL_HELP_VERBOSE=y
# 参数解析
CONFIG_SHELL_CMDS_SELECT=y
CONFIG_SHELL_ARGC_MAX=10
# 颜色输出
CONFIG_SHELL_VT100_COLORS=y
# 统计信息
CONFIG_SHELL_STATS=y
7.3 模块Shell配置
conf
# 内核Shell
CONFIG_KERNEL_SHELL=y
# 设备Shell
CONFIG_DEVICE_SHELL=y
# 日志Shell
CONFIG_LOG_SHELL=y
# 传感器Shell
CONFIG_SENSOR_SHELL=y
# GPIO Shell
CONFIG_GPIO_SHELL=y
# Flash Shell
CONFIG_FLASH_SHELL=y
八、常见问题与解决方案
8.1 Shell无法启动
问题:Shell命令行不显示
解决方案:
bash
# 检查配置
cat build/zephyr/.config | grep SHELL
# 确认串口连接
minicom -D /dev/ttyUSB0 -b 115200
# 检查Shell栈大小
CONFIG_SHELL_STACK_SIZE=2048
8.2 命令无法执行
问题:输入命令后无响应
解决方案:
bash
# 检查命令是否注册
uart:~$ help
# 检查命令拼写
uart:~$ kernel<Tab>
# 查看Shell日志
CONFIG_LOG=y
CONFIG_LOG_DEFAULT_LEVEL=4
8.3 命令参数错误
问题:参数解析失败
解决方案:
bash
# 查看命令帮助
uart:~$ kernel threads -h
# 检查参数格式
uart:~$ log level info app # 正确格式
uart:~$ log level app info # 错误格式
8.4 历史记录丢失
问题:无法浏览历史命令
解决方案:
conf
# 启用历史记录
CONFIG_SHELL_HISTORY=y
CONFIG_SHELL_HISTORY_BUFFER=512
九、命令速查表
9.1 kernel命令
| 命令 | 功能 | 示例 |
|---|---|---|
kernel version |
显示版本 | kernel version |
kernel threads |
显示线程 | kernel threads |
kernel reboot |
重启系统 | kernel reboot |
kernel uptime |
运行时间 | kernel uptime |
kernel suspend |
暂停线程 | kernel suspend shell |
kernel resume |
恢复线程 | kernel resume shell |
9.2 device命令
| 命令 | 功能 | 示例 |
|---|---|---|
device list |
列出设备 | device list |
device get |
获取信息 | device get uart@0 |
device bind |
绑定驱动 | device bind gpio@0 |
9.3 log命令
| 命令 | 功能 | 示例 |
|---|---|---|
log enable |
启用日志 | log enable app |
log disable |
禁用日志 | log disable app |
log level |
设置级别 | log level info app |
log list |
列出模块 | log list |
log backend |
管理后端 | log backend list |
9.4 shell命令
| 命令 | 功能 | 示例 |
|---|---|---|
shell help |
显示帮助 | shell help |
shell history |
显示历史 | shell history |
shell clear |
清屏 | shell clear |
shell echo |
回显 | shell echo Hello |
shell stats |
统计信息 | shell stats |
结束语
Zephyr Shell是嵌入式开发中不可或缺的调试和交互工具。通过本文的介绍,相信您已经掌握了Shell的功能、特性、配置方法和常用命令。
Shell的核心优势在于:
- 提供实时交互能力,无需重新编译即可调试
- 支持多种传输方式,适应不同开发场景
- 模块化命令组织,易于扩展自定义命令
- 丰富的内置命令,覆盖内核、设备、日志等关键功能
在实际开发中,合理使用Shell可以大大提高调试效率,加速开发进程。建议在所有项目中都启用Shell功能,为后续调试和维护提供便利。
参考资料: