!523 fix: tick timer时钟频率赋值修改为运行时赋值
Merge pull request !523 from zhushengle/tick_timer
This commit is contained in:
commit
f3fbeb87db
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
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)
|
||||
|
|
Loading…
Reference in New Issue