121#ifdef LOSCFG_KERNEL_CPUP
131#ifdef LOSCFG_CPUP_INCLUDE_IRQ
136#define INVALID_ID ((UINT32)-1)
138#define OS_CPUP_UNUSED 0x0U
139#define OS_CPUP_USED 0x1U
142#define CPUP_PRE_POS(pos) (((pos) == 0) ? (OS_CPUP_HISTORY_RECORD_NUM - 1) : ((pos) - 1))
143#define CPUP_POST_POS(pos) (((pos) == (OS_CPUP_HISTORY_RECORD_NUM - 1)) ? 0 : ((pos) + 1))
152 cycles = ((
UINT64)high << HIGH_BITS) + low;
172 UINT64 cycle, cycleIncrement;
176 SCHEDULER_LOCK(intSave);
183#ifdef LOSCFG_CPUP_INCLUDE_IRQ
185 if (
g_irqCpup[loop].status == OS_CPUP_UNUSED) {
193 processCB = OS_PCB_FROM_PID(loop);
201 taskCB = OS_TCB_FROM_TID(loop);
205 for (loop = 0; loop < LOSCFG_KERNEL_CORE_NUM; loop++) {
207 if (runTaskID == INVALID_ID) {
210 taskCB = OS_TCB_FROM_TID(runTaskID);
215#ifdef LOSCFG_CPUP_INCLUDE_IRQ
219 processCB = OS_PCB_FROM_PID(taskCB->
processID);
223 SCHEDULER_UNLOCK(intSave);
245#ifdef LOSCFG_CPUP_INCLUDE_IRQ
248 cpupMaxNum = OS_HWI_MAX_NUM * LOSCFG_KERNEL_CORE_NUM;
254 PRINT_ERR(
"OsCpupInit error\n");
255 return LOS_ERRNO_CPUP_NO_MEMORY;
258 (VOID)memset_s(
g_irqCpup, size, 0, size);
261 for (loop = 0; loop < LOSCFG_KERNEL_CORE_NUM; loop++) {
276 for (loop = 0; loop < (OS_CPUP_HISTORY_RECORD_NUM + 1); loop++) {
294 for (index = 0; index < (OS_CPUP_HISTORY_RECORD_NUM + 1); index++) {
299 processCB = OS_PCB_FROM_PID(index);
307 taskCB = OS_TCB_FROM_TID(index);
311#ifdef LOSCFG_CPUP_INCLUDE_IRQ
313 for (index = 0; index <
cpupMaxNum; index++) {
318 for (index = 0; index < LOSCFG_KERNEL_CORE_NUM; index++) {
334 LosTaskCB *runTask = OS_TCB_FROM_TID(runTaskID);
338 UINT64 cpuCycle, cycleIncrement;
347 cycleIncrement = cpuCycle - runTaskCpup->
startTime;
348#ifdef LOSCFG_CPUP_INCLUDE_IRQ
352 runTaskCpup->
allTime += cycleIncrement;
353 if (processCpup != NULL) {
354 processCpup->
allTime += cycleIncrement;
370 curPos = CPUP_PRE_POS(tmpPos);
378 prePos = CPUP_PRE_POS(curPos);
386 prePos = OS_CPUP_HISTORY_RECORD_NUM;
390 *curPosPointer = curPos;
391 *prePosPointer = prePos;
402 usage = (
UINT32)((LOS_CPUP_SINGLE_CORE_PRECISION * cpuCycle) / allCycle);
416 return LOS_ERRNO_CPUP_NO_INIT;
423 processCpup = OS_PCB_FROM_PID(idleProcessID)->processCpup;
441 SCHEDULER_LOCK(intSave);
443 SCHEDULER_UNLOCK(intSave);
454 return LOS_ERRNO_CPUP_NO_INIT;
457 if (OS_PID_CHECK_INVALID(pid)) {
458 return LOS_ERRNO_CPUP_ID_INVALID;
461 processCB = OS_PCB_FROM_PID(pid);
463 return LOS_ERRNO_CPUP_NO_CREATED;
467 return LOS_ERRNO_CPUP_ID_INVALID;
490 SCHEDULER_LOCK(intSave);
492 SCHEDULER_UNLOCK(intSave);
503 return LOS_ERRNO_CPUP_NO_INIT;
506 if (OS_TID_CHECK_INVALID(tid)) {
507 return LOS_ERRNO_CPUP_ID_INVALID;
510 taskCB = OS_TCB_FROM_TID(tid);
512 return LOS_ERRNO_CPUP_NO_CREATED;
535 SCHEDULER_LOCK(intSave);
537 SCHEDULER_UNLOCK(intSave);
544 return LOS_ERRNO_CPUP_NO_INIT;
547 if ((cpupInfo == NULL) || (len < (
sizeof(
CPUP_INFO_S) * number))) {
548 return LOS_ERRNO_CPUP_PTR_ERR;
551 (VOID)memset_s(cpupInfo, len, 0, len);
572 processCB = OS_PCB_FROM_PID(processID);
578 cpupInfo[processID].
status = OS_CPUP_USED;
589 SCHEDULER_LOCK(intSave);
591 SCHEDULER_UNLOCK(intSave);
615 taskCB = OS_TCB_FROM_TID(taskID);
621 taskCpup[taskID].
status = OS_CPUP_USED;
623 processCpupBase = OS_PCB_FROM_PID(taskCB->
processID)->processCpup;
624 if (processCpupBase != NULL) {
634#ifdef LOSCFG_CPUP_INCLUDE_IRQ
653 intTimeEnd = ((
UINT64)high << HIGH_BITS) + low;
656 irqCb->
status = OS_CPUP_USED;
660 if (irqCb->
count <= 100) {
667 if (usedTime > irqCb->
timeMax) {
694 if (
g_irqCpup[loop].status == OS_CPUP_UNUSED) {
720 SCHEDULER_LOCK(intSave);
722 SCHEDULER_UNLOCK(intSave);
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_HistoryTaskCpuUsage(UINT32 tid, UINT16 mode)
获取指定任务历史CPU占用率 指单个任务的CPU占用率,用于表示单个任务在一段时间内的闲忙程度。任务CPU占用率的有效表示范围为0~100, 其精度(可通过配置调整)为百分比。100表示在一段时间内系统...
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_GetAllIrqCpuUsage(UINT16 mode, CPUP_INFO_S *cpupInfo, UINT32 len)
获取系统所有中断的历史CPU占用率 指单个中断的CPU占用率,用于表示单个中断在一段时间内的闲忙程度。中断CPU占用率的有效表示范围为0~100, 其精度(可通过配置调整)为百分比。100表示在一段时间...
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_GetAllProcessCpuUsage(UINT16 mode, CPUP_INFO_S *cpupInfo, UINT32 len)
获取系统所有进程的历史CPU占用率
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_HistorySysCpuUsage(UINT16 mode)
获取系统历史CPU占用率 指周期时间内系统的CPU占用率,用于表示系统一段时间内的闲忙程度,也表示CPU的负载情况。系统CPU 占用率的有效表示范围为0~100,其精度(可通过配置调整)为百分比。100...
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_HistoryProcessCpuUsage(UINT32 pid, UINT16 mode)
获取指定进程历史CPU占用率 指单个进程的CPU占用率,用于表示单个进程在一段时间内的闲忙程度。进程CPU占用率的有效表示范围为0~100, 其精度(可通过配置调整)为百分比。100表示在一段时间内系统...
LITE_OS_SEC_TEXT_INIT VOID LOS_CpupReset(VOID)
Reset the data of CPU usage.
struct tagCpupInfo CPUP_INFO_S
STATIC INLINE VOID LOS_IntRestore(UINT32 intSave)
Restore interrupts. | 恢复到使用LOS_IntLock关闭所有中断之前的状态
STATIC INLINE UINT32 LOS_IntLock(VOID)
Disable all interrupts. | 关闭当前处理器所有中断响应
VOID * LOS_MemAlloc(VOID *pool, UINT32 size)
从指定内存池中申请size长度的内存,注意这可不是从内核堆空间中申请内存
UINT8 * m_aucSysMem0
异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStop(UINT16 swtmrID)
接口函数 停止定时器 参数定时任务ID
LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart(UINT16 swtmrID)
接口函数 启动定时器 参数定时任务ID
VOID(* SWTMR_PROC_FUNC)(UINTPTR arg)
Define the type of a callback function that handles software timer timeout.
LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate(UINT32 interval, UINT8 mode, SWTMR_PROC_FUNC handler, UINT16 *swtmrID, UINTPTR arg)
创建定时器,设置定时器的定时时长、定时器模式、回调函数,并返回定时器ID
LITE_OS_SEC_BSS UINT32 g_taskMaxNum
任务最大数量 默认128个
LITE_OS_SEC_TEXT_MINOR VOID LOS_GetCpuCycle(UINT32 *highCnt, UINT32 *lowCnt)
获取自系统启动以来的Cycle数
LITE_OS_SEC_TEXT_INIT VOID OsCpupGuard(VOID)
STATIC VOID OsResetCpup(OsCpupBase *cpup, UINT64 cycle)
LITE_OS_SEC_TEXT_MINOR UINT32 OsGetAllProcessCpuUsageUnsafe(UINT16 mode, CPUP_INFO_S *cpupInfo, UINT32 len)
STATIC UINT64 OsGetCpuCycle(VOID)
STATIC UINT32 OsCpupUsageParamCheckAndReset(CPUP_INFO_S *cpupInfo, UINT32 len, UINT32 number)
LITE_OS_SEC_BSS STATIC UINT16 cpupInitFlg
LITE_OS_SEC_TEXT_MINOR UINT32 OsGetAllProcessAndTaskCpuUsageUnsafe(UINT16 mode, CPUP_INFO_S *cpupInfo, UINT32 len)
LITE_OS_SEC_TEXT_MINOR VOID OsCpupIrqStart(UINT16 cpuid)
LITE_OS_SEC_BSS STATIC UINT64 cpupIntTimeStart[LOSCFG_KERNEL_CORE_NUM]
LITE_OS_SEC_BSS STATIC UINT32 cpupMaxNum
LITE_OS_SEC_BSS STATIC UINT64 cpuHistoryTime[OS_CPUP_HISTORY_RECORD_NUM+1]
LITE_OS_SEC_BSS STATIC UINT16 cpupSwtmrID
监测CPU使用情况定时器s
STATIC UINT32 OsHistorySysCpuUsageUnsafe(UINT16 mode)
LITE_OS_SEC_TEXT_MINOR OsIrqCpupCB * OsGetIrqCpupArrayBase(VOID)
VOID OsCpupCycleEndStart(UINT32 runTaskID, UINT32 newTaskID)
LOS_MODULE_INIT(OsCpupGuardCreator, LOS_INIT_LEVEL_KMOD_TASK)
LITE_OS_SEC_TEXT_MINOR UINT32 OsGetAllIrqCpuUsageUnsafe(UINT16 mode, CPUP_INFO_S *cpupInfo, UINT32 len)
STATIC INLINE UINT32 OsCalculateCpupUsage(const OsCpupBase *cpup, UINT16 pos, UINT16 prePos, UINT64 allCycle)
LITE_OS_SEC_TEXT_MINOR STATIC VOID OsCpupGetPos(UINT16 mode, UINT16 *curPosPointer, UINT16 *prePosPointer)
LITE_OS_SEC_BSS STATIC UINT16 cpupHisPos
STATIC UINT32 OsHistoryTaskCpuUsageUnsafe(UINT32 tid, UINT16 mode)
LITE_OS_SEC_BSS STATIC UINT64 cpupStartCycles
记录
LITE_OS_SEC_BSS STATIC UINT32 runningTasks[LOSCFG_KERNEL_CORE_NUM]
STATIC UINT32 OsHistoryProcessCpuUsageUnsafe(UINT32 pid, UINT16 mode)
LITE_OS_SEC_TEXT_INIT UINT32 OsCpupGuardCreator(VOID)
创建cpu使用统计定时器
LITE_OS_SEC_BSS UINT64 timeInIrqSwitch[LOSCFG_KERNEL_CORE_NUM]
LITE_OS_SEC_TEXT_MINOR VOID OsCpupIrqEnd(UINT16 cpuid, UINT32 intNum)
LITE_OS_SEC_BSS OsIrqCpupCB * g_irqCpup
LITE_OS_SEC_TEXT_INIT UINT32 OsCpupInit(VOID)
STATIC INLINE UINT32 ArchCurrCpuid(VOID)
LITE_OS_SEC_TEXT UINT32 OsGetIdleProcessID(VOID)
获取内核态空闲进程
LITE_OS_SEC_BSS UINT32 g_processMaxNum
进程最大数量,默认64个
STATIC INLINE BOOL OsProcessIsUnused(const LosProcessCB *processCB)
STATIC INLINE BOOL OsTaskIsUnused(const LosTaskCB *taskCB)
任务是否在使用
UINT64 historyTime[OS_CPUP_HISTORY_RECORD_NUM+1]