fix:Low power expansion.

Close #I3RCHR

Change-Id: I8db9ae791b234b8237ce5a8e56d4d6581833b9ee
This commit is contained in:
zhushengle 2021-05-14 16:59:55 +08:00
parent 748a827560
commit 43c04f6f5c
1 changed files with 42 additions and 36 deletions

View File

@ -65,7 +65,6 @@ typedef struct {
SchedSleepStart start; SchedSleepStart start;
SchedSleepStop stop; SchedSleepStop stop;
SchedSleepGetSleepTimeNs getTimeNs; SchedSleepGetSleepTimeNs getTimeNs;
BOOL ready;
} SchedSleep; } SchedSleep;
STATIC BOOL g_schedSleepFlags = FALSE; STATIC BOOL g_schedSleepFlags = FALSE;
@ -539,37 +538,39 @@ VOID OsSchedUpdateSleepTime(VOID)
UINT64 currTime, realSleepTime; UINT64 currTime, realSleepTime;
UINT32 intSave; UINT32 intSave;
if (g_schedSleepFlags == FALSE) { if ((g_schedSleepFlags == FALSE) || (g_schedSleepCB.stop == NULL)) {
return; return;
} }
intSave = LOS_IntLock(); intSave = LOS_IntLock();
realSleepTime = g_schedSleepCB.getTimeNs(); if (g_schedSleepCB.getTimeNs != NULL) {
realSleepTime = (realSleepTime / OS_SYS_NS_PER_SECOND) * OS_SYS_CLOCK + realSleepTime = g_schedSleepCB.getTimeNs();
(realSleepTime % OS_SYS_NS_PER_SECOND) * OS_SYS_CLOCK / OS_SYS_NS_PER_SECOND; realSleepTime = (realSleepTime / OS_SYS_NS_PER_SECOND) * OS_SYS_CLOCK +
if (realSleepTime < g_schedSleepTime) { (realSleepTime % OS_SYS_NS_PER_SECOND) * OS_SYS_CLOCK / OS_SYS_NS_PER_SECOND;
nextResponseTime = g_schedSleepTime - realSleepTime; if (realSleepTime < g_schedSleepTime) {
} else { nextResponseTime = g_schedSleepTime - realSleepTime;
nextResponseTime = 0; } else {
} nextResponseTime = 0;
}
#if (LOSCFG_BASE_CORE_TICK_WTIMER == 1) #if (LOSCFG_BASE_CORE_TICK_WTIMER == 1)
currTime = HalGetTickCycle(NULL); currTime = HalGetTickCycle(NULL);
#else #else
g_schedTimerBase = g_schedEntrySleepTime + realSleepTime; g_schedTimerBase = g_schedEntrySleepTime + realSleepTime;
currTime = g_schedTimerBase; currTime = g_schedTimerBase;
#endif #endif
if (nextResponseTime > OS_TICK_RESPONSE_TIME_MAX) { if (nextResponseTime > OS_TICK_RESPONSE_TIME_MAX) {
nextResponseTime = OS_TICK_RESPONSE_TIME_MAX; nextResponseTime = OS_TICK_RESPONSE_TIME_MAX;
} else if (nextResponseTime < OS_CYCLE_PER_TICK) { } else if (nextResponseTime < OS_CYCLE_PER_TICK) {
nextResponseTime = OS_CYCLE_PER_TICK; nextResponseTime = OS_CYCLE_PER_TICK;
} }
g_schedResponseID = OS_INVALID; g_schedResponseID = OS_INVALID;
g_schedResponseTime = currTime + nextResponseTime; g_schedResponseTime = currTime + nextResponseTime;
HalSysTickReload(nextResponseTime); HalSysTickReload(nextResponseTime);
g_schedSleepTime = 0;
}
g_schedSleepFlags = FALSE; g_schedSleepFlags = FALSE;
g_schedSleepTime = 0;
g_schedSleepCB.stop(); g_schedSleepCB.stop();
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
} }
@ -579,19 +580,23 @@ VOID OsSchedToSleep(VOID)
UINT32 intSave; UINT32 intSave;
UINT64 sleepTime; UINT64 sleepTime;
if (!g_schedSleepCB.ready) { if (g_schedSleepCB.start == NULL) {
return; return;
} }
sleepTime = (g_schedSleepTime / OS_SYS_CLOCK) * OS_SYS_NS_PER_SECOND + if (g_schedSleepCB.getTimeNs != NULL) {
(g_schedSleepTime % OS_SYS_CLOCK) * OS_SYS_NS_PER_SECOND / OS_SYS_CLOCK; sleepTime = (g_schedSleepTime / OS_SYS_CLOCK) * OS_SYS_NS_PER_SECOND +
if (sleepTime == 0) { (g_schedSleepTime % OS_SYS_CLOCK) * OS_SYS_NS_PER_SECOND / OS_SYS_CLOCK;
return; if (sleepTime == 0) {
} return;
}
intSave = LOS_IntLock(); intSave = LOS_IntLock();
HalTickLock(); HalTickLock();
g_schedEntrySleepTime = OsGetCurrSchedTimeCycle(); g_schedEntrySleepTime = OsGetCurrSchedTimeCycle();
} else {
intSave = LOS_IntLock();
}
g_schedSleepCB.start(sleepTime); g_schedSleepCB.start(sleepTime);
g_schedSleepFlags = TRUE; g_schedSleepFlags = TRUE;
@ -603,7 +608,7 @@ UINT32 LOS_SchedSleepInit(SchedSleepInit init, SchedSleepStart start,
{ {
UINT32 ret; UINT32 ret;
if ((init == NULL) || (start == NULL) || (stop == NULL) || (getTime == NULL)) { if ((init == NULL) && (start == NULL) && (stop == NULL)) {
return LOS_NOK; return LOS_NOK;
} }
@ -612,12 +617,13 @@ UINT32 LOS_SchedSleepInit(SchedSleepInit init, SchedSleepStart start,
g_schedSleepCB.stop = stop; g_schedSleepCB.stop = stop;
g_schedSleepCB.getTimeNs = getTime; g_schedSleepCB.getTimeNs = getTime;
ret = g_schedSleepCB.init(); if (g_schedSleepCB.init != NULL) {
if (ret != LOS_OK) { ret = g_schedSleepCB.init();
return ret; if (ret != LOS_OK) {
return ret;
}
} }
g_schedSleepCB.ready = TRUE;
return LOS_OK; return LOS_OK;
} }
#endif #endif