feat: 优化shell 命令
1.优化task 命令关中断时间较长的问题 2.优化hwi 命令,可以查看不同核的中断分布情况 3.丰富hiw 命令,统计每个中断在一定时间内的平均执行时间和最大执行时间 4.丰富swtmr 命令,在debug模式下支持查看各软件定时器的运行情况, 默认关闭 Signed-off-by: zhushengle <zhushengle@huawei.com> Change-Id: I01cfe50c918da51f9de5b460e9eb91a863e1de36
This commit is contained in:
@@ -41,7 +41,7 @@
|
||||
LITE_OS_SEC_BSS STATIC UINT16 cpupSwtmrID;
|
||||
LITE_OS_SEC_BSS STATIC UINT16 cpupInitFlg = 0;
|
||||
LITE_OS_SEC_BSS OsIrqCpupCB *g_irqCpup = NULL;
|
||||
LITE_OS_SEC_BSS STATIC UINT16 cpupMaxNum;
|
||||
LITE_OS_SEC_BSS STATIC UINT32 cpupMaxNum;
|
||||
LITE_OS_SEC_BSS STATIC UINT16 cpupHisPos = 0; /* current Sampling point of historyTime */
|
||||
LITE_OS_SEC_BSS STATIC UINT64 cpuHistoryTime[OS_CPUP_HISTORY_RECORD_NUM + 1];
|
||||
LITE_OS_SEC_BSS STATIC UINT32 runningTasks[LOSCFG_KERNEL_CORE_NUM];
|
||||
@@ -100,6 +100,9 @@ LITE_OS_SEC_TEXT_INIT VOID OsCpupGuard(VOID)
|
||||
|
||||
#ifdef LOSCFG_CPUP_INCLUDE_IRQ
|
||||
for (loop = 0; loop < cpupMaxNum; loop++) {
|
||||
if (g_irqCpup[loop].status == OS_CPUP_UNUSED) {
|
||||
continue;
|
||||
}
|
||||
g_irqCpup[loop].cpup.historyTime[prevPos] = g_irqCpup[loop].cpup.allTime;
|
||||
}
|
||||
#endif
|
||||
@@ -160,7 +163,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsCpupInit(VOID)
|
||||
#ifdef LOSCFG_CPUP_INCLUDE_IRQ
|
||||
UINT32 size;
|
||||
|
||||
cpupMaxNum = OS_HWI_MAX_NUM;
|
||||
cpupMaxNum = OS_HWI_MAX_NUM * LOSCFG_KERNEL_CORE_NUM;
|
||||
|
||||
/* every process has only one record, and it won't operated at the same time */
|
||||
size = cpupMaxNum * sizeof(OsIrqCpupCB);
|
||||
@@ -227,6 +230,7 @@ LITE_OS_SEC_TEXT_INIT VOID LOS_CpupReset(VOID)
|
||||
if (g_irqCpup != NULL) {
|
||||
for (index = 0; index < cpupMaxNum; index++) {
|
||||
OsResetCpup(&g_irqCpup[index].cpup, cycle);
|
||||
g_irqCpup[index].timeMax = 0;
|
||||
}
|
||||
|
||||
for (index = 0; index < LOSCFG_KERNEL_CORE_NUM; index++) {
|
||||
@@ -520,31 +524,41 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsGetAllProcessAndTaskCpuUsageUnsafe(UINT16 mode,
|
||||
}
|
||||
|
||||
#ifdef LOSCFG_CPUP_INCLUDE_IRQ
|
||||
LITE_OS_SEC_TEXT_MINOR VOID OsCpupIrqStart(VOID)
|
||||
LITE_OS_SEC_TEXT_MINOR VOID OsCpupIrqStart(UINT16 cpuId)
|
||||
{
|
||||
UINT32 high;
|
||||
UINT32 low;
|
||||
|
||||
LOS_GetCpuCycle(&high, &low);
|
||||
cpupIntTimeStart[ArchCurrCpuid()] = ((UINT64)high << HIGH_BITS) + low;
|
||||
cpupIntTimeStart[cpuId] = ((UINT64)high << HIGH_BITS) + low;
|
||||
return;
|
||||
}
|
||||
|
||||
LITE_OS_SEC_TEXT_MINOR VOID OsCpupIrqEnd(UINT32 intNum)
|
||||
LITE_OS_SEC_TEXT_MINOR VOID OsCpupIrqEnd(UINT16 cpuId, UINT32 intNum)
|
||||
{
|
||||
UINT32 high;
|
||||
UINT32 low;
|
||||
UINT64 intTimeEnd;
|
||||
UINT32 cpuID = ArchCurrCpuid();
|
||||
UINT64 usedTime;
|
||||
|
||||
LOS_GetCpuCycle(&high, &low);
|
||||
intTimeEnd = ((UINT64)high << HIGH_BITS) + low;
|
||||
|
||||
g_irqCpup[intNum].id = intNum;
|
||||
g_irqCpup[intNum].status = OS_CPUP_USED;
|
||||
timeInIrqSwitch[cpuID] += (intTimeEnd - cpupIntTimeStart[cpuID]);
|
||||
g_irqCpup[intNum].cpup.allTime += (intTimeEnd - cpupIntTimeStart[cpuID]);
|
||||
|
||||
OsIrqCpupCB *irqCb = &g_irqCpup[(intNum * LOSCFG_KERNEL_CORE_NUM) + cpuId];
|
||||
irqCb->id = intNum;
|
||||
irqCb->status = OS_CPUP_USED;
|
||||
usedTime = intTimeEnd - cpupIntTimeStart[cpuId];
|
||||
timeInIrqSwitch[cpuId] += usedTime;
|
||||
irqCb->cpup.allTime += usedTime;
|
||||
if (irqCb->count <= 100) { /* Take 100 samples */
|
||||
irqCb->allTime += usedTime;
|
||||
irqCb->count++;
|
||||
} else {
|
||||
irqCb->allTime = 0;
|
||||
irqCb->count = 0;
|
||||
}
|
||||
if (usedTime > irqCb->timeMax) {
|
||||
irqCb->timeMax = usedTime;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -59,6 +59,9 @@ typedef struct {
|
||||
typedef struct {
|
||||
UINT32 id; /**< irq ID */
|
||||
UINT16 status; /**< irq status */
|
||||
UINT64 allTime;
|
||||
UINT64 timeMax;
|
||||
UINT64 count;
|
||||
OsCpupBase cpup; /**< irq cpup base */
|
||||
} OsIrqCpupCB;
|
||||
|
||||
@@ -70,8 +73,8 @@ extern UINT32 OsGetAllProcessCpuUsageUnsafe(UINT16 mode, CPUP_INFO_S *cpupInfo,
|
||||
extern UINT32 OsGetAllProcessAndTaskCpuUsageUnsafe(UINT16 mode, CPUP_INFO_S *cpupInfo, UINT32 len);
|
||||
#ifdef LOSCFG_CPUP_INCLUDE_IRQ
|
||||
extern UINT32 OsGetAllIrqCpuUsageUnsafe(UINT16 mode, CPUP_INFO_S *cpupInfo, UINT32 len);
|
||||
extern VOID OsCpupIrqStart(VOID);
|
||||
extern VOID OsCpupIrqEnd(UINT32);
|
||||
extern VOID OsCpupIrqStart(UINT16);
|
||||
extern VOID OsCpupIrqEnd(UINT16, UINT32);
|
||||
extern OsIrqCpupCB *OsGetIrqCpupArrayBase(VOID);
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user