diff --git a/arch/arm/arm9/gcc/los_timer.c b/arch/arm/arm9/gcc/los_timer.c index b56ea692..ea2804fc 100644 --- a/arch/arm/arm9/gcc/los_timer.c +++ b/arch/arm/arm9/gcc/los_timer.c @@ -58,7 +58,7 @@ STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { - .freq = OS_SYS_CLOCK, + .freq = 0, .irqNum = OS_TIMER_IRQ_NUM, .init = SysTickStart, .getCycle = SysTickCycleGet, @@ -73,6 +73,9 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) UINT32 intSave = LOS_IntLock(); UINT32 value; + ArchTickTimer *tick = &g_archTickTimer; + tick->freq = OS_SYS_CLOCK; + READ_UINT32(value, OS_TIMER_CLK_PWD_ADDR); value &= ~(OS_TIMER_32K_CLK_BIT); WRITE_UINT32(value, OS_TIMER_CLK_PWD_ADDR); diff --git a/arch/arm/cortex-m3/keil/los_timer.c b/arch/arm/cortex-m3/keil/los_timer.c index 4dcb1285..4ddfff1b 100644 --- a/arch/arm/cortex-m3/keil/los_timer.c +++ b/arch/arm/cortex-m3/keil/los_timer.c @@ -43,7 +43,7 @@ STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { - .freq = OS_SYS_CLOCK, + .freq = 0, .irqNum = SysTick_IRQn, .init = SysTickStart, .getCycle = SysTickCycleGet, @@ -58,6 +58,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) UINT32 ret; ArchTickTimer *tick = &g_archTickTimer; + tick->freq = OS_SYS_CLOCK; + #if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1) #if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1) OsSetVector(tick->irqNum, handler, NULL); diff --git a/arch/arm/cortex-m33/gcc/NTZ/los_timer.c b/arch/arm/cortex-m33/gcc/NTZ/los_timer.c index c238c6a1..dcd19afc 100755 --- a/arch/arm/cortex-m33/gcc/NTZ/los_timer.c +++ b/arch/arm/cortex-m33/gcc/NTZ/los_timer.c @@ -42,7 +42,7 @@ STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { - .freq = OS_SYS_CLOCK, + .freq = 0, .irqNum = SysTick_IRQn, .init = SysTickStart, .getCycle = SysTickCycleGet, @@ -57,6 +57,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) UINT32 ret; ArchTickTimer *tick = &g_archTickTimer; + tick->freq = OS_SYS_CLOCK; + #if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1) #if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1) OsSetVector(tick->irqNum, handler, NULL); 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 32436355..6c74e178 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 @@ -41,7 +41,7 @@ STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { - .freq = OS_SYS_CLOCK, + .freq = 0, .irqNum = SysTick_IRQn, .init = SysTickStart, .getCycle = SysTickCycleGet, @@ -56,6 +56,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) UINT32 ret; ArchTickTimer *tick = &g_archTickTimer; + tick->freq = OS_SYS_CLOCK; + #if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1) #if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1) OsSetVector(tick->irqNum, handler, NULL); diff --git a/arch/arm/cortex-m33/iar/NTZ/los_timer.c b/arch/arm/cortex-m33/iar/NTZ/los_timer.c index e2f3e742..ecd0c1c5 100644 --- a/arch/arm/cortex-m33/iar/NTZ/los_timer.c +++ b/arch/arm/cortex-m33/iar/NTZ/los_timer.c @@ -42,7 +42,7 @@ STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { - .freq = OS_SYS_CLOCK, + .freq = 0, .irqNum = SysTick_IRQn, .init = SysTickStart, .getCycle = SysTickCycleGet, @@ -57,6 +57,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) UINT32 ret; ArchTickTimer *tick = &g_archTickTimer; + tick->freq = OS_SYS_CLOCK; + #if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1) #if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1) OsSetVector(tick->irqNum, handler, NULL); 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 c15a6033..2ce8096b 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 @@ -42,7 +42,7 @@ STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { - .freq = OS_SYS_CLOCK, + .freq = 0, .irqNum = SysTick_IRQn, .init = SysTickStart, .getCycle = SysTickCycleGet, @@ -57,6 +57,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) UINT32 ret; ArchTickTimer *tick = &g_archTickTimer; + tick->freq = OS_SYS_CLOCK; + #if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1) #if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1) OsSetVector(tick->irqNum, handler, NULL); diff --git a/arch/arm/cortex-m4/gcc/los_timer.c b/arch/arm/cortex-m4/gcc/los_timer.c index f27713d0..e77d880f 100644 --- a/arch/arm/cortex-m4/gcc/los_timer.c +++ b/arch/arm/cortex-m4/gcc/los_timer.c @@ -42,7 +42,7 @@ STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { - .freq = OS_SYS_CLOCK, + .freq = 0, .irqNum = SysTick_IRQn, .init = SysTickStart, .getCycle = SysTickCycleGet, @@ -57,6 +57,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) UINT32 ret; ArchTickTimer *tick = &g_archTickTimer; + tick->freq = OS_SYS_CLOCK; + #if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1) #if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1) OsSetVector(tick->irqNum, handler, NULL); diff --git a/arch/arm/cortex-m4/iar/los_timer.c b/arch/arm/cortex-m4/iar/los_timer.c index c238c6a1..dcd19afc 100644 --- a/arch/arm/cortex-m4/iar/los_timer.c +++ b/arch/arm/cortex-m4/iar/los_timer.c @@ -42,7 +42,7 @@ STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { - .freq = OS_SYS_CLOCK, + .freq = 0, .irqNum = SysTick_IRQn, .init = SysTickStart, .getCycle = SysTickCycleGet, @@ -57,6 +57,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) UINT32 ret; ArchTickTimer *tick = &g_archTickTimer; + tick->freq = OS_SYS_CLOCK; + #if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1) #if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1) OsSetVector(tick->irqNum, handler, NULL); diff --git a/arch/arm/cortex-m7/gcc/los_timer.c b/arch/arm/cortex-m7/gcc/los_timer.c index c238c6a1..dcd19afc 100644 --- a/arch/arm/cortex-m7/gcc/los_timer.c +++ b/arch/arm/cortex-m7/gcc/los_timer.c @@ -42,7 +42,7 @@ STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { - .freq = OS_SYS_CLOCK, + .freq = 0, .irqNum = SysTick_IRQn, .init = SysTickStart, .getCycle = SysTickCycleGet, @@ -57,6 +57,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) UINT32 ret; ArchTickTimer *tick = &g_archTickTimer; + tick->freq = OS_SYS_CLOCK; + #if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1) #if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1) OsSetVector(tick->irqNum, handler, NULL); diff --git a/arch/arm/cortex-m7/iar/los_timer.c b/arch/arm/cortex-m7/iar/los_timer.c index c238c6a1..dcd19afc 100644 --- a/arch/arm/cortex-m7/iar/los_timer.c +++ b/arch/arm/cortex-m7/iar/los_timer.c @@ -42,7 +42,7 @@ STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { - .freq = OS_SYS_CLOCK, + .freq = 0, .irqNum = SysTick_IRQn, .init = SysTickStart, .getCycle = SysTickCycleGet, @@ -57,6 +57,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) UINT32 ret; ArchTickTimer *tick = &g_archTickTimer; + tick->freq = OS_SYS_CLOCK; + #if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1) #if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1) OsSetVector(tick->irqNum, handler, NULL); diff --git a/arch/csky/v2/gcc/los_timer.c b/arch/csky/v2/gcc/los_timer.c index 0ecf4648..e1333395 100644 --- a/arch/csky/v2/gcc/los_timer.c +++ b/arch/csky/v2/gcc/los_timer.c @@ -61,7 +61,7 @@ STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { - .freq = OS_SYS_CLOCK, + .freq = 0, .irqNum = TIM_INT_NUM, .init = SysTickStart, .getCycle = SysTickCycleGet, @@ -82,6 +82,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) { ArchTickTimer *tick = &g_archTickTimer; + tick->freq = OS_SYS_CLOCK; + SysTick->LOAD = (OS_CYCLE_PER_TICK - 1); SysTick->VAL = 0; SysTick->CTRL |= (CORETIM_SOURCE | CORETIM_ENABLE | CORETIM_INTMASK); diff --git a/arch/risc-v/nuclei/gcc/los_timer.c b/arch/risc-v/nuclei/gcc/los_timer.c index 8c6a17f8..5a06ee4e 100644 --- a/arch/risc-v/nuclei/gcc/los_timer.c +++ b/arch/risc-v/nuclei/gcc/los_timer.c @@ -53,7 +53,7 @@ STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { - .freq = OS_SYS_CLOCK, + .freq = 0, .irqNum = SysTimer_IRQn, .init = SysTickStart, .getCycle = SysTickCycleGet, @@ -65,6 +65,9 @@ STATIC ArchTickTimer g_archTickTimer = { STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) { + ArchTickTimer *tick = &g_archTickTimer; + tick->freq = OS_SYS_CLOCK; + SysTick_Config(SYSTICK_TICK_CONST); ECLIC_DisableIRQ(SysTimer_IRQn); ECLIC_SetLevelIRQ(SysTimer_IRQn, configKERNEL_INTERRUPT_PRIORITY); diff --git a/arch/risc-v/riscv32/gcc/los_timer.c b/arch/risc-v/riscv32/gcc/los_timer.c index 967065e9..3c8a8715 100644 --- a/arch/risc-v/riscv32/gcc/los_timer.c +++ b/arch/risc-v/riscv32/gcc/los_timer.c @@ -45,7 +45,7 @@ STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { - .freq = OS_SYS_CLOCK, + .freq = 0, .irqNum = RISCV_MACH_TIMER_IRQ, .init = SysTickStart, .getCycle = SysTickCycleGet, @@ -57,12 +57,16 @@ STATIC ArchTickTimer g_archTickTimer = { STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) { + ArchTickTimer *tick = &g_archTickTimer; + UINT32 period = (UINT32)LOSCFG_BASE_CORE_TICK_RESPONSE_MAX; UINT32 ret = LOS_HwiCreate(RISCV_MACH_TIMER_IRQ, 0x1, 0, handler, period); if (ret != LOS_OK) { return ret; } + tick->freq = OS_SYS_CLOCK; + WRITE_UINT32(0xffffffff, MTIMERCMP + 4); /* The high 4 bits of mtimer */ WRITE_UINT32(period, MTIMERCMP); WRITE_UINT32(0x0, MTIMERCMP + 4); /* The high 4 bits of mtimer */ diff --git a/arch/xtensa/lx6/gcc/los_timer.c b/arch/xtensa/lx6/gcc/los_timer.c index b1781264..edcbe5b4 100644 --- a/arch/xtensa/lx6/gcc/los_timer.c +++ b/arch/xtensa/lx6/gcc/los_timer.c @@ -43,7 +43,7 @@ STATIC VOID SysTickLock(VOID); STATIC VOID SysTickUnlock(VOID); STATIC ArchTickTimer g_archTickTimer = { - .freq = OS_SYS_CLOCK, + .freq = 0, .irqNum = OS_TICK_INT_NUM, .init = SysTickStart, .getCycle = SysTickCycleGet, @@ -57,6 +57,8 @@ STATIC UINT32 SysTickStart(HWI_PROC_FUNC handler) { ArchTickTimer *tick = &g_archTickTimer; + tick->freq = OS_SYS_CLOCK; + #if (LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT == 1) #if (LOSCFG_PLATFORM_HWI_WITH_ARG == 1) OsSetVector(tick->irqNum, handler, NULL); diff --git a/kernel/src/los_tick.c b/kernel/src/los_tick.c index 337e8085..faf7b7af 100644 --- a/kernel/src/los_tick.c +++ b/kernel/src/los_tick.c @@ -104,7 +104,7 @@ LITE_OS_SEC_TEXT UINT64 LOS_SysCycleGet(VOID) #endif } -LITE_OS_SEC_TEXT STATIC UINT32 TickTimerCheck(const ArchTickTimer *tick) +STATIC UINT32 TickTimerCheck(const ArchTickTimer *tick) { if (tick == NULL) { return LOS_ERRNO_SYS_PTR_NULL; @@ -120,9 +120,9 @@ LITE_OS_SEC_TEXT STATIC UINT32 TickTimerCheck(const ArchTickTimer *tick) return LOS_ERRNO_TICK_CFG_INVALID; } - if (tick->init == NULL || tick->reload == NULL || - tick->lock == NULL || tick->unlock == NULL || - tick->getCycle == NULL) { + if ((tick->init == NULL) || (tick->reload == NULL) || + (tick->lock == NULL) || (tick->unlock == NULL) || + (tick->getCycle == NULL)) { return LOS_ERRNO_SYS_HOOK_IS_NULL; } @@ -136,26 +136,43 @@ LITE_OS_SEC_TEXT STATIC UINT32 TickTimerCheck(const ArchTickTimer *tick) LITE_OS_SEC_TEXT_INIT UINT32 OsTickTimerInit(VOID) { UINT32 ret; + UINT32 intSave; HWI_PROC_FUNC tickHandler = (HWI_PROC_FUNC)OsTickHandler; + g_sysTickTimer = LOS_SysTickTimerGet(); - - ret = TickTimerCheck(g_sysTickTimer); - if (ret != LOS_OK) { - PRINT_ERR("Tick timer param check failed, Error 0x%x\n", ret); - return ret; + if ((g_sysTickTimer->init == NULL) || (g_sysTickTimer->reload == NULL) || + (g_sysTickTimer->lock == NULL) || (g_sysTickTimer->unlock == NULL) || + (g_sysTickTimer->getCycle == NULL)) { + return LOS_ERRNO_SYS_HOOK_IS_NULL; } - g_sysClock = g_sysTickTimer->freq; - g_cyclesPerTick = g_sysTickTimer->freq / LOSCFG_BASE_CORE_TICK_PER_SECOND; - if (g_sysTickTimer->tickHandler != NULL) { tickHandler = g_sysTickTimer->tickHandler; } + + intSave = LOS_IntLock(); ret = g_sysTickTimer->init(tickHandler); - if (ret == LOS_OK) { - g_sysTimerIsInit = TRUE; + if (ret != LOS_OK) { + LOS_IntRestore(intSave); + return ret; } - return ret; + + if ((g_sysTickTimer->freq == 0) || (g_sysTickTimer->freq < LOSCFG_BASE_CORE_TICK_PER_SECOND)) { + LOS_IntRestore(intSave); + return LOS_ERRNO_SYS_CLOCK_INVALID; + } + + if (g_sysTickTimer->irqNum > (INT32)LOSCFG_PLATFORM_HWI_LIMIT) { + LOS_IntRestore(intSave); + return LOS_ERRNO_TICK_CFG_INVALID; + } + + g_sysClock = g_sysTickTimer->freq; + g_cyclesPerTick = g_sysTickTimer->freq / LOSCFG_BASE_CORE_TICK_PER_SECOND; + g_sysTimerIsInit = TRUE; + + LOS_IntRestore(intSave); + return LOS_OK; } LITE_OS_SEC_TEXT UINT32 LOS_TickTimerRegister(const ArchTickTimer *timer, const HWI_PROC_FUNC tickHandler)