
OpenHarmony设备开发 小型系统内核(LiteOS-A) 调测与工具 Shell
版本:V3.2Beta
Shell介绍
OpenHarmony内核提供的Shell支持调试常用的基本功能,包含系统、文件、网络和动态加载相关命令。同时OpenHarmony内核的Shell支持添加新的命令,可以根据需求来进行定制。
- 系统相关命令:提供查询系统任务、内核信号量、系统软件定时器、CPU占用率、当前中断等相关信息的能力。
- 文件相关命令:支持基本的ls、cd等功能。
- 网络相关命令:支持查询接到开发板的其他设备的IP、查询本机IP、测试网络连接、设置开发板的AP和station模式等相关功能。
新增命令的详细流程可参见Shell命令开发指导和Shell命令编程实例。
注意事项
在使用Shell功能的过程中,需要注意以下几点:
- Shell功能支持使用exec命令来运行可执行文件。
- Shell功能支持默认模式下英文输入。如果出现用户在UTF-8格式下输入了中文字符的情况,只能通过回退三次来删除。
- Shell功能支持shell命令、文件名及目录名的Tab键联想补全。若有多个匹配项,则根据共同字符, 打印多个匹配项。对于过多的匹配项(打印多于24行),将会进行打印询问(Display all num possibilities?(y/n)),用户可输入y选择全部打印,或输入n退出打印,选择全部打印并打印超过24行后,会进行–More–提示,此时按回车键继续打印,按q键退出(支持Ctrl+c退出)。
- Shell端工作目录与系统工作目录是分开的,即通过Shell端cd、pwd等命令是对Shell端工作目录进行操作,通过chdir、getcwd等命令是对系统工作目录进行操作,两个工作目录相互之间没有联系。当文件系统操作命令入参是相对路径时要格外注意。
- 在使用网络Shell指令前,需要先调用tcpip_init函数完成网络初始化并完成telnet连接后才能起作用,内核默认不初始化tcpip_init。
- 不建议使用Shell命令对/dev目录下的设备文件进行操作,这可能会引起不可预知的结果。
- Shell功能不符合POSIX标准,仅供调试使用。
须知:
Shell功能仅供调试使用,在Debug版本中开启(使用时通过menuconfig在配置项中开启"LOSCFG_DEBUG_VERSION"编译开关进行相关控制),商用产品中禁止包含该功能。
Shell命令开发指导
新增Shell命令的典型开发流程如下:
1.包含如下头文件:
2.注册命令。用户可以选择静态注册命令方式和系统运行时动态注册命令方式,静态注册命令方式一般用在系统常用命令注册,动态注册命令方式一般用在用户命令注册。
1.静态注册命令方式:
1.通过宏的方式注册。 这个宏的原型为:
表1 SHELLCMD_ENTRY参数详解
参数 | 描述 |
l | 静态注册全局变量名(注意:不与系统中其他symbol重名)。 |
cmdType | 命令类型: - CMD_TYPE_EX:不支持标准命令参数输入,会把用户填写的命令关键字屏蔽掉,例如:输入ls /ramfs,传入给注册函数的参数只有/ramfs,而ls命令关键字并不会被传入。 - CMD_TYPE_STD:支持的标准命令参数输入,所有输入的字符都会通过命令解析后被传入。 |
cmdKey | 命令关键字,函数在Shell中访问的名称。 |
paraNum | 调用的执行函数的入参最大个数,暂不支持。 |
cmdHook | 命令执行函数地址,即命令实际执行函数。 |
如:
2.在build/mk/liteos_tables_ldflags.mk中添加相应选项: 如:上述“ls”命令注册时,需在build/mk/liteos_tables_ldflags.mk中添加“-uls_shellcmd”。其中-u后面跟SHELLCMD_ENTRY的第一个参数。
2.动态注册命令方式:
注册函数原型:
表2 UINT32 osCmdReg参数详解
参数 | 描述 |
cmdType | 命令类型: - CMD_TYPE_EX:不支持标准命令参数输入,会把用户填写的命令关键字屏蔽掉,例如:输入ls /ramfs,传入给注册函数的参数只有/ramfs,而ls命令关键字并不会被传入。 - CMD_TYPE_STD:支持的标准命令参数输入,所有输入的字符都会通过命令解析后被传入。 |
cmdKey | 命令关键字,函数在Shell中访问的名称。 |
paraNum | 调用的执行函数的入参最大个数,暂不支持该参数;当前为默认值XARGS(0xFFFFFFFF)。 |
cmdHook | 命令执行函数地址,即命令实际执行函数。 |
如:
说明:
命令关键字必须是唯一的,也即两个不同的命令项不能拥有相同的命令关键字,否则只会执行其中一个。
Shell在执行用户命令时,如果存在多个命令关键字相同的命令,只会执行其中在"help"命令中排序在最前面的一个。
3.添加内置命令函数原型。
表3 osShellCmdLs参数说明
参数 | 参数描述 |
argc | Shell命令中,参数个数。 |
argv | 为指针数组,每个元素指向一个字符串,可以根据选择命令类型,决定是否要把命令关键字传入给注册函数。 |
4.输入Shell命令,有两种输入方式:
- 在串口工具中直接输入Shell命令。
- 在telnet工具中输入Shell命令(telnet使用方式详见telnet)。
Shell命令编程实例
实例描述
在下面的两个例子中,演示如何使用静态注册命令方式和动态注册命令方式新增一个Shell命令:test。
静态注册方式
开发流程如下:
- 定义一个新增命令所要调用的执行函数cmd_test。
- 使用SHELLCMD_ENTRY函数添加新增命令项。
- 在链接选项liteos_tables_ldflags.mk中添加链接该新增命令项参数。
- 重新编译代码后运行。
静态注册编程实例
1.定义命令所要调用的函数cmd_test:
2.新增命令项:
3.在链接选项中添加链接该新增命令项参数: 在liteos_tables_ldflags.mk文件的LITEOS_TABLES_LDFLAGS项下添加-utest_shellcmd。
4.重新编译代码:
5.用help命令查看当前系统所有的注册命令,可以发现test命令已经注册。(以下命令集合仅供参考,以实际编译运行情况为准。)
动态注册方式
开发流程如下:
- 使用osCmdReg函数添加新增命令项。
- 重新编译后运行。
动态注册编程实例
- 在用户应用函数中调用osCmdReg函数动态注册命令。
2.重新编译代码:
3.用help命令查看当前系统所有的注册命令,可以发现test命令已经注册。
