From 600283a96f392a57fd275d011a60b2b3619d6476 Mon Sep 17 00:00:00 2001 From: zhushengle Date: Fri, 24 Jun 2022 15:57:49 +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: Ic3df09142519357353906d40e3fd3cdca5cac71d --- 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 4302064c..b9cdd404 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 1cb5132c..afb6830b 100644 --- a/kernel/src/los_sortlink.c +++ b/kernel/src/los_sortlink.c @@ -97,7 +97,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(sortLinkHead, 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 84225846..afba77c1 100644 --- a/kernel/src/los_tick.c +++ b/kernel/src/los_tick.c @@ -49,13 +49,17 @@ LITE_OS_SEC_BSS STATIC UINT64 g_tickTimerStartTime; #if (LOSCFG_BASE_CORE_TICK_WTIMER == 0) STATIC UINT64 g_tickTimerBase; STATIC UINT64 g_oldTickTimerBase; +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 >= g_oldTickTimerBase); @@ -285,7 +290,7 @@ Return : current tick *****************************************************************************/ LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID) { - return (LOS_SysCycleGet() - g_tickTimerStartTime) / g_cyclesPerTick; + return OS_SYS_CYCLE_TO_TICK(LOS_SysCycleGet() - g_tickTimerStartTime); } /*****************************************************************************