新增Shell命令的开发流程
创建shell命令处理函数
shell命令处理函数用于处理用户注册的命令,例如创建一个命令处理函数osShellCmdTest,可以打印新增命令的入参:
#include "stdio.h"
UINT32 osShellCmdTest(UINT32 argc, CHAR **argv)
{
printf("this is a shell test\n");
if (argc == 1) {
printf("test cmd arg 1 is %s\n", argv[0]);
} else if (argc == 2) {
printf("test cmd arg 2 is %s %s\n", argv[0], argv[1]);
} else if (argc > 2) {
printf("input error\n");
}
return 0;
}
在头文件中声明命令处理函数:
UINT32 osShellCmdTest(UINT32 argc, CHAR **argv);
下面介绍示例中的两个入参:
argc
- shell命令中参数的个数。
- 个数中是否包括命令名,和注册命令时的命令类型有关。
argv
- 执行shell命令时传入命令处理函数的参数。
- 参数中是否包括命令名,和注册命令时的命令类型有关。
注册命令
有两种命令注册方式。下面以注册一个名为“test”的命令为例,介绍命令注册的方法。“test”命令的处理函数就是上面例子中的osShellCmdTest()函数:
静态注册命令
#include "shcmd.h"
SHELLCMD_ENTRY(testShellcmd, CMD_TYPE_EX, "test", XARGS, (CMD_CBK_FUNC)osShellCmdTest)
系统运行时动态注册命令
#include "shell.h"
osCmdReg(CMD_TYPE_EX, "test", XARGS, (CMD_CBK_FUNC)osShellCmdTest);
下面介绍注册命令函数的入参。
静态注册的命令变量名
- 静态注册命令比动态注册命令,增加了一个命令变量名,用于设置链接选项。
- 命令变量名只要符合变量的命名规范即可,无其他要求。
- 需要在链接选项(build/mk/liteos_tables_ld.mk的LITEOS_TABLES_LDFLAGS变量)中增加此命令变量名,例如示例中的变量名为
testShellcmd
,链接选项就应该设置为:LITEOS_TABLES_LDFLAGS += -utestShellcmd
。
命令类型
支持两种命令类型:
CMD_TYPE_EX 不支持标准命令参数输入,会把用户填写的命令名屏蔽掉,例如在串口输入
test -a -b
,传入命令处理函数的只有参数-a
和-b
,分别对应于命令处理函数中的argv[0]
和argv[1]
。CMD_TYPE_STD 支持标准命令参数输入,所有输入的字符都会通过命令解析后被传入,例如输入
test -a -b
,会把test
,-a
,-b
都传入命令处理函数,分别对应于命令处理函数中的argv[0]
,argv[1]
,argv[2]
。
命令名
- 在shell中调用命令处理函数的命令名,符合变量的命名规范即可,例如示例中的
test
就是命令处理函数osShellCmdTest
在串口中输入的命令名。
命令处理函数的最大参数个数
- 静态注册命令暂不支持设置。
- 动态注册命令支持设置不超过32的最大参数个数,或者设置为宏定义
XARGS
(其在代码中被定义为0xffffffff
)表示不限制参数个数。
(CMD_CBK_FUNC)osShellCmdTest
- 命令处理函数名,即在shell中被执行的函数。
注意:
静态注册命令方式一般用在系统常用命令注册,动态注册命令一般用在用户命令注册。
命令名必须是唯一的,两个不同的命令处理函数不能有相同的命令名,否则只会执行其中一个。