diff --git a/arch/arm/arm9/gcc/los_timer.c b/arch/arm/arm9/gcc/los_timer.c index ea2804fc..1b13f9be 100644 --- a/arch/arm/arm9/gcc/los_timer.c +++ b/arch/arm/arm9/gcc/los_timer.c @@ -52,7 +52,7 @@ #define OS_TIMER_READ_VAL_ADDR (OS_TIMER_REG_BASE + 20) STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler); -STATIC VOID SysTickReload(UINT64 nextResponseTime); +STATIC UINT64 SysTickReload(UINT64 nextResponseTime); STATIC UINT64 SysTickCycleGet(UINT32 *period); STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); @@ -60,6 +60,7 @@ STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { .freq = 0, .irqNum = OS_TIMER_IRQ_NUM, + .periodMax = LOSCFG_BASE_CORE_TICK_RESPONSE_MAX, .init = SysTickStart, .getCycle = SysTickCycleGet, .reload = SysTickReload, @@ -107,12 +108,17 @@ STATIC VOID SysTickClockIrqClear(VOID) } while (status & mask); } -STATIC VOID SysTickReload(UINT64 nextResponseTime) +STATIC UINT64 SysTickReload(UINT64 nextResponseTime) { + if (nextResponseTime > g_archTickTimer.periodMax) { + nextResponseTime = g_archTickTimer.periodMax; + } + SysTickLock(); - WRITE_UINT32(nextResponseTime, OS_TIMER_PERIOD_REG_ADDR); + WRITE_UINT32((UINT32)nextResponseTime, OS_TIMER_PERIOD_REG_ADDR); SysTickClockIrqClear(); SysTickUnlock(); + return nextResponseTime; } STATIC UINT64 SysTickCycleGet(UINT32 *period) diff --git a/arch/arm/cortex-m3/keil/los_timer.c b/arch/arm/cortex-m3/keil/los_timer.c index 4ddfff1b..57254186 100644 --- a/arch/arm/cortex-m3/keil/los_timer.c +++ b/arch/arm/cortex-m3/keil/los_timer.c @@ -37,7 +37,7 @@ #include "los_debug.h" STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler); -STATIC VOID SysTickReload(UINT64 nextResponseTime); +STATIC UINT64 SysTickReload(UINT64 nextResponseTime); STATIC UINT64 SysTickCycleGet(UINT32 *period); STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); @@ -45,6 +45,7 @@ STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { .freq = 0, .irqNum = SysTick_IRQn, + .periodMax = LOSCFG_BASE_CORE_TICK_RESPONSE_MAX, .init = SysTickStart, .getCycle = SysTickCycleGet, .reload = SysTickReload, @@ -76,13 +77,19 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) return LOS_OK; } -STATIC VOID SysTickReload(UINT64 nextResponseTime) +STATIC UINT64 SysTickReload(UINT64 nextResponseTime) { + if (nextResponseTime > g_archTickTimer.periodMax) { + nextResponseTime = g_archTickTimer.periodMax; + } + SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ NVIC_ClearPendingIRQ(SysTick_IRQn); SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; + + return nextResponseTime; } STATIC UINT64 SysTickCycleGet(UINT32 *period) diff --git a/arch/arm/cortex-m33/gcc/NTZ/los_timer.c b/arch/arm/cortex-m33/gcc/NTZ/los_timer.c index dcd19afc..229e7a51 100755 --- a/arch/arm/cortex-m33/gcc/NTZ/los_timer.c +++ b/arch/arm/cortex-m33/gcc/NTZ/los_timer.c @@ -36,7 +36,7 @@ #include "los_debug.h" STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler); -STATIC VOID SysTickReload(UINT64 nextResponseTime); +STATIC UINT64 SysTickReload(UINT64 nextResponseTime); STATIC UINT64 SysTickCycleGet(UINT32 *period); STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); @@ -44,6 +44,7 @@ STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { .freq = 0, .irqNum = SysTick_IRQn, + .periodMax = LOSCFG_BASE_CORE_TICK_RESPONSE_MAX, .init = SysTickStart, .getCycle = SysTickCycleGet, .reload = SysTickReload, @@ -75,13 +76,18 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) return LOS_OK; } -STATIC VOID SysTickReload(UINT64 nextResponseTime) +STATIC UINT64 SysTickReload(UINT64 nextResponseTime) { + if (nextResponseTime > g_archTickTimer.periodMax) { + nextResponseTime = g_archTickTimer.periodMax; + } + SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ NVIC_ClearPendingIRQ(SysTick_IRQn); SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; + return nextResponseTime; } STATIC UINT64 SysTickCycleGet(UINT32 *period) diff --git a/arch/arm/cortex-m33/gcc/TZ/non_secure/los_timer.c b/arch/arm/cortex-m33/gcc/TZ/non_secure/los_timer.c index 6c74e178..0432c737 100755 --- a/arch/arm/cortex-m33/gcc/TZ/non_secure/los_timer.c +++ b/arch/arm/cortex-m33/gcc/TZ/non_secure/los_timer.c @@ -35,7 +35,7 @@ #include "los_arch_interrupt.h" STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler); -STATIC VOID SysTickReload(UINT64 nextResponseTime); +STATIC UINT64 SysTickReload(UINT64 nextResponseTime); STATIC UINT64 SysTickCycleGet(UINT32 *period); STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); @@ -43,6 +43,7 @@ STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { .freq = 0, .irqNum = SysTick_IRQn, + .periodMax = LOSCFG_BASE_CORE_TICK_RESPONSE_MAX, .init = SysTickStart, .getCycle = SysTickCycleGet, .reload = SysTickReload, @@ -74,13 +75,18 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) return LOS_OK; } -STATIC VOID SysTickReload(UINT64 nextResponseTime) +STATIC UINT64 SysTickReload(UINT64 nextResponseTime) { + if (nextResponseTime > g_archTickTimer.periodMax) { + nextResponseTime = g_archTickTimer.periodMax; + } + SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ NVIC_ClearPendingIRQ(SysTick_IRQn); SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; + return nextResponseTime; } STATIC UINT64 SysTickCycleGet(UINT32 *period) diff --git a/arch/arm/cortex-m33/iar/NTZ/los_timer.c b/arch/arm/cortex-m33/iar/NTZ/los_timer.c index ecd0c1c5..d3eb9b21 100644 --- a/arch/arm/cortex-m33/iar/NTZ/los_timer.c +++ b/arch/arm/cortex-m33/iar/NTZ/los_timer.c @@ -36,7 +36,7 @@ #include "los_debug.h" STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler); -STATIC VOID SysTickReload(UINT64 nextResponseTime); +STATIC UINT64 SysTickReload(UINT64 nextResponseTime); STATIC UINT64 SysTickCycleGet(UINT32 *period); STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); @@ -44,6 +44,7 @@ STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { .freq = 0, .irqNum = SysTick_IRQn, + .periodMax = LOSCFG_BASE_CORE_TICK_RESPONSE_MAX, .init = SysTickStart, .getCycle = SysTickCycleGet, .reload = SysTickReload, @@ -75,13 +76,17 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) return LOS_OK; } -STATIC VOID SysTickReload(UINT64 nextResponseTime) +STATIC UINT64 SysTickReload(UINT64 nextResponseTime) { + if (nextResponseTime > g_archTickTimer.periodMax) { + nextResponseTime = g_archTickTimer.periodMax; + } SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ NVIC_ClearPendingIRQ(SysTick_IRQn); SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; + return nextResponseTime; } STATIC UINT64 SysTickCycleGet(UINT32 *period) diff --git a/arch/arm/cortex-m33/iar/TZ/non_secure/los_timer.c b/arch/arm/cortex-m33/iar/TZ/non_secure/los_timer.c index 2ce8096b..361ac086 100644 --- a/arch/arm/cortex-m33/iar/TZ/non_secure/los_timer.c +++ b/arch/arm/cortex-m33/iar/TZ/non_secure/los_timer.c @@ -36,7 +36,7 @@ #include "los_debug.h" STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler); -STATIC VOID SysTickReload(UINT64 nextResponseTime); +STATIC UINT64 SysTickReload(UINT64 nextResponseTime); STATIC UINT64 SysTickCycleGet(UINT32 *period); STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); @@ -44,6 +44,7 @@ STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { .freq = 0, .irqNum = SysTick_IRQn, + .periodMax = LOSCFG_BASE_CORE_TICK_RESPONSE_MAX, .init = SysTickStart, .getCycle = SysTickCycleGet, .reload = SysTickReload, @@ -75,13 +76,18 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) return LOS_OK; } -STATIC VOID SysTickReload(UINT64 nextResponseTime) +STATIC UINT64 SysTickReload(UINT64 nextResponseTime) { + if (nextResponseTime > g_archTickTimer.periodMax) { + nextResponseTime = g_archTickTimer.periodMax; + } + SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ NVIC_ClearPendingIRQ(SysTick_IRQn); SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; + return nextResponseTime; } STATIC UINT64 SysTickCycleGet(UINT32 *period) diff --git a/arch/arm/cortex-m4/gcc/los_timer.c b/arch/arm/cortex-m4/gcc/los_timer.c index e77d880f..45ae62c5 100644 --- a/arch/arm/cortex-m4/gcc/los_timer.c +++ b/arch/arm/cortex-m4/gcc/los_timer.c @@ -36,7 +36,7 @@ #include "los_debug.h" STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler); -STATIC VOID SysTickReload(UINT64 nextResponseTime); +STATIC UINT64 SysTickReload(UINT64 nextResponseTime); STATIC UINT64 SysTickCycleGet(UINT32 *period); STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); @@ -44,6 +44,7 @@ STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { .freq = 0, .irqNum = SysTick_IRQn, + .periodMax = LOSCFG_BASE_CORE_TICK_RESPONSE_MAX, .init = SysTickStart, .getCycle = SysTickCycleGet, .reload = SysTickReload, @@ -75,13 +76,17 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) return LOS_OK; } -STATIC VOID SysTickReload(UINT64 nextResponseTime) +STATIC UINT64 SysTickReload(UINT64 nextResponseTime) { + if (nextResponseTime > g_archTickTimer.periodMax) { + nextResponseTime = g_archTickTimer.periodMax; + } SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ NVIC_ClearPendingIRQ(SysTick_IRQn); SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; + return nextResponseTime; } STATIC UINT64 SysTickCycleGet(UINT32 *period) diff --git a/arch/arm/cortex-m4/iar/los_timer.c b/arch/arm/cortex-m4/iar/los_timer.c index dcd19afc..99721b87 100644 --- a/arch/arm/cortex-m4/iar/los_timer.c +++ b/arch/arm/cortex-m4/iar/los_timer.c @@ -36,7 +36,7 @@ #include "los_debug.h" STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler); -STATIC VOID SysTickReload(UINT64 nextResponseTime); +STATIC UINT64 SysTickReload(UINT64 nextResponseTime); STATIC UINT64 SysTickCycleGet(UINT32 *period); STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); @@ -44,6 +44,7 @@ STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { .freq = 0, .irqNum = SysTick_IRQn, + .periodMax = LOSCFG_BASE_CORE_TICK_RESPONSE_MAX, .init = SysTickStart, .getCycle = SysTickCycleGet, .reload = SysTickReload, @@ -75,13 +76,17 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) return LOS_OK; } -STATIC VOID SysTickReload(UINT64 nextResponseTime) +STATIC UINT64 SysTickReload(UINT64 nextResponseTime) { + if (nextResponseTime > g_archTickTimer.periodMax) { + nextResponseTime = g_archTickTimer.periodMax; + } SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ NVIC_ClearPendingIRQ(SysTick_IRQn); SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; + return nextResponseTime; } STATIC UINT64 SysTickCycleGet(UINT32 *period) diff --git a/arch/arm/cortex-m55/gcc/NTZ/los_timer.c b/arch/arm/cortex-m55/gcc/NTZ/los_timer.c index efa2b4d4..538c1f37 100755 --- a/arch/arm/cortex-m55/gcc/NTZ/los_timer.c +++ b/arch/arm/cortex-m55/gcc/NTZ/los_timer.c @@ -43,6 +43,7 @@ STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { .freq = 0, .irqNum = SysTick_IRQn, + .periodMax = LOSCFG_BASE_CORE_TICK_RESPONSE_MAX, .init = SysTickStart, .getCycle = SysTickCycleGet, .reload = SysTickReload, @@ -74,13 +75,18 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) return LOS_OK; } -STATIC VOID SysTickReload(UINT64 nextResponseTime) +STATIC UINT64 SysTickReload(UINT64 nextResponseTime) { + if (nextResponseTime > g_archTickTimer.periodMax) { + nextResponseTime = g_archTickTimer.periodMax; + } + SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ NVIC_ClearPendingIRQ(SysTick_IRQn); SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; + return nextResponseTime; } STATIC UINT64 SysTickCycleGet(UINT32 *period) diff --git a/arch/arm/cortex-m7/gcc/los_timer.c b/arch/arm/cortex-m7/gcc/los_timer.c index dcd19afc..99721b87 100644 --- a/arch/arm/cortex-m7/gcc/los_timer.c +++ b/arch/arm/cortex-m7/gcc/los_timer.c @@ -36,7 +36,7 @@ #include "los_debug.h" STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler); -STATIC VOID SysTickReload(UINT64 nextResponseTime); +STATIC UINT64 SysTickReload(UINT64 nextResponseTime); STATIC UINT64 SysTickCycleGet(UINT32 *period); STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); @@ -44,6 +44,7 @@ STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { .freq = 0, .irqNum = SysTick_IRQn, + .periodMax = LOSCFG_BASE_CORE_TICK_RESPONSE_MAX, .init = SysTickStart, .getCycle = SysTickCycleGet, .reload = SysTickReload, @@ -75,13 +76,17 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) return LOS_OK; } -STATIC VOID SysTickReload(UINT64 nextResponseTime) +STATIC UINT64 SysTickReload(UINT64 nextResponseTime) { + if (nextResponseTime > g_archTickTimer.periodMax) { + nextResponseTime = g_archTickTimer.periodMax; + } SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ NVIC_ClearPendingIRQ(SysTick_IRQn); SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; + return nextResponseTime; } STATIC UINT64 SysTickCycleGet(UINT32 *period) diff --git a/arch/arm/cortex-m7/iar/los_timer.c b/arch/arm/cortex-m7/iar/los_timer.c index dcd19afc..99721b87 100644 --- a/arch/arm/cortex-m7/iar/los_timer.c +++ b/arch/arm/cortex-m7/iar/los_timer.c @@ -36,7 +36,7 @@ #include "los_debug.h" STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler); -STATIC VOID SysTickReload(UINT64 nextResponseTime); +STATIC UINT64 SysTickReload(UINT64 nextResponseTime); STATIC UINT64 SysTickCycleGet(UINT32 *period); STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); @@ -44,6 +44,7 @@ STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { .freq = 0, .irqNum = SysTick_IRQn, + .periodMax = LOSCFG_BASE_CORE_TICK_RESPONSE_MAX, .init = SysTickStart, .getCycle = SysTickCycleGet, .reload = SysTickReload, @@ -75,13 +76,17 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) return LOS_OK; } -STATIC VOID SysTickReload(UINT64 nextResponseTime) +STATIC UINT64 SysTickReload(UINT64 nextResponseTime) { + if (nextResponseTime > g_archTickTimer.periodMax) { + nextResponseTime = g_archTickTimer.periodMax; + } SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ NVIC_ClearPendingIRQ(SysTick_IRQn); SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; + return nextResponseTime; } STATIC UINT64 SysTickCycleGet(UINT32 *period) diff --git a/arch/csky/v2/gcc/los_timer.c b/arch/csky/v2/gcc/los_timer.c index a57013c8..f572c12a 100644 --- a/arch/csky/v2/gcc/los_timer.c +++ b/arch/csky/v2/gcc/los_timer.c @@ -53,7 +53,7 @@ typedef struct { #define TIM_INT_NUM 1 STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler); -STATIC VOID SysTickReload(UINT64 nextResponseTime); +STATIC UINT64 SysTickReload(UINT64 nextResponseTime); STATIC UINT64 SysTickCycleGet(UINT32 *period); STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); @@ -61,6 +61,7 @@ STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { .freq = 0, .irqNum = TIM_INT_NUM, + .periodMax = LOSCFG_BASE_CORE_TICK_RESPONSE_MAX, .init = SysTickStart, .getCycle = SysTickCycleGet, .reload = SysTickReload, @@ -98,12 +99,16 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) return LOS_OK; } -STATIC VOID SysTickReload(UINT64 nextResponseTime) +STATIC UINT64 SysTickReload(UINT64 nextResponseTime) { + if (nextResponseTime > g_archTickTimer.periodMax) { + nextResponseTime = g_archTickTimer.periodMax; + } SysTick->CTRL &= ~CORETIM_ENABLE; SysTick->LOAD = (UINT32)(nextResponseTime - 1UL); /* set reload register */ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ SysTick->CTRL |= CORETIM_ENABLE; + return nextResponseTime; } STATIC UINT64 SysTickCycleGet(UINT32 *period) diff --git a/arch/include/los_timer.h b/arch/include/los_timer.h index ef9af2fb..655cda46 100644 --- a/arch/include/los_timer.h +++ b/arch/include/los_timer.h @@ -56,9 +56,10 @@ extern "C" { typedef struct { UINT32 freq; INT32 irqNum; + UINT64 periodMax; UINT32 (*init)(HWI_PROC_FUNC tickHandler); UINT64 (*getCycle)(UINT32 *period); - VOID (*reload)(UINT64 time); + UINT64 (*reload)(UINT64 time); VOID (*lock)(VOID); VOID (*unlock)(VOID); HWI_PROC_FUNC tickHandler; diff --git a/arch/risc-v/nuclei/gcc/los_timer.c b/arch/risc-v/nuclei/gcc/los_timer.c index 5a06ee4e..8a6dd86c 100644 --- a/arch/risc-v/nuclei/gcc/los_timer.c +++ b/arch/risc-v/nuclei/gcc/los_timer.c @@ -47,7 +47,7 @@ STATIC HWI_PROC_FUNC g_sysTickHandler = (HWI_PROC_FUNC)NULL; extern UINT32 g_intCount; STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler); -STATIC VOID SysTickReload(UINT64 nextResponseTime); +STATIC UINT64 SysTickReload(UINT64 nextResponseTime); STATIC UINT64 SysTickCycleGet(UINT32 *period); STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); @@ -55,6 +55,7 @@ STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { .freq = 0, .irqNum = SysTimer_IRQn, + .periodMax = LOSCFG_BASE_CORE_TICK_RESPONSE_MAX, .init = SysTickStart, .getCycle = SysTickCycleGet, .reload = SysTickReload, @@ -95,9 +96,10 @@ void ArchTickSysTickHandler(void) } } -STATIC VOID SysTickReload(UINT64 nextResponseTime) +STATIC UINT64 SysTickReload(UINT64 nextResponseTime) { SysTick_Reload(nextResponseTime); + return nextResponseTime; } STATIC UINT64 SysTickCycleGet(UINT32 *period) diff --git a/arch/risc-v/riscv32/gcc/los_timer.c b/arch/risc-v/riscv32/gcc/los_timer.c index 3c8a8715..87ad2310 100644 --- a/arch/risc-v/riscv32/gcc/los_timer.c +++ b/arch/risc-v/riscv32/gcc/los_timer.c @@ -39,7 +39,7 @@ #include "los_debug.h" STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler); -STATIC VOID SysTickReload(UINT64 nextResponseTime); +STATIC UINT64 SysTickReload(UINT64 nextResponseTime); STATIC UINT64 SysTickCycleGet(UINT32 *period); STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); @@ -47,6 +47,7 @@ STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { .freq = 0, .irqNum = RISCV_MACH_TIMER_IRQ, + .periodMax = LOSCFG_BASE_CORE_TICK_RESPONSE_MAX, .init = SysTickStart, .getCycle = SysTickCycleGet, .reload = SysTickReload, @@ -75,7 +76,7 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) return LOS_OK; } -STATIC VOID SysTickReload(UINT64 nextResponseTime) +STATIC UINT64 SysTickReload(UINT64 nextResponseTime) { UINT64 timeMax = (UINT64)LOSCFG_BASE_CORE_TICK_RESPONSE_MAX - 1; UINT64 timer; @@ -94,6 +95,7 @@ STATIC VOID SysTickReload(UINT64 nextResponseTime) WRITE_UINT32((UINT32)timer, MTIMERCMP); WRITE_UINT32((UINT32)(timer >> SHIFT_32_BIT), MTIMERCMP + MTIMER_HI_OFFSET); HalIrqEnable(RISCV_MACH_TIMER_IRQ); + return nextResponseTime; } STATIC UINT64 SysTickCycleGet(UINT32 *period) diff --git a/arch/xtensa/lx6/gcc/los_timer.c b/arch/xtensa/lx6/gcc/los_timer.c index 5b1944fb..0884d252 100644 --- a/arch/xtensa/lx6/gcc/los_timer.c +++ b/arch/xtensa/lx6/gcc/los_timer.c @@ -37,7 +37,7 @@ #include "los_debug.h" STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler); -STATIC VOID SysTickReload(UINT64 nextResponseTime); +STATIC UINT64 SysTickReload(UINT64 nextResponseTime); STATIC UINT64 SysTickCycleGet(UINT32 *period); STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); @@ -45,6 +45,7 @@ STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { .freq = 0, .irqNum = OS_TICK_INT_NUM, + .periodMax = LOSCFG_BASE_CORE_TICK_RESPONSE_MAX, .init = SysTickStart, .getCycle = SysTickCycleGet, .reload = SysTickReload, @@ -77,12 +78,17 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) return LOS_OK; } -STATIC VOID SysTickReload(UINT64 nextResponseTime) +STATIC UINT64 SysTickReload(UINT64 nextResponseTime) { UINT32 timerL; + if (nextResponseTime > g_archTickTimer.periodMax) { + nextResponseTime = g_archTickTimer.periodMax; + } + timerL = GetCcount(); timerL += nextResponseTime; SetCcompare(timerL); + return nextResponseTime; } STATIC UINT64 SysTickCycleGet(UINT32 *period) diff --git a/components/power/los_pm.c b/components/power/los_pm.c index 86a6d9e3..f5662019 100644 --- a/components/power/los_pm.c +++ b/components/power/los_pm.c @@ -31,8 +31,11 @@ #include "los_pm.h" #include "securec.h" -#include "los_sched.h" #include "los_timer.h" +#include "los_task.h" +#include "los_tick.h" +#include "los_event.h" +#include "los_sched.h" #include "los_memory.h" #include "los_swtmr.h" @@ -70,7 +73,6 @@ typedef struct { STATIC EVENT_CB_S g_pmEvent; STATIC LosPmCB g_pmCB; STATIC LosPmSysctrl g_sysctrl; -STATIC UINT64 g_pmSleepTime; STATIC VOID OsPmSysctrlInit(VOID) { @@ -122,7 +124,7 @@ STATIC BOOL OsPmTickTimerStop(LosPmCB *pm) { #if (LOSCFG_BASE_CORE_TICK_WTIMER == 0) UINT64 sleepCycle; - UINT64 realSleepTime = g_pmSleepTime; + UINT64 realSleepTime = OsSchedGetNextExpireTime(OsGetCurrSchedTimeCycle()); #endif LosPmTickTimer *tickTimer = pm->tickTimer; @@ -239,7 +241,6 @@ STATIC UINT32 OsPmSuspendSleep(LosPmCB *pm) LOS_SysSleepEnum mode; UINT32 prepare = 0; BOOL tickTimerStop = FALSE; - UINT64 currTime; ret = OsPmSuspendCheck(pm, &sysSuspendEarly, &deviceSuspend, &mode); if (ret != LOS_OK) { @@ -261,9 +262,8 @@ STATIC UINT32 OsPmSuspendSleep(LosPmCB *pm) tickTimerStop = OsPmTickTimerStop(pm); if (!tickTimerStop) { - currTime = OsGetCurrSchedTimeCycle(); OsSchedResetSchedResponseTime(0); - OsSchedUpdateExpireTime(currTime); + OsSchedUpdateExpireTime(); } OsPmCpuSuspend(pm); @@ -723,11 +723,6 @@ UINT32 LOS_PmSuspend(UINT32 wakeCount) return OsPmSuspendSleep(&g_pmCB); } -STATIC VOID OsPmSleepTimeSet(UINT64 sleepTime) -{ - g_pmSleepTime = sleepTime; -} - BOOL OsIsPmMode(VOID) { LosPmCB *pm = &g_pmCB; @@ -752,11 +747,6 @@ UINT32 OsPmInit(VOID) LOS_ListInit(&pm->lockList); (VOID)LOS_EventInit(&g_pmEvent); - ret = OsSchedRealSleepTimeSet(OsPmSleepTimeSet); - if (ret != LOS_OK) { - return ret; - } - ret = OsPmEnterHandlerSet(OsPmNormalSleep); if (ret != LOS_OK) { return ret; diff --git a/kernel/include/los_sched.h b/kernel/include/los_sched.h index 1706ef7d..68650827 100644 --- a/kernel/include/los_sched.h +++ b/kernel/include/los_sched.h @@ -43,21 +43,20 @@ extern "C" { #endif /* __cplusplus */ #define OS_SCHED_MINI_PERIOD (g_sysClock / LOSCFG_BASE_CORE_TICK_PER_SECOND_MINI) -#define OS_TICK_RESPONSE_PRECISION (UINT32)((OS_SCHED_MINI_PERIOD * 75) / 100) #define OS_SCHED_MAX_RESPONSE_TIME (UINT64)(((UINT64)-1) - 1U) extern UINT32 g_taskScheduled; typedef BOOL (*SchedScan)(VOID); -extern UINT64 g_sysSchedStartTime; - VOID OsSchedResetSchedResponseTime(UINT64 responseTime); VOID OsSchedSetIdleTaskSchedParam(LosTaskCB *idleTask); UINT32 OsSchedSwtmrScanRegister(SchedScan func); -VOID OsSchedUpdateExpireTime(UINT64 startTime); +VOID OsSchedUpdateExpireTime(VOID); + +UINT64 OsSchedGetNextExpireTime(UINT64 startTime); VOID OsSchedTaskDeQueue(LosTaskCB *taskCB); @@ -89,15 +88,9 @@ BOOL OsSchedTaskSwitch(VOID); LosTaskCB *OsGetTopTask(VOID); -UINT32 OsSchedRealSleepTimeSet(VOID (*func)(UINT64)); - STATIC INLINE UINT64 OsGetCurrSchedTimeCycle(VOID) { - if (g_sysSchedStartTime != OS_64BIT_MAX) { - return (LOS_SysCycleGet() - g_sysSchedStartTime); - } - - return 0; + return LOS_SysCycleGet(); } /** diff --git a/kernel/include/los_sortlink.h b/kernel/include/los_sortlink.h index 551f5ca9..dfca4d3a 100644 --- a/kernel/include/los_sortlink.h +++ b/kernel/include/los_sortlink.h @@ -55,10 +55,15 @@ typedef struct { LOS_DL_LIST sortLink; } SortLinkAttribute; +extern SortLinkAttribute g_taskSortLink; +extern SortLinkAttribute g_swtmrSortLink; + #define OS_SORT_LINK_INVALID_TIME ((UINT64)-1) #define SET_SORTLIST_VALUE(sortList, value) (((SortLinkList *)(sortList))->responseTime = (value)) #define GET_SORTLIST_VALUE(sortList) (((SortLinkList *)(sortList))->responseTime) +#define OS_SORT_LINK_UINT64_MAX ((UINT64)-1) + STATIC INLINE UINT64 OsSortLinkGetRemainTime(UINT64 currTime, const SortLinkList *targetSortList) { if (currTime >= targetSortList->responseTime) { @@ -67,14 +72,42 @@ STATIC INLINE UINT64 OsSortLinkGetRemainTime(UINT64 currTime, const SortLinkList return (targetSortList->responseTime - currTime); } +STATIC INLINE VOID OsDeleteNodeSortLink(SortLinkList *sortList) +{ + LOS_ListDelete(&sortList->sortLinkNode); + SET_SORTLIST_VALUE(sortList, OS_SORT_LINK_INVALID_TIME); +} + +STATIC INLINE UINT64 GetSortLinkNextExpireTime(SortLinkAttribute *sortHeader, UINT64 startTime, UINT32 tickPrecision) +{ + LOS_DL_LIST *head = &sortHeader->sortLink; + LOS_DL_LIST *list = head->pstNext; + + if (LOS_ListEmpty(head)) { + return OS_SORT_LINK_UINT64_MAX - tickPrecision; + } + + SortLinkList *listSorted = LOS_DL_LIST_ENTRY(list, SortLinkList, sortLinkNode); + if (listSorted->responseTime <= (startTime + tickPrecision)) { + return (startTime + tickPrecision); + } + + return listSorted->responseTime; +} + +STATIC INLINE UINT64 OsGetNextExpireTime(UINT64 startTime, UINT32 tickPrecision) +{ + UINT64 taskExpireTime = GetSortLinkNextExpireTime(&g_taskSortLink, startTime, tickPrecision); + UINT64 swtmrExpireTime = GetSortLinkNextExpireTime(&g_swtmrSortLink, startTime, tickPrecision); + return (taskExpireTime < swtmrExpireTime) ? taskExpireTime : swtmrExpireTime; +} + SortLinkAttribute *OsGetSortLinkAttribute(SortLinkType type); -UINT64 OsGetNextExpireTime(UINT64 startTime); UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader); -VOID OsDeleteNodeSortLink(SortLinkList *sortList); VOID OsAdd2SortLink(SortLinkList *node, UINT64 startTime, UINT32 waitTicks, SortLinkType type); VOID OsDeleteSortLink(SortLinkList *node); -UINT32 OsSortLinkGetTargetExpireTime(UINT64 currTime, const SortLinkList *targetSortList); -UINT32 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sortLinkHeader); +UINT64 OsSortLinkGetTargetExpireTime(UINT64 currTime, const SortLinkList *targetSortList); +UINT64 OsSortLinkGetNextExpireTime(const SortLinkAttribute *sortLinkHeader); #ifdef __cplusplus #if __cplusplus diff --git a/kernel/include/los_swtmr.h b/kernel/include/los_swtmr.h index 8a472dff..1b060e9e 100644 --- a/kernel/include/los_swtmr.h +++ b/kernel/include/los_swtmr.h @@ -500,27 +500,7 @@ extern UINT32 OsSwtmrInit(VOID); */ extern UINT32 OsSwtmrGetNextTimeout(VOID); -/** - * @ingroup los_swtmr - * @brief Adjust software timer list. - * - * @par Description: - *