feat: 调度、任务及pm解耦

pm中冻结线程的操作,融合至OsSchedSuspend和OsSchedResume,
使得调度模块提供对应完整的方法给任务模块,做到之间的相互解耦,
方便其它调度算法的融入。

Close #I4JTN6
Signed-off-by: zhushengle <zhushengle@huawei.com>
Change-Id: Ifde7077166a2fe67e7246fa68f777844640d67db
This commit is contained in:
zhushengle 2021-11-24 15:06:12 +08:00
parent 4e0bf74f4a
commit cc8a794229
5 changed files with 75 additions and 107 deletions

View File

@ -657,41 +657,6 @@ UINT32 LOS_PmLockRelease(const CHAR *name)
return ret; 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) STATIC VOID OsPmSwtmrHandler(UINT32 arg)
{ {
const CHAR *name = (const CHAR *)arg; const CHAR *name = (const CHAR *)arg;

View File

@ -233,43 +233,11 @@ UINT32 OsPmInit(VOID);
* <ul><li>los_pm.h: the header file that contains the API declaration.</li></ul> * <ul><li>los_pm.h: the header file that contains the API declaration.</li></ul>
* @see * @see
*/ */
#if (LOSCFG_KERNEL_PM == 1)
BOOL OsIsPmMode(VOID); BOOL OsIsPmMode(VOID);
#else
/** #define OsIsPmMode() (0)
* @ingroup los_pm #endif
* @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:
* <ul><li>los_pm.h: the header file that contains the API declaration.</li></ul>
* @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:
* <ul><li>los_pm.h: the header file that contains the API declaration.</li></ul>
* @see OsPmFreezeTaskUnsafe
*/
VOID OsPmUnfreezeTaskUnsafe(UINT32 taskID);
/** /**
* @ingroup los_pm * @ingroup los_pm

View File

@ -79,6 +79,10 @@ VOID OsSchedYield(VOID);
VOID OsSchedTaskExit(LosTaskCB *taskCB); VOID OsSchedTaskExit(LosTaskCB *taskCB);
VOID OsSchedSuspend(LosTaskCB *taskCB);
BOOL OsSchedResume(LosTaskCB *taskCB);
VOID OsSchedTick(VOID); VOID OsSchedTick(VOID);
UINT32 OsSchedInit(VOID); UINT32 OsSchedInit(VOID);

View File

@ -34,9 +34,7 @@
#include "los_tick.h" #include "los_tick.h"
#include "los_debug.h" #include "los_debug.h"
#include "los_hook.h" #include "los_hook.h"
#if (LOSCFG_KERNEL_PM == 1)
#include "los_pm.h" #include "los_pm.h"
#endif
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus
@ -222,7 +220,6 @@ STATIC INLINE VOID OsSchedSetNextExpireTime(UINT64 startTime, UINT32 responseID,
VOID OsSchedUpdateExpireTime(UINT64 startTime, BOOL timeUpdate) VOID OsSchedUpdateExpireTime(UINT64 startTime, BOOL timeUpdate)
{ {
BOOL isPmMode = FALSE;
UINT64 endTime; UINT64 endTime;
LosTaskCB *runTask = g_losTask.runTask; LosTaskCB *runTask = g_losTask.runTask;
@ -230,9 +227,7 @@ VOID OsSchedUpdateExpireTime(UINT64 startTime, BOOL timeUpdate)
return; return;
} }
#if (LOSCFG_KERNEL_PM == 1) BOOL isPmMode = OsIsPmMode();
isPmMode = OsIsPmMode();
#endif
if ((runTask->taskID != g_idleTaskID) && !isPmMode) { if ((runTask->taskID != g_idleTaskID) && !isPmMode) {
INT32 timeSlice = (runTask->timeSlice <= OS_TIME_SLICE_MIN) ? OS_SCHED_TIME_SLICES : runTask->timeSlice; INT32 timeSlice = (runTask->timeSlice <= OS_TIME_SLICE_MIN) ? OS_SCHED_TIME_SLICES : runTask->timeSlice;
endTime = startTime + 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) BOOL OsSchedModifyTaskSchedParam(LosTaskCB *taskCB, UINT16 priority)
{ {
if (taskCB->taskStatus & OS_TASK_STATUS_READY) { if (taskCB->taskStatus & OS_TASK_STATUS_READY) {

View File

@ -71,11 +71,6 @@
#define UWROLLNUMDEC(NUMBER) \ #define UWROLLNUMDEC(NUMBER) \
((NUMBER) = ((NUMBER) - 1)) ((NUMBER) = ((NUMBER) - 1))
#define OS_CHECK_TASK_BLOCK (OS_TASK_STATUS_DELAY | \
OS_TASK_STATUS_PEND | \
OS_TASK_STATUS_SUSPEND)
/** /**
* @ingroup los_task * @ingroup los_task
* @brief check task id's validation * @brief check task id's validation
@ -830,21 +825,12 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskID)
OS_GOTO_ERREND(); OS_GOTO_ERREND();
} }
#if (LOSCFG_KERNEL_PM == 1) BOOL needSched = OsSchedResume(taskCB);
if (tempStatus & OS_TASK_FALG_FREEZE) { if (needSched && g_taskScheduled) {
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_IntRestore(intSave);
LOS_Schedule(); LOS_Schedule();
return LOS_OK; return LOS_OK;
} }
}
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
return LOS_OK; return LOS_OK;
@ -897,18 +883,8 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskSuspend(UINT32 taskID)
OS_GOTO_ERREND(); OS_GOTO_ERREND();
} }
if (tempStatus & OS_TASK_STATUS_READY) { OsSchedSuspend(taskCB);
OsSchedTaskDeQueue(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) { if (taskID == g_losTask.runTask->taskID) {
LOS_IntRestore(intSave); LOS_IntRestore(intSave);
LOS_Schedule(); LOS_Schedule();