commit
3feb4f26f3
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue