diff --git a/src/kernel_liteos_a/kernel/base/misc/los_stackinfo.c b/src/kernel_liteos_a/kernel/base/misc/los_stackinfo.c index 6f96a8a5..9eb7a9c0 100644 --- a/src/kernel_liteos_a/kernel/base/misc/los_stackinfo.c +++ b/src/kernel_liteos_a/kernel/base/misc/los_stackinfo.c @@ -38,27 +38,28 @@ #include "shell.h" #endif -const StackInfo *g_stackInfo = NULL; -UINT32 g_stackNum; +const StackInfo *g_stackInfo = NULL; ///< CPU所有工作模式的栈信息 +UINT32 g_stackNum; ///< CPU所有工作模式的栈数量 +///获取栈的吃水线 UINT32 OsStackWaterLineGet(const UINTPTR *stackBottom, const UINTPTR *stackTop, UINT32 *peakUsed) { UINT32 size; const UINTPTR *tmp = NULL; - if (*stackTop == OS_STACK_MAGIC_WORD) { + if (*stackTop == OS_STACK_MAGIC_WORD) {//栈顶值是否等于 magic 0xCCCCCCCC tmp = stackTop + 1; - while ((tmp < stackBottom) && (*tmp == OS_STACK_INIT)) { + while ((tmp < stackBottom) && (*tmp == OS_STACK_INIT)) {//记录从栈顶到栈低有多少个连续的 0xCACACACA tmp++; } - size = (UINT32)((UINTPTR)stackBottom - (UINTPTR)tmp); - *peakUsed = (size == 0) ? size : (size + sizeof(CHAR *)); + size = (UINT32)((UINTPTR)stackBottom - (UINTPTR)tmp);//剩余多少非0xCACACACA的栈空间 + *peakUsed = (size == 0) ? size : (size + sizeof(CHAR *));//得出高峰用值,还剩多少可用 return LOS_OK; } else { - *peakUsed = OS_INVALID_WATERLINE; + *peakUsed = OS_INVALID_WATERLINE;//栈溢出了 return LOS_NOK; } } - +///异常情况下的栈检查,主要就是检查栈顶值有没有被改写 VOID OsExcStackCheck(VOID) { UINT32 index; @@ -71,7 +72,7 @@ VOID OsExcStackCheck(VOID) for (index = 0; index < g_stackNum; index++) { for (cpuid = 0; cpuid < LOSCFG_KERNEL_CORE_NUM; cpuid++) { stackTop = (UINTPTR *)((UINTPTR)g_stackInfo[index].stackTop + cpuid * g_stackInfo[index].stackSize); - if (*stackTop != OS_STACK_MAGIC_WORD) { + if (*stackTop != OS_STACK_MAGIC_WORD) {// 只要栈顶内容不是 0xCCCCCCCCC 就是溢出了. PRINT_ERR("cpu:%u %s overflow , magic word changed to 0x%x\n", LOSCFG_KERNEL_CORE_NUM - 1 - cpuid, g_stackInfo[index].stackName, *stackTop); } @@ -79,6 +80,7 @@ VOID OsExcStackCheck(VOID) } } +///打印栈的信息 把每个CPU的栈信息打印出来 VOID OsExcStackInfo(VOID) { UINT32 index; @@ -93,36 +95,37 @@ VOID OsExcStackInfo(VOID) PrintExcInfo("\n stack name cpu id stack addr total size used size\n" " ---------- ------ --------- -------- --------\n"); - for (index = 0; index < g_stackNum; index++) { - for (cpuid = 0; cpuid < LOSCFG_KERNEL_CORE_NUM; cpuid++) { + for (cpuid = 0; cpuid < LOSCFG_KERNEL_CORE_NUM; cpuid++) {//可以看出 各个CPU的栈是紧挨的的 stackTop = (UINTPTR *)((UINTPTR)g_stackInfo[index].stackTop + cpuid * g_stackInfo[index].stackSize); stack = (UINTPTR *)((UINTPTR)stackTop + g_stackInfo[index].stackSize); - (VOID)OsStackWaterLineGet(stack, stackTop, &size); + (VOID)OsStackWaterLineGet(stack, stackTop, &size);//获取吃水线, 鸿蒙用WaterLine 这个词用的很妙 PrintExcInfo("%11s %-5d %-10p 0x%-8x 0x%-4x\n", g_stackInfo[index].stackName, LOSCFG_KERNEL_CORE_NUM - 1 - cpuid, stackTop, g_stackInfo[index].stackSize, size); } } - OsExcStackCheck(); + OsExcStackCheck();//发生异常时栈检查 } +///注册栈信息 VOID OsExcStackInfoReg(const StackInfo *stackInfo, UINT32 stackNum) { - g_stackInfo = stackInfo; + g_stackInfo = stackInfo; //全局变量指向g_excStack g_stackNum = stackNum; } +///task栈的初始化,设置固定的值. 0xcccccccc 和 0xcacacaca VOID OsStackInit(VOID *stacktop, UINT32 stacksize) { /* initialize the task stack, write magic num to stack top */ - errno_t ret = memset_s(stacktop, stacksize, (INT32)OS_STACK_INIT, stacksize); + errno_t ret = memset_s(stacktop, stacksize, (INT32)OS_STACK_INIT, stacksize);//清一色填 0xCACACACA if (ret == EOK) { - *((UINTPTR *)stacktop) = OS_STACK_MAGIC_WORD; + *((UINTPTR *)stacktop) = OS_STACK_MAGIC_WORD;//0xCCCCCCCCC 中文就是"烫烫烫烫" 这几个字懂点计算机的人都不会陌生了. } } #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 diff --git a/src/kernel_liteos_a/kernel/base/misc/mempt_shellcmd.c b/src/kernel_liteos_a/kernel/base/misc/mempt_shellcmd.c index 0e8ec47b..7177ace6 100644 --- a/src/kernel_liteos_a/kernel/base/misc/mempt_shellcmd.c +++ b/src/kernel_liteos_a/kernel/base/misc/mempt_shellcmd.c @@ -193,7 +193,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdUname(INT32 argc, const CHAR *argv[]) if (argc == 1) { if (strcmp(argv[0], "-a") == 0) { - PRINTK("%s %d.%d.%d.%d %s %s\n", KERNEL_NAME, KERNEL_MAJOR, KERNEL_MINOR, KERNEL_PATCH, KERNEL_ITRE, \ + PRINTK("%s %d.%d.%d.%d %s %s\n", KERNEL_NAME, KERNEL_MAJOR, KERNEL_MINOR, KERNEL_PATCH, KERNEL_ITRE,\ __DATE__, __TIME__); return 0; } else if (strcmp(argv[0], "-s") == 0) { diff --git a/src/kernel_liteos_a/kernel/base/misc/swtmr_shellcmd.c b/src/kernel_liteos_a/kernel/base/misc/swtmr_shellcmd.c index 81573ef4..49c8349c 100644 --- a/src/kernel_liteos_a/kernel/base/misc/swtmr_shellcmd.c +++ b/src/kernel_liteos_a/kernel/base/misc/swtmr_shellcmd.c @@ -58,20 +58,21 @@ STATIC VOID OsPrintSwtmrMsg(const SWTMR_CTRL_S *swtmr) (VOID)LOS_SwtmrTimeGet(swtmr->usTimerID, &ticks); PRINTK("%7u%10s%8s%12u%7u%#12x%#12x\n", - swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT, - g_shellSwtmrStatus[swtmr->ucState], - g_shellSwtmrMode[swtmr->ucMode], - swtmr->uwInterval, + swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT, //软件定时器ID。 + g_shellSwtmrStatus[swtmr->ucState], //软件定时器状态,状态可能为:"UnUsed", "Created", "Ticking"。 + g_shellSwtmrMode[swtmr->ucMode], //软件定时器模式。模式可能为:"Once", "Period", "NSD(单次定时器,定时结束后不会自动删除)" + swtmr->uwInterval, //软件定时器使用的Tick数。 ticks, - swtmr->uwArg, - swtmr->pfnHandler); + swtmr->uwArg, //传入的参数。 + swtmr->pfnHandler); //回调函数的地址。 } STATIC INLINE VOID OsPrintSwtmrMsgHead(VOID) { PRINTK("\r\nSwTmrID State Mode Interval Count Arg handlerAddr\n"); } - +///shell命令之swtmr 命令用于查询系统软件定时器相关信息。 +//参数缺省时,默认显示所有软件定时器的相关信息。 STATIC UINT32 SwtmrBaseInfoGet(UINT32 timerID) { SWTMR_CTRL_S *swtmr = g_swtmrCBArray; @@ -173,7 +174,6 @@ SWTMR_HELP: PRINTK(" swtmr ID --- Specifies information about a software timer.\n"); 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命令静态注册方式 #endif /* LOSCFG_SHELL */ diff --git a/src/kernel_liteos_a/kernel/base/misc/sysinfo_shellcmd.c b/src/kernel_liteos_a/kernel/base/misc/sysinfo_shellcmd.c index b7c56f84..1d3849b2 100644 --- a/src/kernel_liteos_a/kernel/base/misc/sysinfo_shellcmd.c +++ b/src/kernel_liteos_a/kernel/base/misc/sysinfo_shellcmd.c @@ -118,7 +118,7 @@ UINT32 OsShellCmdSwtmrCntGet(VOID) LOS_IntRestore(intSave); return swtmrCnt; } - +///查看系统资源使用情况 LITE_OS_SEC_TEXT_MINOR VOID OsShellCmdSystemInfoGet(VOID) { UINT8 isTaskEnable = TRUE; @@ -137,27 +137,27 @@ LITE_OS_SEC_TEXT_MINOR VOID OsShellCmdSystemInfoGet(VOID) #else UINT8 isSwtmrEnable = FALSE; #endif - +//模块名称 当前使用量 最大可用量 模块是否开启 PRINTK("\n Module Used Total Enabled\n"); PRINTK("--------------------------------------------\n"); PRINTK(" Task %-10u%-10d%s\n", - OsShellCmdTaskCntGet(), - LOSCFG_BASE_CORE_TSK_LIMIT, - SYSINFO_ENABLED(isTaskEnable)); + OsShellCmdTaskCntGet(), //有效任务数 + LOSCFG_BASE_CORE_TSK_LIMIT, //任务最大数 128 + SYSINFO_ENABLED(isTaskEnable));//任务是否失效 YES or NO PRINTK(" Sem %-10u%-10d%s\n", - OsShellCmdSemCntGet(), - LOSCFG_BASE_IPC_SEM_LIMIT, - SYSINFO_ENABLED(isSemEnable)); + OsShellCmdSemCntGet(), //信号量的数量 + LOSCFG_BASE_IPC_SEM_LIMIT, //信号量最大数 1024 + SYSINFO_ENABLED(isSemEnable));//信号量是否失效 YES or NO PRINTK(" Queue %-10u%-10d%s\n", - OsShellCmdQueueCntGet(), - LOSCFG_BASE_IPC_QUEUE_LIMIT, - SYSINFO_ENABLED(isQueueEnable)); + OsShellCmdQueueCntGet(), //队列的数量 + LOSCFG_BASE_IPC_QUEUE_LIMIT, //队列的最大数 1024 + SYSINFO_ENABLED(isQueueEnable));//队列是否失效 YES or NO PRINTK(" SwTmr %-10u%-10d%s\n", - OsShellCmdSwtmrCntGet(), - LOSCFG_BASE_CORE_SWTMR_LIMIT, - SYSINFO_ENABLED(isSwtmrEnable)); + OsShellCmdSwtmrCntGet(), //定时器的数量 + LOSCFG_BASE_CORE_SWTMR_LIMIT, //定时器的总数 1024 + SYSINFO_ENABLED(isSwtmrEnable)); //定时器是否失效 YES or NO } - +///systeminfo命令用于显示当前操作系统内资源使用情况,包括任务、信号量、互斥量、队列、定时器等。 INT32 OsShellCmdSystemInfo(INT32 argc, const CHAR **argv) { if (argc == 0) { diff --git a/src/kernel_liteos_a/kernel/base/misc/vm_shellcmd.c b/src/kernel_liteos_a/kernel/base/misc/vm_shellcmd.c index 445014b3..b8455e8a 100644 --- a/src/kernel_liteos_a/kernel/base/misc/vm_shellcmd.c +++ b/src/kernel_liteos_a/kernel/base/misc/vm_shellcmd.c @@ -54,7 +54,7 @@ #define VMM_CMD "vmm" #define OOM_CMD "oom" #define VMM_PMM_CMD "v2p" - +//dump内核空间 LITE_OS_SEC_TEXT_MINOR VOID OsDumpKernelAspace(VOID) { LosVmSpace *kAspace = LOS_GetKVmSpace(); @@ -104,26 +104,26 @@ LITE_OS_SEC_TEXT_MINOR VOID OsDoDumpVm(pid_t pid) PRINTK("\tThe process [%d] not active\n", pid); } } - +///查看进程的虚拟内存使用情况。vmm [-a / -h / --help], vmm [pid] LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdDumpVm(INT32 argc, const CHAR *argv[]) { - if (argc == 0) { + if (argc == 0) { //没有参数 使用 # vmm 查看所有进程使用虚拟内存的情况 OsDumpAllAspace(); } else if (argc == 1) { pid_t pid = OsPid(argv[0]); - if (strcmp(argv[0], "-a") == 0) { + if (strcmp(argv[0], "-a") == 0) { //# vmm -a 查看所有进程使用虚拟内存的情况 OsDumpAllAspace(); - } else if (strcmp(argv[0], "-k") == 0) { + } else if (strcmp(argv[0], "-k") == 0) {//# vmm -k 查看内核进程使用虚拟内存的情况 OsDumpKernelAspace(); - } else if (pid >= 0) { + } else if (pid >= 0) { //# vmm 3 查看3号进程使用虚拟内存的情况 OsDoDumpVm(pid); - } else if (strcmp(argv[0], "-h") == 0 || strcmp(argv[0], "--help") == 0) { + } else if (strcmp(argv[0], "-h") == 0 || strcmp(argv[0], "--help") == 0) { //# vmm -h 或者 vmm --help OsPrintUsage(); } else { - PRINTK("%s: invalid option: %s\n", VMM_CMD, argv[0]); + PRINTK("%s: invalid option: %s\n", VMM_CMD, argv[0]); //格式错误,输出规范格式 OsPrintUsage(); } - } else { + } else { //多于一个参数 例如 # vmm 3 9 OsPrintUsage(); } @@ -135,7 +135,7 @@ LITE_OS_SEC_TEXT_MINOR VOID V2PPrintUsage(VOID) PRINTK("pid vaddr(0x1000000~0x3e000000), print physical address of virtual address\n" "-h | --help, print v2p command usage\n"); } - +///v2p 虚拟内存对应的物理内存 LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdV2P(INT32 argc, const CHAR *argv[]) { UINT32 vaddr; @@ -180,7 +180,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdV2P(INT32 argc, const CHAR *argv[]) return LOS_OK; } - +///查看系统内存物理页及pagecache物理页使用情况 , Debug版本才具备的命令 # pmm LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdDumpPmm(VOID) { OsVmPhysDump(); @@ -192,12 +192,13 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdDumpPmm(VOID) LITE_OS_SEC_TEXT_MINOR VOID OomPrintUsage(VOID) { - PRINTK("\t-i [interval], set oom check interval (ms)\n" - "\t-m [mem byte], set oom low memory threshold (Byte)\n" - "\t-r [mem byte], set page cache reclaim memory threshold (Byte)\n" - "\t-h | --help, print vmm command usage\n"); + PRINTK("\t-i [interval], set oom check interval (ms)\n" //设置oom线程任务检查的时间间隔。 + "\t-m [mem byte], set oom low memory threshold (Byte)\n" //设置低内存阈值。 + "\t-r [mem byte], set page cache reclaim memory threshold (Byte)\n" //设置pagecache内存回收阈值。 + "\t-h | --help, print vmm command usage\n"); //使用帮助。 } - +///查看和设置低内存阈值以及pagecache内存回收阈值。参数缺省时,显示oom功能当前配置信息。 +//当系统内存不足时,会打印出内存不足的提示信息。 LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdOom(INT32 argc, const CHAR *argv[]) { UINT32 lowMemThreshold; @@ -219,7 +220,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdOom(INT32 argc, const CHAR *argv[]) PRINTK("[oom] low mem threshold %s(byte) invalid.\n", argv[1]); return OS_ERROR; } else { - OomSetLowMemThreashold(lowMemThreshold); + OomSetLowMemThreashold(lowMemThreshold);//设置低内存阈值 } } else if (strcmp(argv[0], "-i") == 0) { checkInterval = strtoul((CHAR *)argv[1], &endPtr, 0); @@ -227,7 +228,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdOom(INT32 argc, const CHAR *argv[]) PRINTK("[oom] check interval %s(us) invalid.\n", argv[1]); return OS_ERROR; } else { - OomSetCheckInterval(checkInterval); + OomSetCheckInterval(checkInterval);//设置oom线程任务检查的时间间隔 } } else if (strcmp(argv[0], "-r") == 0) { reclaimMemThreshold = strtoul((CHAR *)argv[1], &endPtr, 0); @@ -235,7 +236,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdOom(INT32 argc, const CHAR *argv[]) PRINTK("[oom] reclaim mem threshold %s(byte) invalid.\n", argv[1]); return OS_ERROR; } else { - OomSetReclaimMemThreashold(reclaimMemThreshold); + OomSetReclaimMemThreashold(reclaimMemThreshold);//设置pagecache内存回收阈值 } } else { PRINTK("%s: invalid option: %s %s\n", OOM_CMD, argv[0], argv[1]); @@ -250,13 +251,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命令静态注册方式 vmm +SHELLCMD_ENTRY(v2p_shellcmd, CMD_TYPE_SHOW, VMM_PMM_CMD, 1, (CmdCallBackFunc)OsShellCmdV2P);//采用shell命令静态注册方式 v2p #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 #endif