!725 fix: 修复系统时间比RTC时间过快的问题

Merge pull request !725 from zhushengle/tick_master
This commit is contained in:
openharmony_ci 2022-06-25 09:41:52 +00:00 committed by Gitee
commit df9387c28f
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
4 changed files with 17 additions and 8 deletions

View File

@ -157,6 +157,10 @@ extern UINT32 g_sysClock;
#define OS_SYS_NS_TO_CYCLE(time, freq) (((time) / OS_SYS_NS_PER_SECOND) * (freq) + \ #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) ((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 * @ingroup los_tick
* System time basic function error code: Null pointer. * System time basic function error code: Null pointer.

View File

@ -97,7 +97,7 @@ VOID OsAdd2SortLink(SortLinkList *node, UINT64 startTime, UINT32 waitTicks, Sort
} }
intSave = LOS_IntLock(); 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); OsAddNode2SortLink(sortLinkHead, node);
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
} }

View File

@ -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) STATIC UINT64 OsSwtmrCalcStartTime(UINT64 currTime, SWTMR_CTRL_S *swtmr, const SWTMR_CTRL_S *alignSwtmr)
{ {
UINT64 usedTime, startTime; UINT64 usedTime, startTime;
UINT64 alignEnd = (UINT64)alignSwtmr->uwInterval * OS_CYCLE_PER_TICK; UINT64 alignEnd = OS_SYS_TICK_TO_CYCLE(alignSwtmr->uwInterval);
UINT64 swtmrTime = (UINT64)swtmr->uwInterval * OS_CYCLE_PER_TICK; UINT64 swtmrTime = OS_SYS_TICK_TO_CYCLE(swtmr->uwInterval);
UINT64 remainTime = OsSortLinkGetRemainTime(currTime, &alignSwtmr->stSortList); UINT64 remainTime = OsSortLinkGetRemainTime(currTime, &alignSwtmr->stSortList);
if (remainTime == 0) { if (remainTime == 0) {
startTime = GET_SORTLIST_VALUE(&alignSwtmr->stSortList); startTime = GET_SORTLIST_VALUE(&alignSwtmr->stSortList);
@ -357,7 +357,7 @@ LITE_OS_SEC_TEXT UINT32 OsSwtmrGetNextTimeout(VOID)
UINT32 intSave = LOS_IntLock(); UINT32 intSave = LOS_IntLock();
UINT64 time = OsSortLinkGetNextExpireTime(g_swtmrSortLinkList); UINT64 time = OsSortLinkGetNextExpireTime(g_swtmrSortLinkList);
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
time = time / OS_CYCLE_PER_TICK; time = OS_SYS_CYCLE_TO_TICK(time);
if (time > OS_NULL_INT) { if (time > OS_NULL_INT) {
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) LITE_OS_SEC_TEXT UINT32 OsSwtmrTimeGet(const SWTMR_CTRL_S *swtmr)
{ {
UINT64 time = OsSortLinkGetTargetExpireTime(OsGetCurrSchedTimeCycle(), &swtmr->stSortList); UINT64 time = OsSortLinkGetTargetExpireTime(OsGetCurrSchedTimeCycle(), &swtmr->stSortList);
time = time / OS_CYCLE_PER_TICK; time = OS_SYS_CYCLE_TO_TICK(time);
if (time > OS_NULL_INT) { if (time > OS_NULL_INT) {
time = OS_NULL_INT; time = OS_NULL_INT;
} }

View File

@ -49,14 +49,18 @@ LITE_OS_SEC_BSS STATIC UINT64 g_tickTimerStartTime;
#if (LOSCFG_BASE_CORE_TICK_WTIMER == 0) #if (LOSCFG_BASE_CORE_TICK_WTIMER == 0)
STATIC UINT64 g_tickTimerBase; STATIC UINT64 g_tickTimerBase;
STATIC UINT64 g_oldTickTimerBase; STATIC UINT64 g_oldTickTimerBase;
STATIC BOOL g_tickTimerBaseUpdate = FALSE;
LITE_OS_SEC_TEXT STATIC VOID OsUpdateSysTimeBase(VOID) LITE_OS_SEC_TEXT STATIC VOID OsUpdateSysTimeBase(VOID)
{ {
UINT32 period = 0; UINT32 period = 0;
if (g_tickTimerBaseUpdate == FALSE) {
(VOID)g_sysTickTimer->getCycle(&period); (VOID)g_sysTickTimer->getCycle(&period);
g_tickTimerBase += period; g_tickTimerBase += period;
} }
g_tickTimerBaseUpdate = FALSE;
}
LITE_OS_SEC_TEXT VOID OsTickTimerBaseReset(UINT64 currTime) LITE_OS_SEC_TEXT VOID OsTickTimerBaseReset(UINT64 currTime)
{ {
@ -96,6 +100,7 @@ LITE_OS_SEC_TEXT UINT64 LOS_SysCycleGet(VOID)
/* Turn the timer count */ /* Turn the timer count */
g_tickTimerBase += period; g_tickTimerBase += period;
schedTime = g_tickTimerBase + time; schedTime = g_tickTimerBase + time;
g_tickTimerBaseUpdate = TRUE;
} }
LOS_ASSERT(schedTime >= g_oldTickTimerBase); LOS_ASSERT(schedTime >= g_oldTickTimerBase);
@ -285,7 +290,7 @@ Return : current tick
*****************************************************************************/ *****************************************************************************/
LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID) 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);
} }
/***************************************************************************** /*****************************************************************************