commit
2ad9dc0eac
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue