hi3518 openharmony shell命令代码修改 原创
文中相关设备来源于51CTO鸿蒙技术社区【开发板漂流计划】
接上篇
Hi3518鸿蒙编译烧录完美运行
,这次小试牛刀改代码,找一个最简单最直观的地方,那就是shell命令了,根据我的了解shell命令应该属于内核部分,所以去liteos-a内核目录去寻找.
首先找到的路径是aries_code/code-2.0-canary/kernel/liteos_a/apps/shell/src这个目录底下有几个cmd相关文件
简单看了一下,里边的代码有一些tab匹配,命令历史记录相关的,后来发现liteos-a根目录也有一个shell目录
aries_code/code-2.0-canary/kernel/liteos_a/shell/full/src/cmds
把这个目录中的源码简单看了一下,发现了一些有用的打印信息,比如help命令的执行函数OsShellCmdHelp
date命令的执行函数OsShellCmdDate,dmesg命令的执行函数OsShellCmdDmesg,watch命令的执行函数OsShellCmdWatch
如果要自己增加命令的宏调用是SHELLCMD_ENTRY()
下面简单修改点打印,首先把help,命令改一下,help命令的打印也改一下,通过==SHELLCMD_ENTRY==把==helptest==命令注册一下,这个命令的回调处理函数是==OsShellCmdHelp==,回调函数中判断如果有参数打印==Usage: help==,通过==OsCmdInfoGet()==,获取所有支持的命令,也就是下图的显示:
OsCmdInfoGet函数只是返回一个静态的全局变量,由此可见,shell中的命令都是通过注册函数添加到g_cmdInfo变量中,
结构体如下,
typedef struct {
CmdItemNode cmdList;
UINT32 listNum;
UINT32 initMagicFlag;
LosMux muxLock;
CmdVerifyTransID transIdHook;
} CmdModInfo;
CmdItemNode中包含一个链表:
UINT32 OsShellCmdHelp(UINT32 argc, const CHAR **argv)
UINT32 loop = 0;
CmdItemNode
curCmdItem = NULL;
CmdModInfo
cmdInfo = OsCmdInfoGet();
(VOID)argv;
if (argc > 0) {
PRINTK(“\nUsage: help\n”);
return OS_ERROR;
==PRINTK("
openharmony2.0 shell commands:
***
\n");==
LOS_DL_LIST_FOR_EACH_ENTRY(curCmdItem, &(cmdInfo->cmdList.list), CmdItemNode, list) {
if ((loop & (8 - 1)) == 0) { /
8 - 1:just align print */
PRINTK(“\n”);
PRINTK(“%-12s “, curCmdItem->cmd->cmdKey);
loop++;
PRINTK(”\n”);
return 0;
SHELLCMD_ENTRY(help_shellcmd, CMD_TYPE_EX, ==“helptest”==, 0, (CmdCallBackFunc)OsShellCmdHelp);
修改后,验证一下效果,发现输入help命令已经找不到了
输入helptest后,命令找到而且打印信息也变了,说明shell部分代码改对了.
楼主属实是融会贯通了