From e0fd5c306f5e499198a6a785a6afd6b222c8f4a7 Mon Sep 17 00:00:00 2001 From: zhushengle Date: Wed, 22 Jun 2022 09:39:38 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=AF=94RTC=E6=97=B6=E9=97=B4=E8=BF=87?= =?UTF-8?q?=E5=BF=AB=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.标记在时间接口中更新base后在中断中不再更新base 2.优化tick计算 Close #I5DCRB Signed-off-by: zhushengle Change-Id: I79940335543889dbf746f48607828527fb606763 --- kernel/include/los_tick.h | 4 ++++ kernel/src/los_sortlink.c | 2 +- kernel/src/los_swtmr.c | 8 ++++---- kernel/src/los_tick.c | 11 ++++++++--- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/kernel/include/los_tick.h b/kernel/include/los_tick.h index 7920c511..623226be 100644 --- a/kernel/include/los_tick.h +++ b/kernel/include/los_tick.h @@ -157,6 +157,10 @@ extern UINT32 g_sysClock; #define OS_SYS_NS_TO_CYCLE(time, freq) (((time) / OS_SYS_NS_PER_SECOND) * (freq) + \ ((time) % OS_SYS_NS_PER_SECOND) * (freq) / OS_SYS_NS_PER_SECOND) +#define OS_SYS_TICK_TO_CYCLE(ticks) (((UINT64)(ticks) * g_sysClock) / LOSCFG_BASE_CORE_TICK_PER_SECOND) + +#define OS_SYS_CYCLE_TO_TICK(cycle) ((((UINT64)(cycle)) * LOSCFG_BASE_CORE_TICK_PER_SECOND) / g_sysClock) + /** * @ingroup los_tick * System time basic function error code: Null pointer. diff --git a/kernel/src/los_sortlink.c b/kernel/src/los_sortlink.c index 3de403ac..6e758ee1 100644 --- a/kernel/src/los_sortlink.c +++ b/kernel/src/los_sortlink.c @@ -92,7 +92,7 @@ VOID OsAdd2SortLink(SortLinkList *node, UINT64 startTime, UINT32 waitTicks, Sort } intSave = LOS_IntLock(); - SET_SORTLIST_VALUE(node, startTime + (UINT64)waitTicks * OS_CYCLE_PER_TICK); + SET_SORTLIST_VALUE(node, startTime + OS_SYS_TICK_TO_CYCLE(waitTicks)); OsAddNode2SortLink(sortLinkHeader, node); LOS_IntRestore(intSave); } diff --git a/kernel/src/los_swtmr.c b/kernel/src/los_swtmr.c index 21c6f364..bcba0382 100644 --- a/kernel/src/los_swtmr.c +++ b/kernel/src/los_swtmr.c @@ -141,8 +141,8 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrTaskCreate(VOID) STATIC UINT64 OsSwtmrCalcStartTime(UINT64 currTime, SWTMR_CTRL_S *swtmr, const SWTMR_CTRL_S *alignSwtmr) { UINT64 usedTime, startTime; - UINT64 alignEnd = (UINT64)alignSwtmr->uwInterval * OS_CYCLE_PER_TICK; - UINT64 swtmrTime = (UINT64)swtmr->uwInterval * OS_CYCLE_PER_TICK; + UINT64 alignEnd = OS_SYS_TICK_TO_CYCLE(alignSwtmr->uwInterval); + UINT64 swtmrTime = OS_SYS_TICK_TO_CYCLE(swtmr->uwInterval); UINT64 remainTime = OsSortLinkGetRemainTime(currTime, &alignSwtmr->stSortList); if (remainTime == 0) { startTime = GET_SORTLIST_VALUE(&alignSwtmr->stSortList); @@ -357,7 +357,7 @@ LITE_OS_SEC_TEXT UINT32 OsSwtmrGetNextTimeout(VOID) UINT32 intSave = LOS_IntLock(); UINT64 time = OsSortLinkGetNextExpireTime(g_swtmrSortLinkList); LOS_IntRestore(intSave); - time = time / OS_CYCLE_PER_TICK; + time = OS_SYS_CYCLE_TO_TICK(time); if (time > OS_NULL_INT) { time = OS_NULL_INT; } @@ -367,7 +367,7 @@ LITE_OS_SEC_TEXT UINT32 OsSwtmrGetNextTimeout(VOID) LITE_OS_SEC_TEXT UINT32 OsSwtmrTimeGet(const SWTMR_CTRL_S *swtmr) { UINT64 time = OsSortLinkGetTargetExpireTime(OsGetCurrSchedTimeCycle(), &swtmr->stSortList); - time = time / OS_CYCLE_PER_TICK; + time = OS_SYS_CYCLE_TO_TICK(time); if (time > OS_NULL_INT) { time = OS_NULL_INT; } diff --git a/kernel/src/los_tick.c b/kernel/src/los_tick.c index 37d28fd6..9eed645f 100644 --- a/kernel/src/los_tick.c +++ b/kernel/src/los_tick.c @@ -48,13 +48,17 @@ LITE_OS_SEC_BSS STATIC UINT64 g_tickTimerStartTime; #if (LOSCFG_BASE_CORE_TICK_WTIMER == 0) STATIC UINT64 g_tickTimerBase; +STATIC BOOL g_tickTimerBaseUpdate = FALSE; LITE_OS_SEC_TEXT STATIC VOID OsUpdateSysTimeBase(VOID) { UINT32 period = 0; - (VOID)g_sysTickTimer->getCycle(&period); - g_tickTimerBase += period; + if (g_tickTimerBaseUpdate == FALSE) { + (VOID)g_sysTickTimer->getCycle(&period); + g_tickTimerBase += period; + } + g_tickTimerBaseUpdate = FALSE; } LITE_OS_SEC_TEXT VOID OsTickTimerBaseReset(UINT64 currTime) @@ -96,6 +100,7 @@ LITE_OS_SEC_TEXT UINT64 LOS_SysCycleGet(VOID) /* Turn the timer count */ g_tickTimerBase += period; schedTime = g_tickTimerBase + time; + g_tickTimerBaseUpdate = TRUE; } LOS_ASSERT(schedTime >= oldSchedTime); @@ -244,7 +249,7 @@ Return : current tick *****************************************************************************/ LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID) { - return (LOS_SysCycleGet() - g_tickTimerStartTime) / OS_CYCLE_PER_TICK; + return OS_SYS_CYCLE_TO_TICK(LOS_SysCycleGet() - g_tickTimerStartTime); } /*****************************************************************************