From 53117f9f47a8dd3023e83dc0cc0de224eab9719f Mon Sep 17 00:00:00 2001 From: lnlan Date: Thu, 26 Aug 2021 08:47:05 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8C=89=E4=BB=BB=E5=8A=A1=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E5=B7=B2=E7=BB=8Falloc=E7=9A=84=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=A4=A7=E5=B0=8F=20=E3=80=90=E8=83=8C=E6=99=AF=E3=80=91=20m?= =?UTF-8?q?=E6=A0=B8=E9=9C=80=E8=A1=A5=E5=85=85shell=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=EF=BC=8C=E6=8C=89=E4=BB=BB=E5=8A=A1=E7=BB=9F=E8=AE=A1=E5=B7=B2?= =?UTF-8?q?=E7=BB=8Falloc=E7=9A=84=E5=86=85=E5=AD=98=E5=A4=A7=E5=B0=8F=20?= =?UTF-8?q?=E3=80=90=E4=BF=AE=E6=94=B9=E6=96=B9=E6=A1=88=E3=80=91=201.?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=9C=A8task=E5=91=BD=E4=BB=A4=E4=B8=AD?= =?UTF-8?q?=EF=BC=8C=E5=9C=A8=E6=89=93=E5=8D=B0task=20info=E5=89=8D?= =?UTF-8?q?=E9=81=8D=E5=8E=86=E6=89=80=E6=9C=89=E5=86=85=E5=AD=98=E8=8A=82?= =?UTF-8?q?=E7=82=B9=EF=BC=8C=E7=BB=9F=E8=AE=A1=E5=90=84=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=89=80=E5=8D=A0=E7=94=A8=E7=9A=84=E5=86=85=E5=AD=98=E8=8A=82?= =?UTF-8?q?=20=E7=82=B9=E5=A4=A7=E5=B0=8F=EF=BC=8C=E5=9C=A8=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E6=97=B6=E5=B0=86=E5=85=B6=E6=89=93=E5=87=BA=E3=80=82?= =?UTF-8?q?=202.=E5=86=85=E5=AD=98=E8=8A=82=E7=82=B9=E4=B8=AD=EF=BC=8Ctask?= =?UTF-8?q?id=E6=89=80=E5=8D=A0=E4=BD=8D=E6=95=B0=E9=9A=8F=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=9C=80=E5=A4=A7=E4=BB=BB=E5=8A=A1=E6=95=B0=E8=B0=83?= =?UTF-8?q?=E6=95=B4=20=E3=80=90=E5=BD=B1=E5=93=8D=E3=80=91=20=E5=AF=B9?= =?UTF-8?q?=E7=8E=B0=E6=9C=89=E7=9A=84=E4=BA=A7=E5=93=81=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E4=B8=8D=E4=BC=9A=E6=9C=89=E5=BD=B1=E5=93=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit re #I44WNU Signed-off-by: lanleinan Change-Id: I080b5dd056966784c0752408f9e320ca0e97c7f7 --- components/shell/src/cmds/task_shellcmd.c | 26 +++++++++ kernel/include/los_config.h | 8 +++ kernel/include/los_memory.h | 1 + kernel/src/mm/los_memory.c | 69 +++++++++++++++++++++-- 4 files changed, 98 insertions(+), 6 deletions(-) diff --git a/components/shell/src/cmds/task_shellcmd.c b/components/shell/src/cmds/task_shellcmd.c index 286fa6fe..79768eb5 100755 --- a/components/shell/src/cmds/task_shellcmd.c +++ b/components/shell/src/cmds/task_shellcmd.c @@ -65,11 +65,17 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoTitle(VOID) PRINTK("Name TaskEntryAddr TID "); PRINTK("Priority Status " +#if (LOSCFG_TASK_MEM_USED == 1) + "AllocSize " +#endif "StackSize StackPoint TopOfStack"); PRINTK("\n"); PRINTK("---- ------------- --- "); PRINTK("-------- -------- " +#if (LOSCFG_TASK_MEM_USED == 1) + "--------- " +#endif "--------- ---------- ----------"); PRINTK("\n"); } @@ -91,6 +97,17 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoData(const LosTaskCB *allTas UINT32 loop; UINT32 semId; +#if (LOSCFG_TASK_MEM_USED == 1) + UINT32 arraySize = sizeof(UINT32) * (LOSCFG_BASE_CORE_TSK_LIMIT + 1); + UINT32 *getUsedSizeArray = (UINT32 *)LOS_MemAlloc(m_aucSysMem0, arraySize); + if (getUsedSizeArray == NULL) { + PRINTK("Memory is not enough to save task info!\n"); + return; + } + (VOID)memset_s(getUsedSizeArray, arraySize, 0, arraySize); + OsTaskMemUsed(m_aucSysMem0, getUsedSizeArray, arraySize); +#endif + for (loop = 0; loop < g_taskMaxNum; ++loop) { taskCB = allTaskArray + loop; if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { @@ -100,11 +117,20 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoData(const LosTaskCB *allTas semId = OsGetSemID(taskCB); PRINTK("%-23s%-20p0x%-5x", taskCB->taskName, taskCB->taskEntry, taskCB->taskID); +#if (LOSCFG_TASK_MEM_USED == 1) + PRINTK("%-11u%-13s0x%-11x 0x%-11x 0x%-8x 0x%-10x ", taskCB->priority, + OsShellCmdConvertTskStatus(taskCB->taskStatus), getUsedSizeArray[loop], taskCB->stackSize, + taskCB->stackPointer, taskCB->topOfStack, semId); +#else PRINTK("%-11u%-13s0x%-11x 0x%-8x 0x%-10x ", taskCB->priority, OsShellCmdConvertTskStatus(taskCB->taskStatus), taskCB->stackSize, taskCB->stackPointer, taskCB->topOfStack, semId); +#endif PRINTK("\n"); } +#if (LOSCFG_TASK_MEM_USED == 1) + (VOID)LOS_MemFree(m_aucSysMem0, getUsedSizeArray); +#endif } LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTskInfoGet(UINT32 taskId) diff --git a/kernel/include/los_config.h b/kernel/include/los_config.h index 467c01bc..c08bc8c2 100644 --- a/kernel/include/los_config.h +++ b/kernel/include/los_config.h @@ -800,6 +800,14 @@ extern UINT8 *m_aucSysMem0; #define LOSCFG_SHELL_PRIO 3 #endif +/** + * @ingroup los_config + * Configuration item to get task used memory. + */ +#ifndef LOSCFG_TASK_MEM_USED +#define LOSCFG_TASK_MEM_USED 0 +#endif + #ifdef __cplusplus #if __cplusplus } diff --git a/kernel/include/los_memory.h b/kernel/include/los_memory.h index fc5ede4e..7d71288d 100644 --- a/kernel/include/los_memory.h +++ b/kernel/include/los_memory.h @@ -469,6 +469,7 @@ extern UINT32 LOS_MemIntegrityCheck(const VOID *pool); extern VOID LOS_MemUnlockEnable(VOID *pool); extern UINT32 OsMemSystemInit(VOID); +extern VOID OsTaskMemUsed(VOID *pool, UINT32 *outArray, UINT32 arraySize); #ifdef __cplusplus #if __cplusplus diff --git a/kernel/src/mm/los_memory.c b/kernel/src/mm/los_memory.c index 90f3c37f..617e7a07 100644 --- a/kernel/src/mm/los_memory.c +++ b/kernel/src/mm/los_memory.c @@ -111,6 +111,9 @@ STATIC INLINE UINT32 OsMemSlGet(UINT32 size, UINT32 fl) } /* The following is the memory algorithm related macro definition and interface implementation. */ +#if (LOSCFG_TASK_MEM_USED != 1 && LOSCFG_MEM_FREE_BY_TASKID == 1 && (LOSCFG_BASE_CORE_TSK_LIMIT + 1) > 64) +#error "When enter here, LOSCFG_BASE_CORE_TSK_LIMIT larger than 63 is not support" +#endif struct OsMemNodeHead { #if (LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK == 1) @@ -123,7 +126,10 @@ struct OsMemNodeHead { struct OsMemNodeHead *prev; /* The prev is used for current node points to the previous node */ struct OsMemNodeHead *next; /* The next is used for sentinel node points to the expand node */ } ptr; -#if (LOSCFG_MEM_FREE_BY_TASKID == 1) +#if (LOSCFG_TASK_MEM_USED == 1) + UINT32 taskID; + UINT32 sizeAndFlag; +#elif (LOSCFG_MEM_FREE_BY_TASKID == 1) UINT32 taskID : 6; UINT32 sizeAndFlag : 26; #else @@ -180,7 +186,7 @@ struct OsMemPoolHead { } while (0); #define OS_MEM_NODE_MAGIC 0xABCDDCBA -#if (LOSCFG_MEM_FREE_BY_TASKID == 1) +#if (LOSCFG_TASK_MEM_USED != 1 && LOSCFG_MEM_FREE_BY_TASKID == 1) #define OS_MEM_NODE_USED_FLAG (1U << 25) #define OS_MEM_NODE_ALIGNED_FLAG (1U << 24) #if (LOSCFG_MEM_LEAKCHECK == 1) @@ -290,13 +296,64 @@ STATIC INLINE VOID OsMemFreeNodeAdd(VOID *pool, struct OsMemFreeNodeHead *node); STATIC INLINE UINT32 OsMemFree(struct OsMemPoolHead *pool, struct OsMemNodeHead *node); STATIC VOID OsMemInfoPrint(VOID *pool); -#if (LOSCFG_MEM_FREE_BY_TASKID == 1) +#if (LOSCFG_MEM_FREE_BY_TASKID == 1 || LOSCFG_TASK_MEM_USED == 1) STATIC INLINE VOID OsMemNodeSetTaskID(struct OsMemUsedNodeHead *node) { node->header.taskID = LOS_CurTaskIDGet(); } #endif +#if (LOSCFG_TASK_MEM_USED == 1) +VOID OsTaskMemUsed(VOID *pool, UINT32 *outArray, UINT32 arraySize) +{ + struct OsMemPoolHead *poolInfo = (struct OsMemPoolHead *)pool; + struct OsMemNodeHead *tmpNode = NULL; + struct OsMemNodeHead *endNode = NULL; + UINT32 intSave; + + if (pool == NULL) { + PRINTK("input param is NULL\n"); + return; + } + if (LOS_MemIntegrityCheck(pool)) { + PRINTK("LOS_MemIntegrityCheck error\n"); + return; + } + + MEM_LOCK(poolInfo, intSave); + endNode = OS_MEM_END_NODE(pool, poolInfo->info.totalSize); +#if OS_MEM_EXPAND_ENABLE + UINT32 size; + for (tmpNode = OS_MEM_FIRST_NODE(pool); tmpNode <= endNode; + tmpNode = OS_MEM_NEXT_NODE(tmpNode)) { + if (tmpNode == endNode) { + if (OsMemIsLastSentinelNode(endNode) == FALSE) { + size = OS_MEM_NODE_GET_SIZE(endNode->sizeAndFlag); + tmpNode = OsMemSentinelNodeGet(endNode); + endNode = OS_MEM_END_NODE(tmpNode, size); + continue; + } else { + break; + } + } +#else + for (tmpNode = OS_MEM_FIRST_NODE(pool); tmpNode < endNode; + tmpNode = OS_MEM_NEXT_NODE(tmpNode)) { +#endif +#ifndef LOSCFG_MEM_MUL_REGIONS + if (OS_MEM_NODE_GET_USED_FLAG(tmpNode->sizeAndFlag)) { +#else + if (OS_MEM_NODE_GET_USED_FLAG(tmpNode->sizeAndFlag) && !OS_MEM_IS_GAP_NODE(tmpNode)) { +#endif + if (tmpNode->taskID < arraySize) { + outArray[tmpNode->taskID] += OS_MEM_NODE_GET_SIZE(tmpNode->sizeAndFlag); + } + } + } + MEM_UNLOCK(poolInfo, intSave); +} +#endif + #if (LOSCFG_MEM_WATERLINE == 1) STATIC INLINE VOID OsMemWaterUsedRecord(struct OsMemPoolHead *pool, UINT32 size) { @@ -791,7 +848,7 @@ STATIC INLINE VOID *OsMemCreateUsedNode(VOID *addr) { struct OsMemUsedNodeHead *node = (struct OsMemUsedNodeHead *)addr; -#if (LOSCFG_MEM_FREE_BY_TASKID == 1) +#if (LOSCFG_MEM_FREE_BY_TASKID == 1 || LOSCFG_TASK_MEM_USED == 1) OsMemNodeSetTaskID(node); #endif @@ -1747,7 +1804,7 @@ STATIC VOID OsMemIntegrityCheckError(struct OsMemPoolHead *pool, OsMemNodeInfo(tmpNode, preNode); #endif OsMemCheckInfoRecord(tmpNode, preNode); -#if (LOSCFG_MEM_FREE_BY_TASKID == 1) +#if (LOSCFG_MEM_FREE_BY_TASKID == 1 || LOSCFG_TASK_MEM_USED == 1) LosTaskCB *taskCB = NULL; if (OS_MEM_NODE_GET_USED_FLAG(preNode->sizeAndFlag)) { struct OsMemUsedNodeHead *usedNode = (struct OsMemUsedNodeHead *)preNode; @@ -2170,7 +2227,7 @@ STATIC VOID OsMemExcInfoGetSub(struct OsMemPoolHead *pool, MemInfoCB *memExcInfo if (OS_MEM_NODE_GET_USED_FLAG(tmpNode->sizeAndFlag)) { if (!OS_MEM_MAGIC_VALID(tmpNode) || !OsMemAddrValidCheck(pool, tmpNode->ptr.prev)) { -#if (LOSCFG_MEM_FREE_BY_TASKID == 1) +#if (LOSCFG_MEM_FREE_BY_TASKID == 1 || LOSCFG_TASK_MEM_USED == 1) taskID = ((struct OsMemUsedNodeHead *)tmpNode)->header.taskID; #endif goto ERROUT;