OpenHarmony设备开发 小型系统内核(LiteOS-A) 调测与工具 Shell

zh_ff
发布于 2023-3-27 16:28
浏览
0收藏

版本: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.包含如下头文件:

#include "shell.h"
#include "shcmd.h"

2.注册命令。用户可以选择静态注册命令方式和系统运行时动态注册命令方式,静态注册命令方式一般用在系统常用命令注册,动态注册命令方式一般用在用户命令注册。

1.静态注册命令方式:

1.通过宏的方式注册。 这个宏的原型为:

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的第一个参数。

2.动态注册命令方式:
注册函数原型:

UINT32 osCmdReg(CmdT ype cmdType, CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc)

表2 UINT32 osCmdReg参数详解

参数

描述

cmdType

命令类型:

- CMD_TYPE_EX:不支持标准命令参数输入,会把用户填写的命令关键字屏蔽掉,例如:输入ls  /ramfs,传入给注册函数的参数只有/ramfs,而ls命令关键字并不会被传入。

- CMD_TYPE_STD:支持的标准命令参数输入,所有输入的字符都会通过命令解析后被传入。

cmdKey

命令关键字,函数在Shell中访问的名称。

paraNum

调用的执行函数的入参最大个数,暂不支持该参数;当前为默认值XARGS(0xFFFFFFFF)。

cmdHook

命令执行函数地址,即命令实际执行函数。

如:

osCmdReg(CMD_TYPE_EX, "ls", XARGS,  (CMD_CBK_FUNC)osShellCmdLs)

说明:

 命令关键字必须是唯一的,也即两个不同的命令项不能拥有相同的命令关键字,否则只会执行其中一个。

Shell在执行用户命令时,如果存在多个命令关键字相同的命令,只会执行其中在"help"命令中排序在最前面的一个。

3.添加内置命令函数原型。

UINT32 osShellCmdLs(UINT32 argc,  CHAR **argv)

表3 osShellCmdLs参数说明

参数

参数描述

argc

Shell命令中,参数个数。

argv

为指针数组,每个元素指向一个字符串,可以根据选择命令类型,决定是否要把命令关键字传入给注册函数。

4.输入Shell命令,有两种输入方式:

  • 在串口工具中直接输入Shell命令。
  • 在telnet工具中输入Shell命令(telnet使用方式详见​​telnet​​)。

Shell命令编程实例

实例描述

在下面的两个例子中,演示如何使用静态注册命令方式和动态注册命令方式新增一个Shell命令:test

静态注册方式

开发流程如下:

  1. 定义一个新增命令所要调用的执行函数cmd_test。
  2. 使用SHELLCMD_ENTRY函数添加新增命令项。
  3. 在链接选项liteos_tables_ldflags.mk中添加链接该新增命令项参数。
  4. 重新编译代码后运行。

静态注册编程实例

1.定义命令所要调用的函数cmd_test:

#include "shell.h" 
#include "shcmd.h"  
int cmd_test(void) 
{     
    printf("hello everybody!\n");     
    return 0; 
}

2.新增命令项:

SHELLCMD_ENTRY(test_shellcmd, CMD_TYPE_EX, "test", 0, (CMD_CBK_FUNC)cmd_test);

3.在链接选项中添加链接该新增命令项参数: 在liteos_tables_ldflags.mk文件的LITEOS_TABLES_LDFLAGS项下添加-utest_shellcmd。

4.重新编译代码:

make clean;make

5.用help命令查看当前系统所有的注册命令,可以发现test命令已经注册。(以下命令集合仅供参考,以实际编译运行情况为准。)

OHOS # help
***shell commands:*

arp           cat           cd            chgrp         chmod         chown         cp            cpup          
date          dhclient      dmesg         dns           format        free          help          hwi           
ifconfig      ipdebug       kill          log           ls            lsfd          memcheck      mkdir         
mount         netstat       oom           partinfo      partition     ping          ping6         pwd           
reset         rm            rmdir         sem           statfs        su            swtmr         sync          
systeminfo    task          telnet        test          tftp          touch         umount        uname         
watch         writeproc     

动态注册方式

开发流程如下:

  1. 使用osCmdReg函数添加新增命令项。
  2. 重新编译后运行。

动态注册编程实例

  1. 在用户应用函数中调用osCmdReg函数动态注册命令。

#include "shell.h" 
#include "shcmd.h"  
int cmd_test(void) 
{     
    printf("hello everybody!\n");     
    return 0; 
}  
void app_init(void) 
{      
    ....      
    ....      
    osCmdReg(CMD_TYPE_EX, "test", 0,(CMD_CBK_FUNC)cmd_test);      
    .... 
}

2.重新编译代码:

make clean;make

3.用help命令查看当前系统所有的注册命令,可以发现test命令已经注册。

OHOS # help
***shell commands:*

arp           cat           cd            chgrp         chmod         chown         cp            cpup          
date          dhclient      dmesg         dns           format        free          help          hwi           
ifconfig      ipdebug       kill          log           ls            lsfd          memcheck      mkdir         
mount         netstat       oom           partinfo      partition     ping          ping6         pwd           
reset         rm            rmdir         sem           statfs        su            swtmr         sync          
systeminfo    task          telnet        test          tftp          touch         umount        uname         
watch         writeproc     


文章转载自:​​https://docs.openharmony.cn/pages/v3.2Beta/zh-cn/device-dev/kernel/kernel-small-debug-shell-overview.md/​

已于2023-3-27 16:28:12修改
收藏
回复
举报
回复
    相关推荐