feat: 按任务统计已经alloc的内存大小
【背景】 m核需补充shell命令,按任务统计已经alloc的内存大小 【修改方案】 1.新增在task命令中,在打印task info前遍历所有内存节点,统计各任务所占用的内存节 点大小,在打印时将其打出。 2.内存节点中,taskid所占位数随系统最大任务数调整 【影响】 对现有的产品编译不会有影响。 re #I44WNU Signed-off-by: lanleinan <lanleinan@163.com> Change-Id: I080b5dd056966784c0752408f9e320ca0e97c7f7
This commit is contained in:
parent
75f975c424
commit
53117f9f47
|
@ -65,11 +65,17 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoTitle(VOID)
|
||||||
PRINTK("Name TaskEntryAddr TID ");
|
PRINTK("Name TaskEntryAddr TID ");
|
||||||
|
|
||||||
PRINTK("Priority Status "
|
PRINTK("Priority Status "
|
||||||
|
#if (LOSCFG_TASK_MEM_USED == 1)
|
||||||
|
"AllocSize "
|
||||||
|
#endif
|
||||||
"StackSize StackPoint TopOfStack");
|
"StackSize StackPoint TopOfStack");
|
||||||
|
|
||||||
PRINTK("\n");
|
PRINTK("\n");
|
||||||
PRINTK("---- ------------- --- ");
|
PRINTK("---- ------------- --- ");
|
||||||
PRINTK("-------- -------- "
|
PRINTK("-------- -------- "
|
||||||
|
#if (LOSCFG_TASK_MEM_USED == 1)
|
||||||
|
"--------- "
|
||||||
|
#endif
|
||||||
"--------- ---------- ----------");
|
"--------- ---------- ----------");
|
||||||
PRINTK("\n");
|
PRINTK("\n");
|
||||||
}
|
}
|
||||||
|
@ -91,6 +97,17 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdTskInfoData(const LosTaskCB *allTas
|
||||||
UINT32 loop;
|
UINT32 loop;
|
||||||
UINT32 semId;
|
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) {
|
for (loop = 0; loop < g_taskMaxNum; ++loop) {
|
||||||
taskCB = allTaskArray + loop;
|
taskCB = allTaskArray + loop;
|
||||||
if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) {
|
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);
|
semId = OsGetSemID(taskCB);
|
||||||
|
|
||||||
PRINTK("%-23s%-20p0x%-5x", taskCB->taskName, taskCB->taskEntry, taskCB->taskID);
|
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,
|
PRINTK("%-11u%-13s0x%-11x 0x%-8x 0x%-10x ", taskCB->priority,
|
||||||
OsShellCmdConvertTskStatus(taskCB->taskStatus), taskCB->stackSize,
|
OsShellCmdConvertTskStatus(taskCB->taskStatus), taskCB->stackSize,
|
||||||
taskCB->stackPointer, taskCB->topOfStack, semId);
|
taskCB->stackPointer, taskCB->topOfStack, semId);
|
||||||
|
#endif
|
||||||
PRINTK("\n");
|
PRINTK("\n");
|
||||||
}
|
}
|
||||||
|
#if (LOSCFG_TASK_MEM_USED == 1)
|
||||||
|
(VOID)LOS_MemFree(m_aucSysMem0, getUsedSizeArray);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTskInfoGet(UINT32 taskId)
|
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTskInfoGet(UINT32 taskId)
|
||||||
|
|
|
@ -800,6 +800,14 @@ extern UINT8 *m_aucSysMem0;
|
||||||
#define LOSCFG_SHELL_PRIO 3
|
#define LOSCFG_SHELL_PRIO 3
|
||||||
#endif
|
#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
|
#ifdef __cplusplus
|
||||||
#if __cplusplus
|
#if __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -469,6 +469,7 @@ extern UINT32 LOS_MemIntegrityCheck(const VOID *pool);
|
||||||
extern VOID LOS_MemUnlockEnable(VOID *pool);
|
extern VOID LOS_MemUnlockEnable(VOID *pool);
|
||||||
|
|
||||||
extern UINT32 OsMemSystemInit(VOID);
|
extern UINT32 OsMemSystemInit(VOID);
|
||||||
|
extern VOID OsTaskMemUsed(VOID *pool, UINT32 *outArray, UINT32 arraySize);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
#if __cplusplus
|
#if __cplusplus
|
||||||
|
|
|
@ -111,6 +111,9 @@ STATIC INLINE UINT32 OsMemSlGet(UINT32 size, UINT32 fl)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The following is the memory algorithm related macro definition and interface implementation. */
|
/* 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 {
|
struct OsMemNodeHead {
|
||||||
#if (LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK == 1)
|
#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 *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 */
|
struct OsMemNodeHead *next; /* The next is used for sentinel node points to the expand node */
|
||||||
} ptr;
|
} 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 taskID : 6;
|
||||||
UINT32 sizeAndFlag : 26;
|
UINT32 sizeAndFlag : 26;
|
||||||
#else
|
#else
|
||||||
|
@ -180,7 +186,7 @@ struct OsMemPoolHead {
|
||||||
} while (0);
|
} while (0);
|
||||||
|
|
||||||
#define OS_MEM_NODE_MAGIC 0xABCDDCBA
|
#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_USED_FLAG (1U << 25)
|
||||||
#define OS_MEM_NODE_ALIGNED_FLAG (1U << 24)
|
#define OS_MEM_NODE_ALIGNED_FLAG (1U << 24)
|
||||||
#if (LOSCFG_MEM_LEAKCHECK == 1)
|
#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 INLINE UINT32 OsMemFree(struct OsMemPoolHead *pool, struct OsMemNodeHead *node);
|
||||||
STATIC VOID OsMemInfoPrint(VOID *pool);
|
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)
|
STATIC INLINE VOID OsMemNodeSetTaskID(struct OsMemUsedNodeHead *node)
|
||||||
{
|
{
|
||||||
node->header.taskID = LOS_CurTaskIDGet();
|
node->header.taskID = LOS_CurTaskIDGet();
|
||||||
}
|
}
|
||||||
#endif
|
#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)
|
#if (LOSCFG_MEM_WATERLINE == 1)
|
||||||
STATIC INLINE VOID OsMemWaterUsedRecord(struct OsMemPoolHead *pool, UINT32 size)
|
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;
|
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);
|
OsMemNodeSetTaskID(node);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1747,7 +1804,7 @@ STATIC VOID OsMemIntegrityCheckError(struct OsMemPoolHead *pool,
|
||||||
OsMemNodeInfo(tmpNode, preNode);
|
OsMemNodeInfo(tmpNode, preNode);
|
||||||
#endif
|
#endif
|
||||||
OsMemCheckInfoRecord(tmpNode, preNode);
|
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;
|
LosTaskCB *taskCB = NULL;
|
||||||
if (OS_MEM_NODE_GET_USED_FLAG(preNode->sizeAndFlag)) {
|
if (OS_MEM_NODE_GET_USED_FLAG(preNode->sizeAndFlag)) {
|
||||||
struct OsMemUsedNodeHead *usedNode = (struct OsMemUsedNodeHead *)preNode;
|
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_NODE_GET_USED_FLAG(tmpNode->sizeAndFlag)) {
|
||||||
if (!OS_MEM_MAGIC_VALID(tmpNode) ||
|
if (!OS_MEM_MAGIC_VALID(tmpNode) ||
|
||||||
!OsMemAddrValidCheck(pool, tmpNode->ptr.prev)) {
|
!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;
|
taskID = ((struct OsMemUsedNodeHead *)tmpNode)->header.taskID;
|
||||||
#endif
|
#endif
|
||||||
goto ERROUT;
|
goto ERROUT;
|
||||||
|
|
Loading…
Reference in New Issue