diff --git a/components/power/los_pm.c b/components/power/los_pm.c index 46f5cd92..a8bef3ea 100644 --- a/components/power/los_pm.c +++ b/components/power/los_pm.c @@ -255,7 +255,7 @@ STATIC UINT32 OsPmSuspendSleep(LosPmCB *pm) if (!tickTimerStop) { currTime = OsGetCurrSchedTimeCycle(); OsSchedResetSchedResponseTime(0); - OsSchedSetNextExpireTime(currTime, OS_INVALID, OS_SCHED_MAX_RESPONSE_TIME, TRUE); + OsSchedUpdateExpireTime(currTime, TRUE); } sysSuspend = OsPmCpuSuspend(pm); @@ -685,8 +685,10 @@ VOID OsPmUnfreezeTaskUnsafe(UINT32 taskID) } SET_SORTLIST_VALUE(&taskCB->sortList, OS_SORT_LINK_INVALID_TIME); - LOS_ListDelete(&taskCB->pendList); - taskCB->taskStatus &= ~(OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND_TIME); + if (taskCB->taskStatus & OS_TASK_STATUS_PEND) { + LOS_ListDelete(&taskCB->pendList); + } + taskCB->taskStatus &= ~(OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND_TIME | OS_TASK_STATUS_PEND); return; } diff --git a/components/power/los_pm.h b/components/power/los_pm.h index a3e7e3f9..762c7b4a 100644 --- a/components/power/los_pm.h +++ b/components/power/los_pm.h @@ -458,7 +458,6 @@ UINT32 LOS_PmReadLock(VOID); */ UINT32 LOS_PmSuspend(UINT32 wakeCount); -#if (LOSCFG_KERNEL_PM_DEBUG == 1) /** * @ingroup los_pm * @brief Output the locking information of the pm lock. @@ -477,4 +476,3 @@ UINT32 LOS_PmSuspend(UINT32 wakeCount); */ VOID LOS_PmLockInfoShow(VOID); #endif -#endif diff --git a/kernel/arch/risc-v/riscv32/gcc/los_timer.c b/kernel/arch/risc-v/riscv32/gcc/los_timer.c index 31c50338..0ac2dc6f 100644 --- a/kernel/arch/risc-v/riscv32/gcc/los_timer.c +++ b/kernel/arch/risc-v/riscv32/gcc/los_timer.c @@ -52,12 +52,17 @@ WEAK UINT32 HalTickStart(OS_TICK_HANDLER handler) WEAK VOID HalSysTickReload(UINT64 nextResponseTime) { + UINT64 timeMax = (UINT64)LOSCFG_BASE_CORE_TICK_RESPONSE_MAX - 1; UINT64 timer; UINT32 timerL, timerH; READ_UINT32(timerL, MTIMER); READ_UINT32(timerH, MTIMER + MTIMER_HI_OFFSET); timer = OS_COMBINED_64(timerH, timerL); - timer += nextResponseTime; + if ((timeMax - nextResponseTime) > timer) { + timer += nextResponseTime; + } else { + timer = timeMax; + } HalIrqDisable(RISCV_MACH_TIMER_IRQ); WRITE_UINT32(0xffffffff, MTIMERCMP + MTIMER_HI_OFFSET); diff --git a/kernel/include/los_sched.h b/kernel/include/los_sched.h index 87b8189b..df26da61 100644 --- a/kernel/include/los_sched.h +++ b/kernel/include/los_sched.h @@ -61,8 +61,6 @@ VOID OsSchedSetIdleTaskSchedParam(LosTaskCB *idleTask); UINT32 OsSchedSwtmrScanRegister(SchedScan func); -VOID OsSchedSetNextExpireTime(UINT64 startTime, UINT32 responseID, UINT64 taskEndTime, BOOL timeUpdate); - VOID OsSchedUpdateExpireTime(UINT64 startTime, BOOL timeUpdate); VOID OsSchedTaskDeQueue(LosTaskCB *taskCB); diff --git a/kernel/src/los_sched.c b/kernel/src/los_sched.c index b0d72d6d..f78c59cd 100644 --- a/kernel/src/los_sched.c +++ b/kernel/src/los_sched.c @@ -34,6 +34,9 @@ #include "los_tick.h" #include "los_debug.h" #include "los_hook.h" +#if (LOSCFG_KERNEL_PM == 1) +#include "los_pm.h" +#endif #ifdef __cplusplus #if __cplusplus @@ -179,7 +182,7 @@ STATIC INLINE VOID OsSchedTickReload(UINT64 nextResponseTime, UINT32 responseID, HalSysTickReload(nextResponseTime); } -VOID OsSchedSetNextExpireTime(UINT64 startTime, UINT32 responseID, UINT64 taskEndTime, BOOL timeUpdate) +STATIC INLINE VOID OsSchedSetNextExpireTime(UINT64 startTime, UINT32 responseID, UINT64 taskEndTime, BOOL timeUpdate) { UINT64 nextExpireTime; UINT64 nextResponseTime = 0; @@ -216,6 +219,7 @@ VOID OsSchedSetNextExpireTime(UINT64 startTime, UINT32 responseID, UINT64 taskEn VOID OsSchedUpdateExpireTime(UINT64 startTime, BOOL timeUpdate) { + BOOL isPmMode = FALSE; UINT64 endTime; LosTaskCB *runTask = g_losTask.runTask; @@ -223,7 +227,10 @@ VOID OsSchedUpdateExpireTime(UINT64 startTime, BOOL timeUpdate) return; } - if (runTask->taskID != g_idleTaskID) { +#if (LOSCFG_KERNEL_PM == 1) + isPmMode = OsIsPmMode(); +#endif + if ((runTask->taskID != g_idleTaskID) && !isPmMode) { INT32 timeSlice = (runTask->timeSlice <= OS_TIME_SLICE_MIN) ? OS_SCHED_TIME_SLICES : runTask->timeSlice; endTime = startTime + timeSlice; } else {