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;
typedef BOOL (*SchedScan)(VOID);
VOID OsSchedUpdateTimeBase(VOID);
UINT64 OsGetCurrTimeCycle(VOID);
VOID OsSchedUpdateSchedTimeBase(VOID);
UINT64 OsGetCurrSchedTimeCycle(VOID);

View File

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

View File

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