更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
shell.h
浏览该文件的文档.
1/*!
2 * @file shell.h
3 * @brief Shell命令开发指导
4 * @link
5 @verbatim
6 OpenHarmony内核提供的Shell支持调试常用的基本功能,包含系统、文件、网络和动态加载相关命令。
7 同时OpenHarmony内核的Shell支持添加新的命令,可以根据需求来进行定制。
8
9 系统相关命令:提供查询系统任务、内核信号量、系统软件定时器、CPU占用率、当前中断等相关信息的能力。
10
11 文件相关命令:支持基本的ls、cd等功能。
12
13 网络相关命令:支持查询接到开发板的其他设备的IP、查询本机IP、测试网络连接、设置开发板的AP和station模式等相关功能。
14
15 在使用Shell功能的过程中,需要注意以下几点:
16
17 Shell功能支持使用exec命令来运行可执行文件。
18
19 Shell功能支持默认模式下英文输入。如果出现用户在UTF-8格式下输入了中文字符的情况,只能通过回退三次来删除。
20
21 Shell功能支持shell命令、文件名及目录名的Tab键联想补全。若有多个匹配项,则根据共同字符, 打印多个匹配项。
22 对于过多的匹配项(打印多于24行),将会进行打印询问(Display all num possibilities?(y/n)),
23 用户可输入y选择全部打印,或输入n退出打印,选择全部打印并打印超过24行后,会进行--More--提示,
24 此时按回车键继续打印,按q键退出(支持Ctrl+c退出)。
25
26 Shell端工作目录与系统工作目录是分开的,即通过Shell端cd pwd等命令是对Shell端工作目录进行操作,
27 通过chdir getcwd等命令是对系统工作目录进行操作,两个工作目录相互之间没有联系。当文件系统操作命令入参是相对路径时要格外注意。
28
29 在使用网络Shell指令前,需要先调用tcpip_init函数完成网络初始化并完成telnet连接后才能起作用,内核默认不初始化tcpip_init。
30
31 不建议使用Shell命令对/dev目录下的设备文件进行操作,这可能会引起不可预知的结果。
32 输入Shell命令,有两种输入方式:
33
34 1. 在串口工具中直接输入Shell命令。
35
36 2. 在telnet工具中输入Shell命令(telnet使用方式详见telnet)。
37 http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/kernel-small-debug-shell-net-telnet.html
38 @endverbatim
39 * @attention
40 Shell功能不符合POSIX标准,仅供调试使用。
41 Shell功能仅供调试使用,在Debug版本中开启(使用时通过menuconfig在配置项中开启"LOSCFG_DEBUG_VERSION"编译开关进行相关控制),
42 商用产品中禁止包含该功能。
43 * @version
44 * @author weharmonyos.com | 鸿蒙研究站 | 每天死磕一点点
45 * @date 2021-11-22
46 */
47/*
48 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
49 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
50 *
51 * Redistribution and use in source and binary forms, with or without modification,
52 * are permitted provided that the following conditions are met:
53 *
54 * 1. Redistributions of source code must retain the above copyright notice, this list of
55 * conditions and the following disclaimer.
56 *
57 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
58 * of conditions and the following disclaimer in the documentation and/or other materials
59 * provided with the distribution.
60 *
61 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
62 * to endorse or promote products derived from this software without specific prior written
63 * permission.
64 *
65 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
66 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
67 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
68 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
69 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
70 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
71 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
72 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
73 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
74 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
75 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
76 */
77
78#ifndef _HWLITEOS_SHELL_H
79#define _HWLITEOS_SHELL_H
80
81#include "pthread.h"
82#include "limits.h"
83#include "los_base.h"
84#include "los_event.h"
85
86#ifdef __cplusplus
87#if __cplusplus
88extern "C" {
89#endif /* __cplusplus */
90#endif /* __cplusplus */
91
92#define OS_ERRNO_SHELL_NO_HOOK LOS_ERRNO_OS_ERROR(LOS_MOD_SHELL, 0x00)
93#define OS_ERRNO_SHELL_CMDREG_PARA_ERROR LOS_ERRNO_OS_ERROR(LOS_MOD_SHELL, 0x01)
94#define OS_ERRNO_SHELL_CMDREG_CMD_ERROR LOS_ERRNO_OS_ERROR(LOS_MOD_SHELL, 0x02)
95#define OS_ERRNO_SHELL_CMDREG_CMD_EXIST LOS_ERRNO_OS_ERROR(LOS_MOD_SHELL, 0x03)
96#define OS_ERRNO_SHELL_CMDREG_MEMALLOC_ERROR LOS_ERRNO_OS_ERROR(LOS_MOD_SHELL, 0x04)
97#define OS_ERRNO_SHELL_SHOW_HOOK_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_SHELL, 0x05)
98#define OS_ERRNO_SHELL_SHOW_HOOK_EXIST LOS_ERRNO_OS_ERROR(LOS_MOD_SHELL, 0x06)
99#define OS_ERRNO_SHELL_SHOW_HOOK_TOO_MUCH LOS_ERRNO_OS_ERROR(LOS_MOD_SHELL, 0x07)
100#define OS_ERRNO_SHELL_NOT_INIT LOS_ERRNO_OS_ERROR(LOS_MOD_SHELL, 0x08)
101#define OS_ERRNO_SHELL_CMD_HOOK_NULL LOS_ERRNO_OS_ERROR(LOS_MOD_SHELL, 0x09)
102#define OS_ERRNO_SHELL_FIFO_ERROR LOS_ERRNO_OS_ERROR(LOS_MOD_SHELL, 0x10)
103
104/* Max len of show str */
105#define SHOW_MAX_LEN CMD_MAX_LEN
106
107#define XARGS 0xFFFFFFFF /* default args */
108
109#define CMD_MAX_PARAS 32 ///< 命令参数最大个数
110#define CMD_KEY_LEN 16U ///< 关键字长度 例如: 'ls'的长度为2
111#define CMD_MAX_LEN (256U + CMD_KEY_LEN)
112#define CMD_KEY_NUM 32 //
113#define CMD_HISTORY_LEN 10 ///< 历史记录数量
114#define CMD_MAX_PATH 256 ///< 最大路径
115#define DEFAULT_SCREEN_WIDTH 80 ///< 屏幕的宽
116#define DEFAULT_SCREEN_HEIGHT 24 ///< 屏幕的高
117
118#define SHELL_MODE 0 ///< shell模式
119#define OTHER_MODE 1 ///< 其他模式
120
121#define SWITCH_QUOTES_STATUS(qu) do { \
122 if ((qu) == TRUE) { \
123 (qu) = FALSE; \
124 } else { \
125 (qu) = TRUE; \
126 } \
127} while (0)
128
129#define QUOTES_STATUS_CLOSE(qu) ((qu) == FALSE)
130#define QUOTES_STATUS_OPEN(qu) ((qu) == TRUE)
131/*! shell 控制块 */
132typedef struct {
133 UINT32 consoleID; ///< 控制台ID,shell必须捆绑一个控制台(串口或远程登录),以便接收输入和发送执行结果信息
134 UINT32 shellTaskHandle; ///< shell服务端任务(负责解析和执行来自客户端的信息)
135 UINT32 shellEntryHandle; ///< shell客户端任务(负责接受来自串口或远程登录的信息)
136 VOID *cmdKeyLink; ///< 待处理的shell命令链表
137 VOID *cmdHistoryKeyLink; ///< 已处理的命令历史记录链表,去重,10个
138 VOID *cmdMaskKeyLink; ///< 主要用于方向键上下遍历命令历史
139 UINT32 shellBufOffset; ///< buf偏移量
140 UINT32 shellKeyType; ///< 按键类型
141 EVENT_CB_S shellEvent; ///< 事件类型触发
142 pthread_mutex_t keyMutex; ///< 按键互斥量
143 pthread_mutex_t historyMutex; ///< 命令历史记录互斥量
144 CHAR shellBuf[SHOW_MAX_LEN]; ///< shell命令buf,接受键盘的输入,需要对输入字符解析.
145 CHAR shellWorkingDirectory[PATH_MAX]; ///< shell的工作目录
146} ShellCB;
147
148/*! All support cmd types | 所有支持的类型 */
149typedef enum {
150 CMD_TYPE_SHOW = 0, ///< 用户怎么输入就怎么显示出现,包括 \n \0 这些字符也都会存在
151 CMD_TYPE_STD = 1, ///< 支持的标准命令参数输入,所有输入的字符都会通过命令解析后被传入。
152 CMD_TYPE_EX = 2, ///< 不支持标准命令参数输入,会把用户填写的命令关键字屏蔽掉,例如:输入ls /ramfs,传入给注册函数的参数只有/ramfs,而ls命令关键字并不会被传入。
155/*! 四个方向上下左右键*/
156typedef enum {
163
164/*
165 * Hook for user-defined debug function
166 * Unify differnt module's func for registration
167 */
168typedef UINT32 (*CmdCallBackFunc)(UINT32 argc, const CHAR **argv);//命令回调函数,
169
170/* External interface, need reserved */
173/// 以动态方式注册命令
174extern UINT32 osCmdReg(CmdType cmdType, const CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc);
175
176#ifdef __cplusplus
177#if __cplusplus
178}
179#endif /* __cplusplus */
180#endif /* __cplusplus */
181
182#endif /* _HWLITEOS_SHELL_H */
CmdKeyDirection
Definition: shell.h:95
@ CMD_KEY_BUTT
Definition: shell.h:100
@ CMD_KEY_LEFT
方向右键
Definition: shell.h:99
@ CMD_KEY_DOWN
方向下键
Definition: shell.h:97
@ CMD_KEY_RIGHT
方向左键
Definition: shell.h:98
@ CMD_KEY_UP
方向上键
Definition: shell.h:96
CmdType
Definition: shell.h:88
@ CMD_TYPE_BUTT
Definition: shell.h:92
@ CMD_TYPE_STD
支持的标准命令参数输入,所有输入的字符都会通过命令解析后被传入。
Definition: shell.h:90
@ CMD_TYPE_EX
不支持标准命令参数输入,会把用户填写的命令关键字屏蔽掉,例如:输入ls /ramfs,传入给注册函数的参数只有/ramfs,而ls命令关键字并不会被传入。
Definition: shell.h:91
@ CMD_TYPE_SHOW
用户怎么输入就怎么显示出现,包括 \0 这些字符也都会存在
Definition: shell.h:89
unsigned int UINT32
Definition: los_typedef.h:57
char CHAR
Definition: los_typedef.h:63
UINT32(* CmdCallBackFunc)(UINT32 argc, const CHAR **argv)
Definition: shell.h:168
CmdType CMD_TYPE_E
Definition: shell.h:172
UINT32 osCmdReg(CmdType cmdType, const CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc)
以动态方式注册命令
Definition: shcmd.c:856
CmdCallBackFunc CMD_CBK_FUNC
Definition: shell.h:171
Definition: shell.h:71
EVENT_CB_S shellEvent
事件类型触发
Definition: shell.h:141
UINT32 shellEntryHandle
shell客户端任务(负责接受来自串口或远程登录的信息)
Definition: shell.h:135
UINT32 shellKeyType
按键类型
Definition: shell.h:140
VOID * cmdHistoryKeyLink
已处理的命令历史记录链表,去重,10个
Definition: shell.h:137
UINT32 consoleID
控制台ID,shell必须捆绑一个控制台(串口或远程登录),以便接收输入和发送执行结果信息
Definition: shell.h:133
UINT32 shellBufOffset
buf偏移量
Definition: shell.h:139
VOID * cmdMaskKeyLink
主要用于方向键上下遍历命令历史
Definition: shell.h:138
UINT32 shellTaskHandle
shell服务端任务(负责解析和执行来自客户端的信息)
Definition: shell.h:134
VOID * cmdKeyLink
待处理的shell命令链表
Definition: shell.h:136