Shell命令开发指导
开发指导
新增Shell命令的典型开发流程如下:
- 包含如下头文件:
```
-
include "shell.h"
-
include "shcmd.h"
``` -
注册命令。用户可以选择静态注册命令方式和系统运行时动态注册命令方式,静态注册命令方式一般用在系统常用命令注册,动态注册命令方式一般用在用户命令注册。
-
静态注册命令方式:
-
通过宏的方式注册。
这个宏的原型为:
SHELLCMD_ENTRY(l, cmdType, cmdKey, paraNum, cmdHook)
表 1 SHELLCMD_ENTRY参数详解
参数 描述 l 静态注册全局变量名(注意:不与系统中其他symbol重名)。 cmdType 命令类型: - CMD_TYPE_EX:不支持标准命令参数输入,会把用户填写的命令关键字屏蔽掉,例如:输入ls /ramfs,传入给注册函数的参数只有/ramfs,而ls命令关键字并不会被传入。 - CMD_TYPE_STD:支持的标准命令参数输入,所有输入的字符都会通过命令解析后被传入。 cmdKey 命令关键字,函数在Shell中访问的名称。 paraNum 调用的执行函数的入参最大个数,暂不支持。 cmdHook 命令执行函数地址,即命令实际执行函数。 如:SHELLCMD_ENTRY(ls_shellcmd, CMD_TYPE_EX, “ls”, XARGS, (CMD_CBK_FUNC)osShellCmdLs) 2. 在build/mk/liteos_tables_ldflags.mk中添加相应选项:
如:上述“ls”命令注册时,需在build/mk/liteos_tables_ldflags.mk中添加“-uls_shellcmd”。其中-u后面跟SHELLCMD_ENTRY的第一个参数。
-
1. 2. 动态注册命令方式:
3. 注册函数原型:
5. UINT32 osCmdReg\(CmdT ype cmdType, CHAR \*cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc\)
7. **表 2** UINT32 osCmdReg参数详解
9. <a name='table194461933114919'></a>
10. <table><thead align="left"><tr id="row1644693318490"><th class="cellrowborder" valign="top" width="20.91%" id="mcps1.2.3.1.1"><p id="p1644618337493"><a name='p1644618337493'></a><a name='p1644618337493'></a>参数</p>
11. </th>
12. <th class="cellrowborder" valign="top" width="79.09%" id="mcps1.2.3.1.2"><p id="p444603317491"><a name='p444603317491'></a><a name='p444603317491'></a>描述</p>
13. </th>
14. </tr>
15. </thead>
16. <tbody><tr id="row844643374912"><td class="cellrowborder" valign="top" width="20.91%" headers="mcps1.2.3.1.1 "><p id="p14446133319498"><a name='p14446133319498'></a><a name='p14446133319498'></a>cmdType</p>
17. </td>
18. <td class="cellrowborder" valign="top" width="79.09%" headers="mcps1.2.3.1.2 "><p id="p174461339496"><a name='p174461339496'></a><a name='p174461339496'></a>命令类型:</p>
19. <a name='ul1244773317496'></a><a name='ul1244773317496'></a><ul id="ul1244773317496"><li><p id="p1844719331495"><a name='p1844719331495'></a><a name='p1844719331495'></a>CMD_TYPE_EX:不支持标准命令参数输入,会把用户填写的命令关键字屏蔽掉,例如:输入ls /ramfs,传入给注册函数的参数只有/ramfs,而ls命令关键字并不会被传入。</p>
20. </li><li><p id="p20447143315498"><a name='p20447143315498'></a><a name='p20447143315498'></a>CMD_TYPE_STD:支持的标准命令参数输入,所有输入的字符都会通过命令解析后被传入。</p>
21. </li></ul>
22. </td>
23. </tr>
24. <tr id="row14471733184915"><td class="cellrowborder" valign="top" width="20.91%" headers="mcps1.2.3.1.1 "><p id="p744783319494"><a name='p744783319494'></a><a name='p744783319494'></a>cmdKey</p>
25. </td>
26. <td class="cellrowborder" valign="top" width="79.09%" headers="mcps1.2.3.1.2 "><p id="p18447833124914"><a name='p18447833124914'></a><a name='p18447833124914'></a>命令关键字,函数在Shell中访问的名称。</p>
27. </td>
28. </tr>
29. <tr id="row17447143317495"><td class="cellrowborder" valign="top" width="20.91%" headers="mcps1.2.3.1.1 "><p id="p174477331495"><a name='p174477331495'></a><a name='p174477331495'></a>paraNum</p>
30. </td>
31. <td class="cellrowborder" valign="top" width="79.09%" headers="mcps1.2.3.1.2 "><p id="p8447233184914"><a name='p8447233184914'></a><a name='p8447233184914'></a>调用的执行函数的入参最大个数,暂不支持该参数;当前为默认值XARGS(0xFFFFFFFF)。</p>
32. </td>
33. </tr>
34. <tr id="row10447233174913"><td class="cellrowborder" valign="top" width="20.91%" headers="mcps1.2.3.1.1 "><p id="p18447183334920"><a name='p18447183334920'></a><a name='p18447183334920'></a>cmdHook</p>
35. </td>
36. <td class="cellrowborder" valign="top" width="79.09%" headers="mcps1.2.3.1.2 "><p id="p44471533184912"><a name='p44471533184912'></a><a name='p44471533184912'></a>命令执行函数地址,即命令实际执行函数。</p>
37. </td>
38. </tr>
39. </tbody>
40. </table>
42. 如:osCmdReg\(CMD\_TYPE\_EX, "ls", XARGS, \(CMD\_CBK\_FUNC\)osShellCmdLs\)
45. > **说明:**
46. >命令关键字必须是唯一的,也即两个不同的命令项不能拥有相同的命令关键字,否则只会执行其中一个。
47. >Shell在执行用户命令时,如果存在多个命令关键字相同的命令,只会执行其中在"help"命令中排序在最前面的一个。
- 添加内置命令函数原型。
UINT32 osShellCmdLs(UINT32 argc, CHAR **argv)
表 3 osShellCmdLs参数说明
| 参数 | 参数描述 |
|---|---|
| argc | Shell命令中,参数个数。 |
| argv | 为指针数组,每个元素指向一个字符串,可以根据选择命令类型,决定是否要把命令关键字传入给注册函数。 |
| 2. 输入Shell命令,有两种输入方式: |
- 在串口工具中直接输入Shell命令。
- 在telnet工具中输入Shell命令(telnet使用方式详见telnet)。
