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);
*
- los_pm.h: the header file that contains the API declaration.
* @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:
- * - los_pm.h: the header file that contains the API declaration.
- * @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:
- * - los_pm.h: the header file that contains the API declaration.
- * @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();