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("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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue