From cc8a794229f4236a1611183fd482740b3badbcd7 Mon Sep 17 00:00:00 2001 From: zhushengle Date: Wed, 24 Nov 2021 15:06:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B0=83=E5=BA=A6=E3=80=81=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=8F=8Apm=E8=A7=A3=E8=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pm中冻结线程的操作,融合至OsSchedSuspend和OsSchedResume, 使得调度模块提供对应完整的方法给任务模块,做到之间的相互解耦, 方便其它调度算法的融入。 Close #I4JTN6 Signed-off-by: zhushengle Change-Id: Ifde7077166a2fe67e7246fa68f777844640d67db --- components/power/los_pm.c | 35 -------------------- components/power/los_pm.h | 40 +++-------------------- kernel/include/los_sched.h | 4 +++ kernel/src/los_sched.c | 67 ++++++++++++++++++++++++++++++++++---- kernel/src/los_task.c | 36 ++++---------------- 5 files changed, 75 insertions(+), 107 deletions(-) diff --git a/components/power/los_pm.c b/components/power/los_pm.c index e38dd336..4ebb1d3a 100644 --- a/components/power/los_pm.c +++ b/components/power/los_pm.c @@ -657,41 +657,6 @@ UINT32 LOS_PmLockRelease(const CHAR *name) return ret; } -VOID OsPmFreezeTaskUnsafe(UINT32 taskID) -{ - UINT64 responseTime; - LosTaskCB *taskCB = OS_TCB_FROM_TID(taskID); - - responseTime = GET_SORTLIST_VALUE(&taskCB->sortList); - OsDeleteSortLink(&taskCB->sortList, OS_SORT_LINK_TASK); - SET_SORTLIST_VALUE(&taskCB->sortList, responseTime); - taskCB->taskStatus |= OS_TASK_FALG_FREEZE; - return; -} - -VOID OsPmUnfreezeTaskUnsafe(UINT32 taskID) -{ - LosTaskCB *taskCB = OS_TCB_FROM_TID(taskID); - UINT64 currTime, responseTime; - UINT32 remainTick; - - taskCB->taskStatus &= ~OS_TASK_FALG_FREEZE; - currTime = OsGetCurrSchedTimeCycle(); - responseTime = GET_SORTLIST_VALUE(&taskCB->sortList); - if (responseTime > currTime) { - remainTick = ((responseTime - currTime) + OS_CYCLE_PER_TICK - 1) / OS_CYCLE_PER_TICK; - OsAdd2SortLink(&taskCB->sortList, currTime, remainTick, OS_SORT_LINK_TASK); - return; - } - - SET_SORTLIST_VALUE(&taskCB->sortList, OS_SORT_LINK_INVALID_TIME); - if (taskCB->taskStatus & OS_TASK_STATUS_PEND) { - LOS_ListDelete(&taskCB->pendList); - } - taskCB->taskStatus &= ~(OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND_TIME | OS_TASK_STATUS_PEND); - return; -} - STATIC VOID OsPmSwtmrHandler(UINT32 arg) { const CHAR *name = (const CHAR *)arg; diff --git a/components/power/los_pm.h b/components/power/los_pm.h index 762c7b4a..f421219e 100644 --- a/components/power/los_pm.h +++ b/components/power/los_pm.h @@ -233,43 +233,11 @@ UINT32 OsPmInit(VOID); * * @see */ +#if (LOSCFG_KERNEL_PM == 1) BOOL OsIsPmMode(VOID); - -/** - * @ingroup los_pm - * @brief Freeze delay tasks, internal interfaces between modules. - * - * @par Description: - * This API is used to freeze delay tasks. - * - * @attention None. - * - * @param taskID [IN] task ID. - * - * @retval None. - * @par Dependency: - * - * @see OsPmUnfreezeTaskUnsafe - */ -VOID OsPmFreezeTaskUnsafe(UINT32 taskID); - -/** - * @ingroup los_pm - * @brief Unfreeze delayed tasks, internal interface between modules. - * - * @par Description: - * This API is used to unfreeze delayed tasks. - * - * @attention None. - * - * @param taskID [IN] task ID. - * - * @retval None. - * @par Dependency: - * - * @see OsPmFreezeTaskUnsafe - */ -VOID OsPmUnfreezeTaskUnsafe(UINT32 taskID); +#else +#define OsIsPmMode() (0) +#endif /** * @ingroup los_pm diff --git a/kernel/include/los_sched.h b/kernel/include/los_sched.h index df26da61..7c7df691 100644 --- a/kernel/include/los_sched.h +++ b/kernel/include/los_sched.h @@ -79,6 +79,10 @@ VOID OsSchedYield(VOID); VOID OsSchedTaskExit(LosTaskCB *taskCB); +VOID OsSchedSuspend(LosTaskCB *taskCB); + +BOOL OsSchedResume(LosTaskCB *taskCB); + VOID OsSchedTick(VOID); UINT32 OsSchedInit(VOID); diff --git a/kernel/src/los_sched.c b/kernel/src/los_sched.c index 9d295218..421396d8 100644 --- a/kernel/src/los_sched.c +++ b/kernel/src/los_sched.c @@ -34,9 +34,7 @@ #include "los_tick.h" #include "los_debug.h" #include "los_hook.h" -#if (LOSCFG_KERNEL_PM == 1) #include "los_pm.h" -#endif #ifdef __cplusplus #if __cplusplus @@ -222,7 +220,6 @@ STATIC INLINE VOID OsSchedSetNextExpireTime(UINT64 startTime, UINT32 responseID, VOID OsSchedUpdateExpireTime(UINT64 startTime, BOOL timeUpdate) { - BOOL isPmMode = FALSE; UINT64 endTime; LosTaskCB *runTask = g_losTask.runTask; @@ -230,9 +227,7 @@ VOID OsSchedUpdateExpireTime(UINT64 startTime, BOOL timeUpdate) return; } -#if (LOSCFG_KERNEL_PM == 1) - isPmMode = OsIsPmMode(); -#endif + BOOL isPmMode = OsIsPmMode(); if ((runTask->taskID != g_idleTaskID) && !isPmMode) { INT32 timeSlice = (runTask->timeSlice <= OS_TIME_SLICE_MIN) ? OS_SCHED_TIME_SLICES : runTask->timeSlice; endTime = startTime + timeSlice; @@ -415,6 +410,66 @@ VOID OsSchedTaskWake(LosTaskCB *resumedTask) } } +STATIC VOID OsSchedFreezeTask(LosTaskCB *taskCB) +{ + UINT64 responseTime = GET_SORTLIST_VALUE(&taskCB->sortList); + OsDeleteSortLink(&taskCB->sortList, OS_SORT_LINK_TASK); + SET_SORTLIST_VALUE(&taskCB->sortList, responseTime); + taskCB->taskStatus |= OS_TASK_FALG_FREEZE; + return; +} + +STATIC VOID OsSchedUnfreezeTask(LosTaskCB *taskCB) +{ + UINT64 currTime, responseTime; + UINT32 remainTick; + + taskCB->taskStatus &= ~OS_TASK_FALG_FREEZE; + currTime = OsGetCurrSchedTimeCycle(); + responseTime = GET_SORTLIST_VALUE(&taskCB->sortList); + if (responseTime > currTime) { + remainTick = ((responseTime - currTime) + OS_CYCLE_PER_TICK - 1) / OS_CYCLE_PER_TICK; + OsAdd2SortLink(&taskCB->sortList, currTime, remainTick, OS_SORT_LINK_TASK); + return; + } + + SET_SORTLIST_VALUE(&taskCB->sortList, OS_SORT_LINK_INVALID_TIME); + if (taskCB->taskStatus & OS_TASK_STATUS_PEND) { + LOS_ListDelete(&taskCB->pendList); + } + taskCB->taskStatus &= ~(OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND_TIME | OS_TASK_STATUS_PEND); + return; +} + +VOID OsSchedSuspend(LosTaskCB *taskCB) +{ + if (taskCB->taskStatus & OS_TASK_STATUS_READY) { + OsSchedTaskDeQueue(taskCB); + } + + if ((taskCB->taskStatus & (OS_TASK_STATUS_PEND_TIME | OS_TASK_STATUS_DELAY)) && OsIsPmMode()) { + OsSchedFreezeTask(taskCB); + } + + taskCB->taskStatus |= OS_TASK_STATUS_SUSPEND; + OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOSUSPENDEDLIST, taskCB); +} + +BOOL OsSchedResume(LosTaskCB *taskCB) +{ + if (taskCB->taskStatus & OS_TASK_FALG_FREEZE) { + OsSchedUnfreezeTask(taskCB); + } + + taskCB->taskStatus &= (~OS_TASK_STATUS_SUSPEND); + if (!(taskCB->taskStatus & (OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND))) { + OsSchedTaskEnQueue(taskCB); + return TRUE; + } + + return FALSE; +} + BOOL OsSchedModifyTaskSchedParam(LosTaskCB *taskCB, UINT16 priority) { if (taskCB->taskStatus & OS_TASK_STATUS_READY) { diff --git a/kernel/src/los_task.c b/kernel/src/los_task.c index d4d380ac..c2dbd3ee 100644 --- a/kernel/src/los_task.c +++ b/kernel/src/los_task.c @@ -71,11 +71,6 @@ #define UWROLLNUMDEC(NUMBER) \ ((NUMBER) = ((NUMBER) - 1)) - -#define OS_CHECK_TASK_BLOCK (OS_TASK_STATUS_DELAY | \ - OS_TASK_STATUS_PEND | \ - OS_TASK_STATUS_SUSPEND) - /** * @ingroup los_task * @brief check task id's validation @@ -830,20 +825,11 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskID) OS_GOTO_ERREND(); } -#if (LOSCFG_KERNEL_PM == 1) - if (tempStatus & OS_TASK_FALG_FREEZE) { - OsPmUnfreezeTaskUnsafe(taskID); - } -#endif - - taskCB->taskStatus &= (~OS_TASK_STATUS_SUSPEND); - if (!(taskCB->taskStatus & OS_CHECK_TASK_BLOCK)) { - OsSchedTaskEnQueue(taskCB); - if (g_taskScheduled) { - LOS_IntRestore(intSave); - LOS_Schedule(); - return LOS_OK; - } + BOOL needSched = OsSchedResume(taskCB); + if (needSched && g_taskScheduled) { + LOS_IntRestore(intSave); + LOS_Schedule(); + return LOS_OK; } LOS_IntRestore(intSave); @@ -897,18 +883,8 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskSuspend(UINT32 taskID) OS_GOTO_ERREND(); } - if (tempStatus & OS_TASK_STATUS_READY) { - OsSchedTaskDeQueue(taskCB); - } + OsSchedSuspend(taskCB); -#if (LOSCFG_KERNEL_PM == 1) - if ((tempStatus & (OS_TASK_STATUS_PEND_TIME | OS_TASK_STATUS_DELAY)) && OsIsPmMode()) { - OsPmFreezeTaskUnsafe(taskID); - } -#endif - - taskCB->taskStatus |= OS_TASK_STATUS_SUSPEND; - OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOSUSPENDEDLIST, taskCB); if (taskID == g_losTask.runTask->taskID) { LOS_IntRestore(intSave); LOS_Schedule();