提交 35fce660 编写于 作者: 鸿蒙内核源码分析's avatar 鸿蒙内核源码分析

Shell的本质是向外界提供一个窗口窥视内核,SHELLCMD_ENTRY(l, cmdType, cmdKey, paraNum, cmdHook)为shell静态注册命令方式

鸿蒙内核源码分析系列 【 CSDN | OSCHINA | WIKI 】
鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓 】四大仓库每日同步更新代码和wiki
项目给鸿蒙内核源码逐行加上中文注解,详细阐述框架和代码细节, 精读 HarmonyOS 内核源码, 将迅速拔高对计算机整体理解,从此高屋建瓴看问题.
上级 40e67ad2
......@@ -537,26 +537,26 @@ void *ShellTask(void *argv)
return NULL;
}
//shell 任务的初始化 参数为shell控制块, shell对内核来说本质就是一个task(线程) ,任务优先级为 9
int ShellTaskInit(ShellCB *shellCB)
{
unsigned int ret;
size_t stackSize = SHELL_TASK_STACKSIZE;
size_t stackSize = SHELL_TASK_STACKSIZE;// 0x3000 = 12K
void *arg = NULL;
pthread_attr_t attr;
pthread_attr_t attr; // posix 线程属性
if (shellCB == NULL) {
return SH_NOK;
}
ret = pthread_attr_init(&attr);
ret = pthread_attr_init(&attr);//posix 线程属性的初始化
if (ret != SH_OK) {
return SH_NOK;
}
pthread_attr_setstacksize(&attr, stackSize);
pthread_attr_setstacksize(&attr, stackSize);//设置线程栈大小
arg = (void *)shellCB;
ret = pthread_create(&shellCB->shellTaskHandle, &attr, &ShellTask, arg);
ret = pthread_create(&shellCB->shellTaskHandle, &attr, &ShellTask, arg);//通过posix创建shell task
if (ret != SH_OK) {
return SH_NOK;
}
......
......@@ -115,7 +115,7 @@ int osShellCmdVirstatfs(int argc, char** argv)
#endif
#if defined(LOSCFG_FS_FAT_VIRTUAL_PARTITION) && defined(LOSCFG_SHELL_CMD_DEBUG)
SHELLCMD_ENTRY(virstatfs_shellcmd, CMD_TYPE_EX, "virstatfs", XARGS, (CmdCallBackFunc)osShellCmdVirstatfs);
SHELLCMD_ENTRY(virstatfs_shellcmd, CMD_TYPE_EX, "virstatfs", XARGS, (CmdCallBackFunc)osShellCmdVirstatfs);//采用shell命令静态注册方式
#endif
SHELLCMD_ENTRY(format_shellcmd, CMD_TYPE_EX, "format", XARGS, (CmdCallBackFunc)osShellCmdFormat);
SHELLCMD_ENTRY(format_shellcmd, CMD_TYPE_EX, "format", XARGS, (CmdCallBackFunc)osShellCmdFormat);//采用shell命令静态注册方式
#endif
......@@ -72,6 +72,6 @@ INT32 osShellCmdPartInfo(INT32 argc, const CHAR **argv)
return LOS_OK;
}
SHELLCMD_ENTRY(partinfo_shellcmd, CMD_TYPE_EX, "partinfo", XARGS, (CmdCallBackFunc)osShellCmdPartInfo);
SHELLCMD_ENTRY(partinfo_shellcmd, CMD_TYPE_EX, "partinfo", XARGS, (CmdCallBackFunc)osShellCmdPartInfo);//采用shell命令静态注册方式
#endif
......@@ -1540,31 +1540,31 @@ int osShellCmdChgrp(int argc, const char **argv)
}
#ifdef LOSCFG_SHELL_CMD_DEBUG
SHELLCMD_ENTRY(lsfd_shellcmd, CMD_TYPE_EX, "lsfd", XARGS, (CmdCallBackFunc)osShellCmdLsfd);
SHELLCMD_ENTRY(lsfd_shellcmd, CMD_TYPE_EX, "lsfd", XARGS, (CmdCallBackFunc)osShellCmdLsfd);//采用shell命令静态注册方式
#if (defined(LOSCFG_FS_FAT) || defined(LOSCFG_FS_RAMFS) || defined(LOSCFG_FS_JFFS))
SHELLCMD_ENTRY(statfs_shellcmd, CMD_TYPE_EX, "statfs", XARGS, (CmdCallBackFunc)osShellCmdStatfs);
SHELLCMD_ENTRY(touch_shellcmd, CMD_TYPE_EX, "touch", XARGS, (CmdCallBackFunc)osShellCmdTouch);
SHELLCMD_ENTRY(statfs_shellcmd, CMD_TYPE_EX, "statfs", XARGS, (CmdCallBackFunc)osShellCmdStatfs);//采用shell命令静态注册方式
SHELLCMD_ENTRY(touch_shellcmd, CMD_TYPE_EX, "touch", XARGS, (CmdCallBackFunc)osShellCmdTouch);//采用shell命令静态注册方式
#endif
#if (defined(LOSCFG_FS_FAT))
SHELLCMD_ENTRY(sync_shellcmd, CMD_TYPE_EX, "sync", XARGS, (CmdCallBackFunc)osShellCmdSync);
SHELLCMD_ENTRY(sync_shellcmd, CMD_TYPE_EX, "sync", XARGS, (CmdCallBackFunc)osShellCmdSync);//采用shell命令静态注册方式
#endif
SHELLCMD_ENTRY(su_shellcmd, CMD_TYPE_EX, "su", XARGS, (CmdCallBackFunc)osShellCmdSu);
SHELLCMD_ENTRY(su_shellcmd, CMD_TYPE_EX, "su", XARGS, (CmdCallBackFunc)osShellCmdSu);//采用shell命令静态注册方式
#endif
SHELLCMD_ENTRY(ls_shellcmd, CMD_TYPE_EX, "ls", XARGS, (CmdCallBackFunc)osShellCmdLs);
SHELLCMD_ENTRY(pwd_shellcmd, CMD_TYPE_EX, "pwd", XARGS, (CmdCallBackFunc)osShellCmdPwd);
SHELLCMD_ENTRY(cd_shellcmd, CMD_TYPE_EX, "cd", XARGS, (CmdCallBackFunc)osShellCmdCd);
SHELLCMD_ENTRY(cat_shellcmd, CMD_TYPE_EX, "cat", XARGS, (CmdCallBackFunc)osShellCmdCat);
SHELLCMD_ENTRY(rm_shellcmd, CMD_TYPE_EX, "rm", XARGS, (CmdCallBackFunc)osShellCmdRm);
SHELLCMD_ENTRY(rmdir_shellcmd, CMD_TYPE_EX, "rmdir", XARGS, (CmdCallBackFunc)osShellCmdRmdir);
SHELLCMD_ENTRY(mkdir_shellcmd, CMD_TYPE_EX, "mkdir", XARGS, (CmdCallBackFunc)osShellCmdMkdir);
SHELLCMD_ENTRY(chmod_shellcmd, CMD_TYPE_EX, "chmod", XARGS, (CmdCallBackFunc)osShellCmdChmod);
SHELLCMD_ENTRY(chown_shellcmd, CMD_TYPE_EX, "chown", XARGS, (CmdCallBackFunc)osShellCmdChown);
SHELLCMD_ENTRY(chgrp_shellcmd, CMD_TYPE_EX, "chgrp", XARGS, (CmdCallBackFunc)osShellCmdChgrp);
SHELLCMD_ENTRY(ls_shellcmd, CMD_TYPE_EX, "ls", XARGS, (CmdCallBackFunc)osShellCmdLs);//采用shell命令静态注册方式
SHELLCMD_ENTRY(pwd_shellcmd, CMD_TYPE_EX, "pwd", XARGS, (CmdCallBackFunc)osShellCmdPwd);//采用shell命令静态注册方式
SHELLCMD_ENTRY(cd_shellcmd, CMD_TYPE_EX, "cd", XARGS, (CmdCallBackFunc)osShellCmdCd);//采用shell命令静态注册方式
SHELLCMD_ENTRY(cat_shellcmd, CMD_TYPE_EX, "cat", XARGS, (CmdCallBackFunc)osShellCmdCat);//采用shell命令静态注册方式
SHELLCMD_ENTRY(rm_shellcmd, CMD_TYPE_EX, "rm", XARGS, (CmdCallBackFunc)osShellCmdRm);//采用shell命令静态注册方式
SHELLCMD_ENTRY(rmdir_shellcmd, CMD_TYPE_EX, "rmdir", XARGS, (CmdCallBackFunc)osShellCmdRmdir);//采用shell命令静态注册方式
SHELLCMD_ENTRY(mkdir_shellcmd, CMD_TYPE_EX, "mkdir", XARGS, (CmdCallBackFunc)osShellCmdMkdir);//采用shell命令静态注册方式
SHELLCMD_ENTRY(chmod_shellcmd, CMD_TYPE_EX, "chmod", XARGS, (CmdCallBackFunc)osShellCmdChmod);//采用shell命令静态注册方式
SHELLCMD_ENTRY(chown_shellcmd, CMD_TYPE_EX, "chown", XARGS, (CmdCallBackFunc)osShellCmdChown);//采用shell命令静态注册方式
SHELLCMD_ENTRY(chgrp_shellcmd, CMD_TYPE_EX, "chgrp", XARGS, (CmdCallBackFunc)osShellCmdChgrp);//采用shell命令静态注册方式
#if (defined(LOSCFG_FS_FAT) || defined(LOSCFG_FS_RAMFS) || defined(LOSCFG_FS_JFFS))
SHELLCMD_ENTRY(mount_shellcmd, CMD_TYPE_EX, "mount", XARGS, (CmdCallBackFunc)osShellCmdMount);
SHELLCMD_ENTRY(umount_shellcmd, CMD_TYPE_EX, "umount", XARGS, (CmdCallBackFunc)osShellCmdUmount);
SHELLCMD_ENTRY(mount_shellcmd, CMD_TYPE_EX, "mount", XARGS, (CmdCallBackFunc)osShellCmdMount);//采用shell命令静态注册方式
SHELLCMD_ENTRY(umount_shellcmd, CMD_TYPE_EX, "umount", XARGS, (CmdCallBackFunc)osShellCmdUmount);//采用shell命令静态注册方式
#endif
#if (defined(LOSCFG_FS_FAT) || defined(LOSCFG_FS_RAMFS) || defined(LOSCFG_FS_JFFS))
SHELLCMD_ENTRY(cp_shellcmd, CMD_TYPE_EX, "cp", XARGS, (CmdCallBackFunc)osShellCmdCp);
SHELLCMD_ENTRY(cp_shellcmd, CMD_TYPE_EX, "cp", XARGS, (CmdCallBackFunc)osShellCmdCp);//采用shell命令静态注册方式
#endif
#endif
......@@ -197,7 +197,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdQueueInfoGet(UINT32 argc, const CHAR **a
return LOS_OK;
}
SHELLCMD_ENTRY(queue_shellcmd, CMD_TYPE_EX, "queue", 0, (CmdCallBackFunc)OsShellCmdQueueInfoGet);
SHELLCMD_ENTRY(queue_shellcmd, CMD_TYPE_EX, "queue", 0, (CmdCallBackFunc)OsShellCmdQueueInfoGet);//采用shell命令静态注册方式
#endif /* LOSCFG_SHELL */
#endif /* LOSCFG_DEBUG_QUEUE */
......
......@@ -301,7 +301,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdSemInfoGet(UINT32 argc, const CHAR **arg
return ret;
}
SHELLCMD_ENTRY(sem_shellcmd, CMD_TYPE_EX, "sem", 1, (CmdCallBackFunc)OsShellCmdSemInfoGet);
SHELLCMD_ENTRY(sem_shellcmd, CMD_TYPE_EX, "sem", 1, (CmdCallBackFunc)OsShellCmdSemInfoGet);//采用shell命令静态注册方式
#endif
#ifdef __cplusplus
......
......@@ -88,6 +88,6 @@ ERROR:
}
#ifdef LOSCFG_SHELL
SHELLCMD_ENTRY(kill_shellcmd, CMD_TYPE_EX, "kill", 2, (CmdCallBackFunc)OsShellCmdKill);
SHELLCMD_ENTRY(kill_shellcmd, CMD_TYPE_EX, "kill", 2, (CmdCallBackFunc)OsShellCmdKill);//采用shell命令静态注册方式
#endif
......@@ -142,5 +142,5 @@ VOID OsStackInit(VOID *stacktop, UINT32 stacksize)
}
#ifdef LOSCFG_SHELL_CMD_DEBUG
SHELLCMD_ENTRY(stack_shellcmd, CMD_TYPE_EX, "stack", 1, (CmdCallBackFunc)OsExcStackInfo);
SHELLCMD_ENTRY(stack_shellcmd, CMD_TYPE_EX, "stack", 1, (CmdCallBackFunc)OsExcStackInfo);//采用shell命令静态注册方式
#endif
......@@ -318,21 +318,21 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMemRecordDisable(INT32 argc, const CHAR
}
SHELLCMD_ENTRY(memshowenable_shellcmd, CMD_TYPE_EX, "memshowenable", 0,
(CmdCallBackFunc)OsShellCmdMemRecordEnable);
(CmdCallBackFunc)OsShellCmdMemRecordEnable);//采用shell命令静态注册方式
SHELLCMD_ENTRY(memshowdisable_shellcmd, CMD_TYPE_EX, "memshowdisable", 0,
(CmdCallBackFunc)OsShellCmdMemRecordDisable);
(CmdCallBackFunc)OsShellCmdMemRecordDisable);//采用shell命令静态注册方式
#endif
#ifdef LOSCFG_MEM_LEAKCHECK
SHELLCMD_ENTRY(memused_shellcmd, CMD_TYPE_EX, "memused", 0, (CmdCallBackFunc)OsShellCmdMemUsed);
SHELLCMD_ENTRY(memused_shellcmd, CMD_TYPE_EX, "memused", 0, (CmdCallBackFunc)OsShellCmdMemUsed);//采用shell命令静态注册方式
#endif
#ifdef LOSCFG_SHELL_CMD_DEBUG
SHELLCMD_ENTRY(memcheck_shellcmd, CMD_TYPE_EX, "memcheck", 0, (CmdCallBackFunc)OsShellCmdMemCheck);
SHELLCMD_ENTRY(readreg_shellcmd, CMD_TYPE_EX, "readreg", MEMPT_ARG_NUM_2, (CmdCallBackFunc)OsShellCmdMemRead);
SHELLCMD_ENTRY(memcheck_shellcmd, CMD_TYPE_EX, "memcheck", 0, (CmdCallBackFunc)OsShellCmdMemCheck);//采用shell命令静态注册方式
SHELLCMD_ENTRY(readreg_shellcmd, CMD_TYPE_EX, "readreg", MEMPT_ARG_NUM_2, (CmdCallBackFunc)OsShellCmdMemRead);//采用shell命令静态注册方式
#endif
SHELLCMD_ENTRY(free_shellcmd, CMD_TYPE_EX, "free", XARGS, (CmdCallBackFunc)OsShellCmdFree);
SHELLCMD_ENTRY(uname_shellcmd, CMD_TYPE_EX, "uname", XARGS, (CmdCallBackFunc)OsShellCmdUname);
SHELLCMD_ENTRY(free_shellcmd, CMD_TYPE_EX, "free", XARGS, (CmdCallBackFunc)OsShellCmdFree);//采用shell命令静态注册方式
SHELLCMD_ENTRY(uname_shellcmd, CMD_TYPE_EX, "uname", XARGS, (CmdCallBackFunc)OsShellCmdUname);//采用shell命令静态注册方式
#endif
#ifdef __cplusplus
......
......@@ -137,7 +137,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdSwtmrInfoGet(INT32 argc, const UINT8 **a
return LOS_OK;
}
SHELLCMD_ENTRY(swtmr_shellcmd, CMD_TYPE_EX, "swtmr", 1, (CmdCallBackFunc)OsShellCmdSwtmrInfoGet);
SHELLCMD_ENTRY(swtmr_shellcmd, CMD_TYPE_EX, "swtmr", 1, (CmdCallBackFunc)OsShellCmdSwtmrInfoGet);//采用shell命令静态注册方式
#ifdef __cplusplus
#if __cplusplus
......
......@@ -491,7 +491,7 @@ TASK_HELP:
}
#ifdef LOSCFG_SHELL
SHELLCMD_ENTRY(task_shellcmd, CMD_TYPE_EX, "task", 1, (CmdCallBackFunc)OsShellCmdDumpTask);
SHELLCMD_ENTRY(task_shellcmd, CMD_TYPE_EX, "task", 1, (CmdCallBackFunc)OsShellCmdDumpTask);//采用shell命令静态注册方式
#endif
#ifdef __cplusplus
......
......@@ -249,13 +249,13 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdOom(INT32 argc, const CHAR *argv[])
}
#ifdef LOSCFG_SHELL_CMD_DEBUG
SHELLCMD_ENTRY(oom_shellcmd, CMD_TYPE_SHOW, OOM_CMD, 2, (CmdCallBackFunc)OsShellCmdOom);
SHELLCMD_ENTRY(vm_shellcmd, CMD_TYPE_SHOW, VMM_CMD, 1, (CmdCallBackFunc)OsShellCmdDumpVm);
SHELLCMD_ENTRY(v2p_shellcmd, CMD_TYPE_SHOW, VMM_PMM_CMD, 1, (CmdCallBackFunc)OsShellCmdV2P);
SHELLCMD_ENTRY(oom_shellcmd, CMD_TYPE_SHOW, OOM_CMD, 2, (CmdCallBackFunc)OsShellCmdOom);//采用shell命令静态注册方式
SHELLCMD_ENTRY(vm_shellcmd, CMD_TYPE_SHOW, VMM_CMD, 1, (CmdCallBackFunc)OsShellCmdDumpVm);//采用shell命令静态注册方式
SHELLCMD_ENTRY(v2p_shellcmd, CMD_TYPE_SHOW, VMM_PMM_CMD, 1, (CmdCallBackFunc)OsShellCmdV2P);//采用shell命令静态注册方式
#endif
#ifdef LOSCFG_SHELL
SHELLCMD_ENTRY(pmm_shellcmd, CMD_TYPE_SHOW, "pmm", 0, (CmdCallBackFunc)OsShellCmdDumpPmm);
SHELLCMD_ENTRY(pmm_shellcmd, CMD_TYPE_SHOW, "pmm", 0, (CmdCallBackFunc)OsShellCmdDumpPmm);//采用shell命令静态注册方式
#endif
#ifdef __cplusplus
......
......@@ -43,12 +43,12 @@
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
//若开关LOSCFG_CPUP_INCLUDE_IRQ打开,则还会显示各个中断的处理时间(cycles)、CPU占用率以及中断类型。
#ifdef LOSCFG_CPUP_INCLUDE_IRQ
STATIC CPUP_INFO_S g_hwiCpupAll[OS_HWI_MAX_NUM];
STATIC CPUP_INFO_S g_hwiCpup10s[OS_HWI_MAX_NUM];
STATIC CPUP_INFO_S g_hwiCpup1s[OS_HWI_MAX_NUM];
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv)
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv)//hwi命令查询当前中断信息
{
UINT32 i;
UINT32 intSave;
......@@ -101,7 +101,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv)
return 0;
}
#else
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv)
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv) //hwi命令查询当前中断信息
{
UINT32 i;
......@@ -113,18 +113,18 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdHwi(INT32 argc, const CHAR **argv)
PRINTK(" InterruptNo Count Name\n");
for (i = OS_HWI_FORM_EXC_NUM; i < OS_HWI_MAX_NUM + OS_HWI_FORM_EXC_NUM; i++) {
/* Different cores has different hwi form implementation */
if (HWI_IS_REGISTED(i) && (OsGetHwiFormName(i) != NULL)) {
PRINTK(" %8d:%10d: %-s\n", i, OsGetHwiFormCnt(i), OsGetHwiFormName(i));
/* Different cores has different hwi form implementation */ //不同的核心有不同的硬件形式实现
if (HWI_IS_REGISTED(i) && (OsGetHwiFormName(i) != NULL)) {//中断是否注册且是否有名称
PRINTK(" %8d:%10d: %-s\n", i, OsGetHwiFormCnt(i), OsGetHwiFormName(i));//中断号,中断次数,注册中断名称。
} else if (HWI_IS_REGISTED(i)) {
PRINTK(" %8d:%10d:\n", i, OsGetHwiFormCnt(i));
PRINTK(" %8d:%10d:\n", i, OsGetHwiFormCnt(i));//中断次数
}
}
return 0;
}
#endif
SHELLCMD_ENTRY(hwi_shellcmd, CMD_TYPE_EX, "hwi", 0, (CmdCallBackFunc)OsShellCmdHwi);
SHELLCMD_ENTRY(hwi_shellcmd, CMD_TYPE_EX, "hwi", 0, (CmdCallBackFunc)OsShellCmdHwi);//采用shell命令静态注册方式
#ifdef __cplusplus
#if __cplusplus
......
......@@ -140,7 +140,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdCpup(INT32 argc, const CHAR **argv)
return LOS_OK;
}
SHELLCMD_ENTRY(cpup_shellcmd, CMD_TYPE_EX, "cpup", XARGS, (CmdCallBackFunc)OsShellCmdCpup);
SHELLCMD_ENTRY(cpup_shellcmd, CMD_TYPE_EX, "cpup", XARGS, (CmdCallBackFunc)OsShellCmdCpup);//采用shell命令静态注册方式
#ifdef __cplusplus
#if __cplusplus
}
......
......@@ -224,7 +224,7 @@ typedef int STATUS_T;
#define LOSBLD_ATTRIB_ALIGN(__align__) __attribute__((aligned(__align__)))
#endif
/* Assign a defined variable to a specific section */
/* Assign a defined variable to a specific section */ //将定义的变量分配给特定的节
#if !defined(LOSBLD_ATTRIB_SECTION)
#define LOSBLD_ATTRIB_SECTION(__sect__) __attribute__((section(__sect__)))
#endif
......
......@@ -1138,7 +1138,7 @@ ifconfig_error:
}
#ifdef LOSCFG_SHELL
SHELLCMD_ENTRY(ifconfig_shellcmd, CMD_TYPE_EX, "ifconfig", XARGS, (CmdCallBackFunc)lwip_ifconfig);
SHELLCMD_ENTRY(ifconfig_shellcmd, CMD_TYPE_EX, "ifconfig", XARGS, (CmdCallBackFunc)lwip_ifconfig);//采用shell命令静态注册方式
#endif /* LOSCFG_SHELL */
/* add arp entry to arp cache */
#define ARP_OPTION_ADD 1
......@@ -1472,7 +1472,7 @@ arp_error:
}
#ifdef LOSCFG_SHELL_CMD_DEBUG
SHELLCMD_ENTRY(arp_shellcmd, CMD_TYPE_EX, "arp", 1, (CmdCallBackFunc)lwip_arp);
SHELLCMD_ENTRY(arp_shellcmd, CMD_TYPE_EX, "arp", 1, (CmdCallBackFunc)lwip_arp);//采用shell命令静态注册方式
#endif /* LOSCFG_SHELL_CMD_DEBUG */
void ifup_internal(void *arg)
......@@ -1915,7 +1915,7 @@ ping_error:
return LOS_NOK;
}
#ifdef LOSCFG_SHELL
SHELLCMD_ENTRY(ping_shellcmd, CMD_TYPE_EX, "ping", XARGS, (CmdCallBackFunc)osShellPing);
SHELLCMD_ENTRY(ping_shellcmd, CMD_TYPE_EX, "ping", XARGS, (CmdCallBackFunc)osShellPing);//采用shell命令静态注册方式
#endif /* LOSCFG_SHELL */
#else /* LWIP_EXT_POLL_SUPPORT*/
......@@ -2068,7 +2068,7 @@ FAILURE:
}
#ifdef LOSCFG_SHELL
SHELLCMD_ENTRY(ping_shellcmd, CMD_TYPE_EX, "ping", XARGS, (CmdCallBackFunc)osShellPing);
SHELLCMD_ENTRY(ping_shellcmd, CMD_TYPE_EX, "ping", XARGS, (CmdCallBackFunc)osShellPing);//采用shell命令静态注册方式
#endif /* LOSCFG_SHELL */
#endif /* LWIP_EXT_POLL_SUPPORT*/
......@@ -2577,7 +2577,7 @@ LWIP_STATIC const char *convert_icmpv6_err_to_string(u8_t err_type)
}
#ifdef LOSCFG_SHELL_CMD_DEBUG
SHELLCMD_ENTRY(ping6_shellcmd, CMD_TYPE_EX, "ping6", XARGS, (CmdCallBackFunc)osShellPing6);
SHELLCMD_ENTRY(ping6_shellcmd, CMD_TYPE_EX, "ping6", XARGS, (CmdCallBackFunc)osShellPing6);//采用shell命令静态注册方式
#endif /* LOSCFG_SHELL_CMD_DEBUG */
#endif /* LWIP_IPV6 */
......@@ -2621,7 +2621,7 @@ usage:
}
#ifdef LOSCFG_SHELL_CMD_DEBUG
SHELLCMD_ENTRY(ntpdate_shellcmd, CMD_TYPE_EX, "ntpdate", XARGS, (CmdCallBackFunc)osShellNtpdate);
SHELLCMD_ENTRY(ntpdate_shellcmd, CMD_TYPE_EX, "ntpdate", XARGS, (CmdCallBackFunc)osShellNtpdate);//采用shell命令静态注册方式
#endif /* LOSCFG_SHELL_CMD_DEBUG */
#endif /* LWIP_SNTP*/
......@@ -2741,7 +2741,7 @@ usage:
return LOS_NOK;
}
#ifdef LOSCFG_SHELL_CMD_DEBUG
SHELLCMD_ENTRY(tftp_shellcmd, CMD_TYPE_EX, "tftp", XARGS, (CmdCallBackFunc)osShellTftp);
SHELLCMD_ENTRY(tftp_shellcmd, CMD_TYPE_EX, "tftp", XARGS, (CmdCallBackFunc)osShellTftp);//采用shell命令静态注册方式
#endif /* LOSCFG_SHELL_CMD_DEBUG */
#endif /* LOSCFG_NET_LWIP_SACK_TFTP */
......@@ -2815,7 +2815,7 @@ usage:
}
#ifdef LOSCFG_SHELL_CMD_DEBUG
SHELLCMD_ENTRY(dns_shellcmd, CMD_TYPE_EX, "dns", XARGS, (CmdCallBackFunc)osShellDns);
SHELLCMD_ENTRY(dns_shellcmd, CMD_TYPE_EX, "dns", XARGS, (CmdCallBackFunc)osShellDns);//采用shell命令静态注册方式
#endif /* LOSCFG_SHELL_CMD_DEBUG */
#endif /* LWIP_DNS */
#if LWIP_IPV6
......@@ -3490,7 +3490,7 @@ err_hand:
return LOS_NOK;
}
#ifdef LOSCFG_SHELL
SHELLCMD_ENTRY(netstat_shellcmd, CMD_TYPE_EX, "netstat", XARGS, (CmdCallBackFunc)osShellNetstat);
SHELLCMD_ENTRY(netstat_shellcmd, CMD_TYPE_EX, "netstat", XARGS, (CmdCallBackFunc)osShellNetstat);//采用shell命令静态注册方式
#endif /* LOSCFG_SHELL */
#define NETIF_NAME_LEN 10
......@@ -3540,7 +3540,7 @@ u32_t OsShellDhclient(int argc, const char **argv)
}
#ifdef LOSCFG_SHELL
SHELLCMD_ENTRY(dhclient_shellcmd, CMD_TYPE_EX, "dhclient", XARGS, (CmdCallBackFunc)OsShellDhclient);
SHELLCMD_ENTRY(dhclient_shellcmd, CMD_TYPE_EX, "dhclient", XARGS, (CmdCallBackFunc)OsShellDhclient);//采用shell命令静态注册方式
#endif /* LOSCFG_SHELL */
#ifdef LWIP_DEBUG_TCPSERVER
......@@ -3658,7 +3658,7 @@ u32_t osTcpserver(int argc, const char **argv)
}
#ifdef LOSCFG_SHELL_CMD_DEBUG
SHELLCMD_ENTRY(tcpserver_shellcmd, CMD_TYPE_EX, "tcpserver", XARGS, (CmdCallBackFunc)osTcpserver);
SHELLCMD_ENTRY(tcpserver_shellcmd, CMD_TYPE_EX, "tcpserver", XARGS, (CmdCallBackFunc)osTcpserver);//采用shell命令静态注册方式
#endif /* LOSCFG_SHELL_CMD_DEBUG */
#endif /* LWIP_DEBUG_TCPSERVER */
......@@ -3733,7 +3733,7 @@ void udpserver(int argc, const char **argv)
}
#ifdef LOSCFG_SHELL_CMD_DEBUG
SHELLCMD_ENTRY(udpserver_shellcmd, CMD_TYPE_EX, "udpserver", XARGS, (CmdCallBackFunc)udpserver);
SHELLCMD_ENTRY(udpserver_shellcmd, CMD_TYPE_EX, "udpserver", XARGS, (CmdCallBackFunc)udpserver);//采用shell命令静态注册方式
#endif /* LOSCFG_SHELL_CMD_DEBUG */
#endif /* LWIP_DEBUG_UDPSERVER */
......@@ -3854,7 +3854,7 @@ usage_sock:
#endif /* LWIP_DEBUG_INFO */
#if defined(LOSCFG_SHELL_CMD_DEBUG) && defined(LWIP_DEBUG_INFO)
SHELLCMD_ENTRY(netdebug_shellcmd, CMD_TYPE_EX, "netdebug", XARGS, (CmdCallBackFunc)osShellNetDebug);
SHELLCMD_ENTRY(netdebug_shellcmd, CMD_TYPE_EX, "netdebug", XARGS, (CmdCallBackFunc)osShellNetDebug);//采用shell命令静态注册方式
#endif /* LOSCFG_SHELL_CMD_DEBUG && LWIP_DEBUG_INFO */
u32_t osShellIpDebug(int argc, const char **argv)
......@@ -3984,7 +3984,7 @@ exit:
}
#ifdef LOSCFG_SHELL_CMD_DEBUG
SHELLCMD_ENTRY(ipdebug_shellcmd, CMD_TYPE_EX, "ipdebug", XARGS, (CmdCallBackFunc)osShellIpDebug);
SHELLCMD_ENTRY(ipdebug_shellcmd, CMD_TYPE_EX, "ipdebug", XARGS, (CmdCallBackFunc)osShellIpDebug);//采用shell命令静态注册方式
#endif
#ifdef LWIP_TESTBED
extern void cmd_reset(void);
......@@ -3995,7 +3995,7 @@ void osShellReboot(int argc, const char **argv)
}
#ifdef LOSCFG_SHELL_CMD_DEBUG
SHELLCMD_ENTRY(reboot_shellcmd, CMD_TYPE_EX, "reboot", XARGS, (CmdCallBackFunc)osShellReboot);
SHELLCMD_ENTRY(reboot_shellcmd, CMD_TYPE_EX, "reboot", XARGS, (CmdCallBackFunc)osShellReboot);//采用shell命令静态注册方式
#endif /* LOSCFG_SHELL_CMD_DEBUG */
#endif
......
......@@ -583,7 +583,7 @@ INT32 TelnetCmd(UINT32 argc, const CHAR **argv)
}
#ifdef LOSCFG_SHELL_CMD_DEBUG
SHELLCMD_ENTRY(telnet_shellcmd, CMD_TYPE_EX, "telnet", 1, (CmdCallBackFunc)TelnetCmd);
SHELLCMD_ENTRY(telnet_shellcmd, CMD_TYPE_EX, "telnet", 1, (CmdCallBackFunc)TelnetCmd);//采用shell命令静态注册方式
#endif /* LOSCFG_SHELL_CMD_DEBUG */
#endif
......
......@@ -50,25 +50,25 @@ extern "C" {
typedef BOOL (*CmdVerifyTransID)(UINT32 transID);
typedef struct {
CmdType cmdType;
const CHAR *cmdKey;
UINT32 paraNum;
CmdCallBackFunc cmdHook;
} CmdItem;
typedef struct { //cmd的条目项
CmdType cmdType; //命令类型
const CHAR *cmdKey; //命令关键字,函数在Shell中访问的名称。
UINT32 paraNum; //调用的执行函数的入参最大个数,鸿蒙暂不支持。
CmdCallBackFunc cmdHook; //命令执行函数地址,即命令实际执行函数。
} CmdItem;
typedef struct {
typedef struct {//cmd的条目项节点,增加一幅挂钩,让item挂在一起
LOS_DL_LIST list;
CmdItem *cmd;
} CmdItemNode;
/* global info for shell module */
/* global info for shell module */ //全局shell信息模块 对应全局变量 g_cmdInfo
typedef struct {
CmdItemNode cmdList;
UINT32 listNum;
UINT32 initMagicFlag;
LosMux muxLock;
CmdVerifyTransID transIdHook;
CmdItemNode cmdList; //所有item将挂在上面
UINT32 listNum; //item数量
UINT32 initMagicFlag; //初始化时魔法数字
LosMux muxLock; //互斥锁
CmdVerifyTransID transIdHook;// @note_why 验证转换ID的函数地址, 尚未清楚是干什么用的,看懂了的请私信我完善.
} CmdModInfo;
typedef struct {
......@@ -77,6 +77,30 @@ typedef struct {
CHAR cmdString[0];
} CmdKeyLink;
/****************************************************************
* Shell 注册命令。用户可以选择静态注册命令方式和系统运行时动态注册命令方式,
----------------------------------------------------------------------------------------
* 第一种:静态注册命令方式一般用在系统常用命令注册,动态注册命令方式一般用在用户命令注册。
* SHELLCMD_ENTRY(watch_shellcmd, CMD_TYPE_EX, "watch", XARGS, (CmdCallBackFunc)OsShellCmdWatch);
* 静态注册命令方式.通过宏的方式注册
* 参数:
* l: 静态注册全局变量名(注意:不与系统中其他symbol重名)。
* cmdType: 命令类型
* cmdKey: 命令关键字,函数在Shell中访问的名称。
* paraNum: 调用的执行函数的入参最大个数,暂不支持。
* cmdHook: 命令执行函数地址,即命令实际执行函数。
* 在build/mk/liteos_tables_ldflags.mk中添加相应选项:
* 如:上述“watch”命令注册时,需在build/mk/liteos_tables_ldflags.mk中添加“-uwatch_shellcmd”。
* 其中-u后面跟SHELLCMD_ENTRY的第一个参数。
----------------------------------------------------------------------------------------
* 第二种:.动态注册命令方式:
* 注册函数原型:
* UINT32 osCmdReg(CmdT ype cmdType, CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc)
----------------------------------------------------------------------------------------
* 输入Shell命令,有两种输入方式:
* 在串口工具中直接输入Shell命令。
* 在telnet工具中输入Shell命令
****************************************************************/
#define SHELLCMD_ENTRY(l, cmdType, cmdKey, paraNum, cmdHook) \
CmdItem l LOS_HAL_TABLE_ENTRY(shellcmd) = { \
cmdType, \
......
......@@ -50,7 +50,7 @@ extern "C" {
typedef UINT32 (*FUNC_ONE_TOKEN)(VOID *ctx, UINT32 index, CHAR *token);
/*
* Description: the info struct after cmd parser
* Description: the info struct after cmd parser //通过解析之后的结构体
*/
typedef struct {
UINT32 paramCnt; /* count of para */
......
......@@ -84,9 +84,9 @@ extern "C" {
#define QUOTES_STATUS_OPEN(qu) ((qu) == TRUE)
typedef struct {
UINT32 consoleID;
UINT32 shellTaskHandle;
UINT32 shellEntryHandle;
UINT32 consoleID; //控制台ID
UINT32 shellTaskHandle; //shell task 的入口函数,这是用于创建 task时指定,类似 应用程序的main函数
UINT32 shellEntryHandle;
VOID *cmdKeyLink;
VOID *cmdHistoryKeyLink;
VOID *cmdMaskKeyLink;
......@@ -99,11 +99,11 @@ typedef struct {
CHAR shellWorkingDirectory[PATH_MAX];
} ShellCB;
/* All support cmd types */
/* All support cmd types *///所有支持的 CMD 类型
typedef enum {
CMD_TYPE_SHOW = 0,
CMD_TYPE_STD = 1,
CMD_TYPE_EX = 2,
CMD_TYPE_STD = 1, //支持的标准命令参数输入,所有输入的字符都会通过命令解析后被传入
CMD_TYPE_EX = 2, //不支持标准命令参数输入,会把用户填写的命令关键字屏蔽掉,例如:输入ls /ramfs,传入给注册函数的参数只有/ramfs,而ls命令关键字并不会被传入。
CMD_TYPE_BUTT
} CmdType;
......@@ -116,16 +116,16 @@ typedef enum {
} CmdKeyDirection;
/*
* Hook for user-defined debug function
* Hook for user-defined debug function //用户定义的调试函数的钩子,统一不同模块的函数进行注册
* Unify differnt module's func for registration
*/
typedef UINT32 (*CmdCallBackFunc)(UINT32 argc, const CHAR **argv);
typedef UINT32 (*CmdCallBackFunc)(UINT32 argc, const CHAR **argv);//shell 对应命令 的处理函数
/* External interface, need reserved */
typedef CmdCallBackFunc CMD_CBK_FUNC;
typedef CmdType CMD_TYPE_E;
extern UINT32 osCmdReg(CmdType cmdType, const CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc);
extern UINT32 osCmdReg(CmdType cmdType, const CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc);//shell 动态命令注册
#ifdef __cplusplus
#if __cplusplus
......
......@@ -694,7 +694,7 @@ LITE_OS_SEC_TEXT_MINOR VOID OsShellCmdPush(const CHAR *string, CmdKeyLink *cmdKe
return;
}
//显示命令的历史记录
LITE_OS_SEC_TEXT_MINOR VOID OsShellHistoryShow(UINT32 value, ShellCB *shellCB)
{
CmdKeyLink *cmdtmp = NULL;
......@@ -740,7 +740,7 @@ END:
(VOID)pthread_mutex_unlock(&shellCB->historyMutex);
return;
}
//运行CMD命令 比如telnet输入 hwi ,先要经过解释,再找到hwi对应的处理函数去执行
LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdExec(CmdParsed *cmdParsed, CHAR *cmdStr)
{
UINT32 ret;
......@@ -754,27 +754,27 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdExec(CmdParsed *cmdParsed, CHAR *cmdStr)
}
ret = OsCmdParse(cmdStr, cmdParsed);
if (ret != LOS_OK) {
if (ret != LOS_OK) {//解析错误,命令输错了.
goto OUT;
}
LOS_DL_LIST_FOR_EACH_ENTRY(curCmdItem, &(g_cmdInfo.cmdList.list), CmdItemNode, list) {
LOS_DL_LIST_FOR_EACH_ENTRY(curCmdItem, &(g_cmdInfo.cmdList.list), CmdItemNode, list) {//遍历全局cmd链表
cmdKey = curCmdItem->cmd->cmdKey;
if ((cmdParsed->cmdType == curCmdItem->cmd->cmdType) &&
(strlen(cmdKey) == strlen(cmdParsed->cmdKeyword)) &&
(strncmp(cmdKey, (CHAR *)(cmdParsed->cmdKeyword), strlen(cmdKey)) == 0)) {
cmdHook = curCmdItem->cmd->cmdHook;
(strncmp(cmdKey, (CHAR *)(cmdParsed->cmdKeyword), strlen(cmdKey)) == 0)) {//找到对应的命令
cmdHook = curCmdItem->cmd->cmdHook;//拿到回调函数
break;
}
}
ret = OS_ERROR;
if (cmdHook != NULL) {
ret = (cmdHook)(cmdParsed->paramCnt, (const CHAR **)cmdParsed->paramArray);
ret = (cmdHook)(cmdParsed->paramCnt, (const CHAR **)cmdParsed->paramArray);//执行回调函数 hook,类似于设计模式中的观察者模式
}
OUT:
for (i = 0; i < cmdParsed->paramCnt; i++) {
for (i = 0; i < cmdParsed->paramCnt; i++) {//命令执行完了善后处理
if (cmdParsed->paramArray[i] != NULL) {
(VOID)LOS_MemFree(m_aucSysMem0, cmdParsed->paramArray[i]);
cmdParsed->paramArray[i] = NULL;
......@@ -783,59 +783,60 @@ OUT:
return (UINT32)ret;
}
//初始化 cmd 模块
LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdInit(VOID)
{
UINT32 ret;
LOS_ListInit(&(g_cmdInfo.cmdList.list));
g_cmdInfo.listNum = 0;
g_cmdInfo.initMagicFlag = SHELL_INIT_MAGIC_FLAG;
ret = LOS_MuxInit(&g_cmdInfo.muxLock, NULL);
LOS_ListInit(&(g_cmdInfo.cmdList.list));//初始化链表
g_cmdInfo.listNum = 0;//CMD总数量
g_cmdInfo.initMagicFlag = SHELL_INIT_MAGIC_FLAG;//魔法数字,用于判断是否初始化过 0xABABABAB ,还记得栈区内容的魔法数字是多少吗? 是0xCBCBCBCB
ret = LOS_MuxInit(&g_cmdInfo.muxLock, NULL);//互斥锁初始化
if (ret != LOS_OK) {
PRINT_ERR("Create mutex for shell cmd info failed\n");
return OS_ERROR;
}
return LOS_OK;
}
//创建一个cmd 命令,采用动态方式,又 osCmdReg 调用
//静态方式创建为 SHELLCMD_ENTRY(oom_shellcmd, CMD_TYPE_SHOW, OOM_CMD, 2, (CmdCallBackFunc)OsShellCmdOom);
STATIC UINT32 OsCmdItemCreate(CmdType cmdType, const CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc)
{
CmdItem *cmdItem = NULL;
CmdItemNode *cmdItemNode = NULL;
cmdItem = (CmdItem *)LOS_MemAlloc(m_aucSysMem0, sizeof(CmdItem));
cmdItem = (CmdItem *)LOS_MemAlloc(m_aucSysMem0, sizeof(CmdItem));//分配一个item
if (cmdItem == NULL) {
return OS_ERRNO_SHELL_CMDREG_MEMALLOC_ERROR;
}
(VOID)memset_s(cmdItem, sizeof(CmdItem), '\0', sizeof(CmdItem));
(VOID)memset_s(cmdItem, sizeof(CmdItem), '\0', sizeof(CmdItem));//内存块数据清0
cmdItemNode = (CmdItemNode *)LOS_MemAlloc(m_aucSysMem0, sizeof(CmdItemNode));
if (cmdItemNode == NULL) {
(VOID)LOS_MemFree(m_aucSysMem0, cmdItem);
cmdItemNode = (CmdItemNode *)LOS_MemAlloc(m_aucSysMem0, sizeof(CmdItemNode));//分配一个itemNode
if (cmdItemNode == NULL) { //申请失败
(VOID)LOS_MemFree(m_aucSysMem0, cmdItem);//释放之前申请的内存
return OS_ERRNO_SHELL_CMDREG_MEMALLOC_ERROR;
}
(VOID)memset_s(cmdItemNode, sizeof(CmdItemNode), '\0', sizeof(CmdItemNode));
cmdItemNode->cmd = cmdItem;
(VOID)memset_s(cmdItemNode, sizeof(CmdItemNode), '\0', sizeof(CmdItemNode));//内存块数据清0
cmdItemNode->cmd = cmdItem;
cmdItemNode->cmd->cmdHook = cmdProc;
cmdItemNode->cmd->paraNum = paraNum;
cmdItemNode->cmd->cmdType = cmdType;
cmdItemNode->cmd->cmdKey = cmdKey;
(VOID)LOS_MuxLock(&g_cmdInfo.muxLock, LOS_WAIT_FOREVER);
OsCmdAscendingInsert(cmdItemNode);
g_cmdInfo.listNum++;
(VOID)LOS_MuxUnlock(&g_cmdInfo.muxLock);
(VOID)LOS_MuxLock(&g_cmdInfo.muxLock, LOS_WAIT_FOREVER);//拿锁
OsCmdAscendingInsert(cmdItemNode);//以递升方式插入
g_cmdInfo.listNum++; //cmd总数++
(VOID)LOS_MuxUnlock(&g_cmdInfo.muxLock);//释放锁
return LOS_OK;
}
/* open API */
/* open API */ //对外开发的API接口, 动态注册一个cmd命令,方便调试.
LITE_OS_SEC_TEXT_MINOR UINT32 osCmdReg(CmdType cmdType, const CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc)
{
CmdItemNode *cmdItemNode = NULL;
(VOID)LOS_MuxLock(&g_cmdInfo.muxLock, LOS_WAIT_FOREVER);
if (g_cmdInfo.initMagicFlag != SHELL_INIT_MAGIC_FLAG) {
if (g_cmdInfo.initMagicFlag != SHELL_INIT_MAGIC_FLAG) {//检查魔法数字对不对,初始化时会赋值
(VOID)LOS_MuxUnlock(&g_cmdInfo.muxLock);
PRINT_ERR("[%s] shell is not yet initialized!\n", __FUNCTION__);
return OS_ERRNO_SHELL_NOT_INIT;
......@@ -858,7 +859,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 osCmdReg(CmdType cmdType, const CHAR *cmdKey, UINT
}
(VOID)LOS_MuxLock(&g_cmdInfo.muxLock, LOS_WAIT_FOREVER);
LOS_DL_LIST_FOR_EACH_ENTRY(cmdItemNode, &(g_cmdInfo.cmdList.list), CmdItemNode, list) {
LOS_DL_LIST_FOR_EACH_ENTRY(cmdItemNode, &(g_cmdInfo.cmdList.list), CmdItemNode, list) {//循环检查防止出现一样的cmd
if ((cmdType == cmdItemNode->cmd->cmdType) &&
((strlen(cmdKey) == strlen(cmdItemNode->cmd->cmdKey)) &&
(strncmp((CHAR *)(cmdItemNode->cmd->cmdKey), cmdKey, strlen(cmdKey)) == 0))) {
......@@ -868,7 +869,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 osCmdReg(CmdType cmdType, const CHAR *cmdKey, UINT
}
(VOID)LOS_MuxUnlock(&g_cmdInfo.muxLock);
return OsCmdItemCreate(cmdType, cmdKey, paraNum, cmdProc);
return OsCmdItemCreate(cmdType, cmdKey, paraNum, cmdProc);//创建一个新的cmd命令
}
#ifdef __cplusplus
......
......@@ -225,7 +225,7 @@ VOID OsLkLoggerInit(const CHAR *str)
}
#ifdef LOSCFG_SHELL_CMD_DEBUG
SHELLCMD_ENTRY(log_shellcmd, CMD_TYPE_EX, "log", 1, (CmdCallBackFunc)CmdLog);
SHELLCMD_ENTRY(log_shellcmd, CMD_TYPE_EX, "log", 1, (CmdCallBackFunc)CmdLog);//采用shell命令静态注册方式
#endif
#ifdef __cplusplus
......
......@@ -299,4 +299,4 @@ INT32 OsShellCmdDate(INT32 argc, const CHAR **argv)
return DATE_OK;
}
SHELLCMD_ENTRY(date_shellcmd, CMD_TYPE_STD, "date", XARGS, (CmdCallBackFunc)OsShellCmdDate);
SHELLCMD_ENTRY(date_shellcmd, CMD_TYPE_STD, "date", XARGS, (CmdCallBackFunc)OsShellCmdDate);//采用shell命令静态注册方式
\ No newline at end of file
......@@ -772,7 +772,7 @@ ERR_OUT:
return -1;
}
SHELLCMD_ENTRY(dmesg_shellcmd, CMD_TYPE_STD, "dmesg", XARGS, (CmdCallBackFunc)OsShellCmdDmesg);
SHELLCMD_ENTRY(dmesg_shellcmd, CMD_TYPE_STD, "dmesg", XARGS, (CmdCallBackFunc)OsShellCmdDmesg);//采用shell命令静态注册方式
#ifdef __cplusplus
#if __cplusplus
......
......@@ -62,7 +62,7 @@ INT32 osShellCmdReadExcInfo(INT32 argc, CHAR **argv)
buf = NULL;
return LOS_OK;
}
SHELLCMD_ENTRY(readExcInfo_shellcmd, CMD_TYPE_EX, "excInfo", 0, (CmdCallBackFunc)osShellCmdReadExcInfo);
SHELLCMD_ENTRY(readExcInfo_shellcmd, CMD_TYPE_EX, "excInfo", 0, (CmdCallBackFunc)osShellCmdReadExcInfo);//采用shell命令静态注册方式
#ifdef __cplusplus
#if __cplusplus
}
......
......@@ -57,4 +57,4 @@ UINT32 OsShellCmdHelp(UINT32 argc, const CHAR **argv)
return 0;
}
SHELLCMD_ENTRY(help_shellcmd, CMD_TYPE_EX, "help", 0, (CmdCallBackFunc)OsShellCmdHelp);
\ No newline at end of file
SHELLCMD_ENTRY(help_shellcmd, CMD_TYPE_EX, "help", 0, (CmdCallBackFunc)OsShellCmdHelp);//采用shell命令静态注册方式
\ No newline at end of file
......@@ -271,5 +271,5 @@ WATCH_ERROR:
return OS_ERROR;
}
SHELLCMD_ENTRY(watch_shellcmd, CMD_TYPE_EX, "watch", XARGS, (CmdCallBackFunc)OsShellCmdWatch);
SHELLCMD_ENTRY(watch_shellcmd, CMD_TYPE_EX, "watch", XARGS, (CmdCallBackFunc)OsShellCmdWatch);//采用shell命令静态注册方式
#endif
git add -A
git commit -m '开始对 posix 部分代码注释
git commit -m 'Shell的本质是向外界提供一个窗口窥视内核,SHELLCMD_ENTRY(l, cmdType, cmdKey, paraNum, cmdHook)为shell静态注册命令方式
鸿蒙内核源码分析系列 【 CSDN | OSCHINA | WIKI 】
鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓 】四大仓库每日同步更新代码和wiki
项目给鸿蒙内核源码逐行加上中文注解,详细阐述框架和代码细节, 精读 HarmonyOS 内核源码, 将迅速拔高对计算机整体理解,从此高屋建瓴看问题.'
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册