新增Shell命令的开发流程

  1. 创建shell命令处理函数

    shell命令处理函数用于处理用户注册的命令,例如创建一个命令处理函数osShellCmdTest,可以打印新增命令的入参:

    1. #include "stdio.h"
    2. UINT32 osShellCmdTest(UINT32 argc, CHAR **argv)
    3. {
    4. printf("this is a shell test\n");
    5. if (argc == 1) {
    6. printf("test cmd arg 1 is %s\n", argv[0]);
    7. } else if (argc == 2) {
    8. printf("test cmd arg 2 is %s %s\n", argv[0], argv[1]);
    9. } else if (argc > 2) {
    10. printf("input error\n");
    11. }
    12. return 0;
    13. }

    在头文件中声明命令处理函数:

    1. UINT32 osShellCmdTest(UINT32 argc, CHAR **argv);

    下面介绍示例中的两个入参:

    argc
    • shell命令中参数的个数。
    • 个数中是否包括命令名,和注册命令时的命令类型有关。
    argv
    • 执行shell命令时传入命令处理函数的参数。
    • 参数中是否包括命令名,和注册命令时的命令类型有关。
  2. 注册命令

    有两种命令注册方式。下面以注册一个名为“test”的命令为例,介绍命令注册的方法。“test”命令的处理函数就是上面例子中的osShellCmdTest()函数:

    • 静态注册命令

      1. #include "shcmd.h"
      2. SHELLCMD_ENTRY(testShellcmd, CMD_TYPE_EX, "test", XARGS, (CMD_CBK_FUNC)osShellCmdTest)
    • 系统运行时动态注册命令

      1. #include "shell.h"
      2. 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中被执行的函数。

    注意:

    • 静态注册命令方式一般用在系统常用命令注册,动态注册命令一般用在用户命令注册。

    • 命令名必须是唯一的,两个不同的命令处理函数不能有相同的命令名,否则只会执行其中一个。