IssueNo:#I3IK07

Description:liteos_m scheduling optimization and low power design.
Sig:kernel
Feature or Bugfix:Feature
Binary Source:No

Change-Id: I5b692a503ce6128626eec8f9a37742d7caa1fea9
This commit is contained in:
zhushengle 2021-04-14 09:22:36 +08:00
parent f685eeb97d
commit cd30e62998
3 changed files with 22 additions and 35 deletions

View File

@ -45,9 +45,7 @@ extern "C" {
extern UINT32 g_taskScheduled; extern UINT32 g_taskScheduled;
typedef BOOL (*SchedScan)(VOID); typedef BOOL (*SchedScan)(VOID);
VOID OsSchedUpdateTimeBase(VOID); VOID OsSchedUpdateSchedTimeBase(VOID);
UINT64 OsGetCurrTimeCycle(VOID);
UINT64 OsGetCurrSchedTimeCycle(VOID); UINT64 OsGetCurrSchedTimeCycle(VOID);

View File

@ -59,7 +59,6 @@ STATIC UINT32 g_queueBitmap;
STATIC UINT32 g_schedResponseID = 0; STATIC UINT32 g_schedResponseID = 0;
STATIC UINT64 g_schedResponseTime = OS_SCHED_MAX_RESPONSE_TIME; STATIC UINT64 g_schedResponseTime = OS_SCHED_MAX_RESPONSE_TIME;
STATIC UINT64 g_schedStartTime;
#if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1) #if (LOSCFG_BASE_CORE_SCHED_SLEEP == 1)
typedef struct { typedef struct {
SchedSleepInit init; SchedSleepInit init;
@ -78,7 +77,7 @@ STATIC SchedSleep g_schedSleepCB;
#if (LOSCFG_BASE_CORE_TICK_WTIMER == 0) #if (LOSCFG_BASE_CORE_TICK_WTIMER == 0)
STATIC UINT64 g_schedTimerBase; STATIC UINT64 g_schedTimerBase;
VOID OsSchedUpdateTimeBase(VOID) VOID OsSchedUpdateSchedTimeBase(VOID)
{ {
UINT32 period = 0; UINT32 period = 0;
@ -87,8 +86,12 @@ VOID OsSchedUpdateTimeBase(VOID)
} }
#endif #endif
UINT64 OsGetCurrTimeCycle(VOID) UINT64 OsGetCurrSchedTimeCycle(VOID)
{ {
if (!g_taskScheduled) {
return 0;
}
#if (LOSCFG_BASE_CORE_TICK_WTIMER == 1) #if (LOSCFG_BASE_CORE_TICK_WTIMER == 1)
return HalGetTickCycle(NULL); return HalGetTickCycle(NULL);
#else #else
@ -111,15 +114,6 @@ UINT64 OsGetCurrTimeCycle(VOID)
#endif #endif
} }
UINT64 OsGetCurrSchedTimeCycle(VOID)
{
if (!g_taskScheduled) {
return 0;
}
return OsGetCurrTimeCycle() - g_schedStartTime;
}
STATIC INLINE VOID OsTimeSliceUpdate(LosTaskCB *taskCB, UINT64 currTime) STATIC INLINE VOID OsTimeSliceUpdate(LosTaskCB *taskCB, UINT64 currTime)
{ {
LOS_ASSERT(currTime >= taskCB->startTime); LOS_ASSERT(currTime >= taskCB->startTime);
@ -177,7 +171,7 @@ STATIC INLINE VOID OsSchedSetNextExpireTime(UINT64 startTime, UINT32 responseID,
g_schedResponseTime = nextExpireTime; g_schedResponseTime = nextExpireTime;
#if (LOSCFG_BASE_CORE_TICK_WTIMER == 0) #if (LOSCFG_BASE_CORE_TICK_WTIMER == 0)
g_schedTimerBase = OsGetCurrTimeCycle(); g_schedTimerBase = OsGetCurrSchedTimeCycle();
#endif #endif
HalSysTickReload(nextResponseTime); HalSysTickReload(nextResponseTime);
} }
@ -459,7 +453,6 @@ VOID OsSchedStart(VOID)
OsSchedSetNextExpireTime(newTask->startTime, newTask->taskID, newTask->startTime + newTask->timeSlice); OsSchedSetNextExpireTime(newTask->startTime, newTask->taskID, newTask->startTime + newTask->timeSlice);
PRINTK("Entering scheduler\n"); PRINTK("Entering scheduler\n");
g_schedStartTime = OsGetCurrTimeCycle();
g_taskScheduled = 1; g_taskScheduled = 1;
} }
@ -510,7 +503,6 @@ VOID LOS_SchedTickHandler(VOID)
UINT32 intSave = LOS_IntLock(); UINT32 intSave = LOS_IntLock();
if (g_taskScheduled) {
if (g_schedResponseID == OS_INVALID) { if (g_schedResponseID == OS_INVALID) {
if (g_swtmrScan != NULL) { if (g_swtmrScan != NULL) {
needSched = g_swtmrScan(); needSched = g_swtmrScan();
@ -520,16 +512,13 @@ VOID LOS_SchedTickHandler(VOID)
} }
g_schedResponseTime = OS_SCHED_MAX_RESPONSE_TIME; g_schedResponseTime = OS_SCHED_MAX_RESPONSE_TIME;
if (needSched && LOS_CHECK_SCHEDULE) { if (g_taskScheduled && needSched && LOS_CHECK_SCHEDULE) {
HalTaskSchedule(); HalTaskSchedule();
} else { } else {
currTime = OsGetCurrSchedTimeCycle(); currTime = OsGetCurrSchedTimeCycle();
OsTimeSliceUpdate(g_losTask.runTask, currTime); OsTimeSliceUpdate(g_losTask.runTask, currTime);
OsSchedUpdateExpireTime(currTime); OsSchedUpdateExpireTime(currTime);
} }
} else {
OsSchedUpdateExpireTime(OsGetCurrSchedTimeCycle());
}
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
} }

View File

@ -53,7 +53,7 @@ extern VOID platform_tick_handler(VOID);
LITE_OS_SEC_TEXT VOID OsTickHandler(VOID) LITE_OS_SEC_TEXT VOID OsTickHandler(VOID)
{ {
#if (LOSCFG_BASE_CORE_TICK_WTIMER == 0) #if (LOSCFG_BASE_CORE_TICK_WTIMER == 0)
OsSchedUpdateTimeBase(); OsSchedUpdateSchedTimeBase();
#endif #endif
#if (LOSCFG_BASE_CORE_TICK_HW_TIME == 1) #if (LOSCFG_BASE_CORE_TICK_HW_TIME == 1)
@ -78,7 +78,7 @@ Return : current tick
*****************************************************************************/ *****************************************************************************/
LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID) LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID)
{ {
return OsGetCurrTimeCycle() / OS_CYCLE_PER_TICK; return OsGetCurrSchedTimeCycle() / OS_CYCLE_PER_TICK;
} }
/***************************************************************************** /*****************************************************************************