feat: 支持调度框架
Close #I4Z3BL Signed-off-by: zhushengle <zhushengle@huawei.com> Change-Id: I5f32d1001ffabc0f725ce65b51ed9b3791e97f2b
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
|
||||
* Copyright (c) 2020-2022 Huawei Device Co., Ltd. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
@@ -87,7 +87,7 @@ VOID OsDeleteTaskFromProcess(LosTaskCB *taskCB)
|
||||
OsTaskInsertToRecycleList(taskCB);
|
||||
}
|
||||
|
||||
UINT32 OsProcessAddNewTask(UINT32 pid, LosTaskCB *taskCB)
|
||||
UINT32 OsProcessAddNewTask(UINT32 pid, LosTaskCB *taskCB, SchedParam *param)
|
||||
{
|
||||
UINT32 intSave;
|
||||
UINT16 numCount;
|
||||
@@ -100,12 +100,14 @@ UINT32 OsProcessAddNewTask(UINT32 pid, LosTaskCB *taskCB)
|
||||
if (OsProcessIsUserMode(processCB)) {
|
||||
taskCB->taskStatus |= OS_TASK_FLAG_USER_MODE;
|
||||
if (processCB->threadNumber > 0) {
|
||||
taskCB->basePrio = OS_TCB_FROM_TID(processCB->threadGroupID)->basePrio;
|
||||
LosTaskCB *task = OS_TCB_FROM_TID(processCB->threadGroupID);
|
||||
task->ops->schedParamGet(task, param);
|
||||
} else {
|
||||
taskCB->basePrio = OS_USER_PROCESS_PRIORITY_HIGHEST;
|
||||
OsSchedProcessDefaultSchedParamGet(param->policy, param);
|
||||
}
|
||||
} else {
|
||||
taskCB->basePrio = OsCurrTaskGet()->basePrio;
|
||||
LosTaskCB *runTask = OsCurrTaskGet();
|
||||
runTask->ops->schedParamGet(runTask, param);
|
||||
}
|
||||
|
||||
#ifdef LOSCFG_KERNEL_VM
|
||||
@@ -283,7 +285,7 @@ STATIC LosProcessCB *OsFindExitChildProcess(const LosProcessCB *processCB, INT32
|
||||
VOID OsWaitWakeTask(LosTaskCB *taskCB, UINT32 wakePID)
|
||||
{
|
||||
taskCB->waitID = wakePID;
|
||||
OsSchedTaskWake(taskCB);
|
||||
taskCB->ops->wake(taskCB);
|
||||
#ifdef LOSCFG_KERNEL_SMP
|
||||
LOS_MpSchedule(OS_MP_CPU_ALL);
|
||||
#endif
|
||||
@@ -897,7 +899,7 @@ STATIC INLINE INT32 OsProcessSchedlerParamCheck(INT32 which, INT32 pid, UINT16 p
|
||||
}
|
||||
|
||||
#ifdef LOSCFG_SECURITY_CAPABILITY
|
||||
STATIC BOOL OsProcessCapPermitCheck(const LosProcessCB *processCB, UINT16 prio)
|
||||
STATIC BOOL OsProcessCapPermitCheck(const LosProcessCB *processCB, const SchedParam *param, UINT16 prio)
|
||||
{
|
||||
LosProcessCB *runProcess = OsCurrProcessGet();
|
||||
|
||||
@@ -907,7 +909,7 @@ STATIC BOOL OsProcessCapPermitCheck(const LosProcessCB *processCB, UINT16 prio)
|
||||
}
|
||||
|
||||
/* user mode process can reduce the priority of itself */
|
||||
if ((runProcess->processID == processCB->processID) && (prio > OsCurrTaskGet()->basePrio)) {
|
||||
if ((runProcess->processID == processCB->processID) && (prio > param->basePrio)) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -921,31 +923,33 @@ STATIC BOOL OsProcessCapPermitCheck(const LosProcessCB *processCB, UINT16 prio)
|
||||
|
||||
LITE_OS_SEC_TEXT INT32 OsSetProcessScheduler(INT32 which, INT32 pid, UINT16 prio, UINT16 policy)
|
||||
{
|
||||
LosProcessCB *processCB = NULL;
|
||||
BOOL needSched = FALSE;
|
||||
SchedParam param = { 0 };
|
||||
UINT32 intSave;
|
||||
INT32 ret;
|
||||
|
||||
ret = OsProcessSchedlerParamCheck(which, pid, prio, policy);
|
||||
INT32 ret = OsProcessSchedlerParamCheck(which, pid, prio, policy);
|
||||
if (ret != LOS_OK) {
|
||||
return -ret;
|
||||
}
|
||||
|
||||
LosProcessCB *processCB = OS_PCB_FROM_PID(pid);
|
||||
SCHEDULER_LOCK(intSave);
|
||||
processCB = OS_PCB_FROM_PID(pid);
|
||||
if (OsProcessIsInactive(processCB)) {
|
||||
ret = LOS_ESRCH;
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
#ifdef LOSCFG_SECURITY_CAPABILITY
|
||||
if (!OsProcessCapPermitCheck(processCB, prio)) {
|
||||
if (!OsProcessCapPermitCheck(processCB, ¶m, prio)) {
|
||||
ret = LOS_EPERM;
|
||||
goto EXIT;
|
||||
}
|
||||
#endif
|
||||
|
||||
needSched = OsSchedModifyProcessSchedParam(pid, policy, prio);
|
||||
LosTaskCB *taskCB = OS_TCB_FROM_TID(processCB->threadGroupID);
|
||||
taskCB->ops->schedParamGet(taskCB, ¶m);
|
||||
param.basePrio = prio;
|
||||
|
||||
BOOL needSched = taskCB->ops->schedParamModify(taskCB, ¶m);
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
|
||||
LOS_MpSchedule(OS_MP_CPU_ALL);
|
||||
@@ -993,6 +997,7 @@ LITE_OS_SEC_TEXT INT32 OsGetProcessPriority(INT32 which, INT32 pid)
|
||||
{
|
||||
INT32 prio;
|
||||
UINT32 intSave;
|
||||
SchedParam param = { 0 };
|
||||
(VOID)which;
|
||||
|
||||
if (OS_PID_CHECK_INVALID(pid)) {
|
||||
@@ -1010,11 +1015,12 @@ LITE_OS_SEC_TEXT INT32 OsGetProcessPriority(INT32 which, INT32 pid)
|
||||
goto OUT;
|
||||
}
|
||||
|
||||
prio = (INT32)OS_TCB_FROM_TID(processCB->threadGroupID)->basePrio;
|
||||
LosTaskCB *taskCB = OS_TCB_FROM_TID(processCB->threadGroupID);
|
||||
taskCB->ops->schedParamGet(taskCB, ¶m);
|
||||
|
||||
OUT:
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
return prio;
|
||||
return param.basePrio;
|
||||
}
|
||||
|
||||
LITE_OS_SEC_TEXT INT32 LOS_GetProcessPriority(INT32 pid)
|
||||
@@ -1050,8 +1056,7 @@ STATIC VOID OsWaitInsertWaitListInOrder(LosTaskCB *runTask, LosProcessCB *proces
|
||||
/* if runTask->waitFlag == OS_PROCESS_WAIT_PRO,
|
||||
* this node is inserted directly into the header of the waitList
|
||||
*/
|
||||
|
||||
(VOID)OsSchedTaskWait(list->pstNext, LOS_WAIT_FOREVER, TRUE);
|
||||
(VOID)runTask->ops->wait(runTask, list->pstNext, LOS_WAIT_FOREVER);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1202,13 +1207,10 @@ STATIC INT32 OsWait(INT32 pid, USER INT32 *status, USER siginfo_t *info, UINT32
|
||||
UINT32 ret;
|
||||
UINT32 intSave;
|
||||
LosProcessCB *childCB = NULL;
|
||||
LosProcessCB *processCB = NULL;
|
||||
LosTaskCB *runTask = NULL;
|
||||
|
||||
LosProcessCB *processCB = OsCurrProcessGet();
|
||||
LosTaskCB *runTask = OsCurrTaskGet();
|
||||
SCHEDULER_LOCK(intSave);
|
||||
processCB = OsCurrProcessGet();
|
||||
runTask = OsCurrTaskGet();
|
||||
|
||||
ret = OsWaitChildProcessCheck(processCB, pid, &childCB);
|
||||
if (ret != LOS_OK) {
|
||||
pid = -ret;
|
||||
@@ -1725,47 +1727,37 @@ STATIC UINT32 OsCopyUser(LosProcessCB *childCB, LosProcessCB *parentCB)
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
STATIC VOID OsInitCopyTaskParam(LosProcessCB *childProcessCB, const CHAR *name, UINTPTR entry, UINT32 size,
|
||||
TSK_INIT_PARAM_S *childPara)
|
||||
{
|
||||
LosTaskCB *mainThread = NULL;
|
||||
UINT32 intSave;
|
||||
|
||||
SCHEDULER_LOCK(intSave);
|
||||
mainThread = OsCurrTaskGet();
|
||||
|
||||
if (OsProcessIsUserMode(childProcessCB)) {
|
||||
childPara->pfnTaskEntry = mainThread->taskEntry;
|
||||
childPara->uwStackSize = mainThread->stackSize;
|
||||
childPara->userParam.userArea = mainThread->userArea;
|
||||
childPara->userParam.userMapBase = mainThread->userMapBase;
|
||||
childPara->userParam.userMapSize = mainThread->userMapSize;
|
||||
} else {
|
||||
childPara->pfnTaskEntry = (TSK_ENTRY_FUNC)entry;
|
||||
childPara->uwStackSize = size;
|
||||
}
|
||||
childPara->pcName = (CHAR *)name;
|
||||
childPara->policy = mainThread->policy;
|
||||
childPara->usTaskPrio = mainThread->priority;
|
||||
childPara->processID = childProcessCB->processID;
|
||||
if (mainThread->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) {
|
||||
childPara->uwResved = LOS_TASK_ATTR_JOINABLE;
|
||||
}
|
||||
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
}
|
||||
|
||||
STATIC UINT32 OsCopyTask(UINT32 flags, LosProcessCB *childProcessCB, const CHAR *name, UINTPTR entry, UINT32 size)
|
||||
{
|
||||
LosTaskCB *runTask = OsCurrTaskGet();
|
||||
TSK_INIT_PARAM_S childPara = { 0 };
|
||||
UINT32 ret;
|
||||
UINT32 intSave;
|
||||
UINT32 taskID;
|
||||
TSK_INIT_PARAM_S taskParam = { 0 };
|
||||
UINT32 ret, taskID, intSave;
|
||||
SchedParam param = { 0 };
|
||||
|
||||
OsInitCopyTaskParam(childProcessCB, name, entry, size, &childPara);
|
||||
SCHEDULER_LOCK(intSave);
|
||||
if (OsProcessIsUserMode(childProcessCB)) {
|
||||
taskParam.pfnTaskEntry = runTask->taskEntry;
|
||||
taskParam.uwStackSize = runTask->stackSize;
|
||||
taskParam.userParam.userArea = runTask->userArea;
|
||||
taskParam.userParam.userMapBase = runTask->userMapBase;
|
||||
taskParam.userParam.userMapSize = runTask->userMapSize;
|
||||
} else {
|
||||
taskParam.pfnTaskEntry = (TSK_ENTRY_FUNC)entry;
|
||||
taskParam.uwStackSize = size;
|
||||
}
|
||||
if (runTask->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) {
|
||||
taskParam.uwResved = LOS_TASK_ATTR_JOINABLE;
|
||||
}
|
||||
|
||||
ret = LOS_TaskCreateOnly(&taskID, &childPara);
|
||||
runTask->ops->schedParamGet(runTask, ¶m);
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
|
||||
taskParam.pcName = (CHAR *)name;
|
||||
taskParam.policy = param.policy;
|
||||
taskParam.usTaskPrio = param.priority;
|
||||
taskParam.processID = childProcessCB->processID;
|
||||
|
||||
ret = LOS_TaskCreateOnly(&taskID, &taskParam);
|
||||
if (ret != LOS_OK) {
|
||||
if (ret == LOS_ERRNO_TSK_TCB_UNAVAILABLE) {
|
||||
return LOS_EAGAIN;
|
||||
@@ -1775,7 +1767,7 @@ STATIC UINT32 OsCopyTask(UINT32 flags, LosProcessCB *childProcessCB, const CHAR
|
||||
|
||||
LosTaskCB *childTaskCB = OS_TCB_FROM_TID(taskID);
|
||||
childTaskCB->taskStatus = runTask->taskStatus;
|
||||
childTaskCB->basePrio = runTask->basePrio;
|
||||
childTaskCB->ops->schedParamModify(childTaskCB, ¶m);
|
||||
if (childTaskCB->taskStatus & OS_TASK_STATUS_RUNNING) {
|
||||
childTaskCB->taskStatus &= ~OS_TASK_STATUS_RUNNING;
|
||||
} else {
|
||||
@@ -1882,6 +1874,7 @@ STATIC UINT32 OsChildSetProcessGroupAndSched(LosProcessCB *child, LosProcessCB *
|
||||
UINT32 ret;
|
||||
ProcessGroup *group = NULL;
|
||||
|
||||
LosTaskCB *taskCB = OS_TCB_FROM_TID(child->threadGroupID);
|
||||
SCHEDULER_LOCK(intSave);
|
||||
if (run->group->groupID == OS_USER_PRIVILEGE_PROCESS_GROUP) {
|
||||
ret = OsSetProcessGroupIDUnsafe(child->processID, child->processID, &group);
|
||||
@@ -1892,7 +1885,7 @@ STATIC UINT32 OsChildSetProcessGroupAndSched(LosProcessCB *child, LosProcessCB *
|
||||
}
|
||||
|
||||
child->processStatus &= ~OS_PROCESS_STATUS_INIT;
|
||||
OsSchedTaskEnQueue(OS_TCB_FROM_TID(child->threadGroupID));
|
||||
taskCB->ops->enqueue(OsSchedRunqueue(), taskCB);
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
|
||||
(VOID)LOS_MemFree(m_aucSysMem1, group);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
|
||||
* Copyright (c) 2020-2022 Huawei Device Co., Ltd. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
@@ -59,9 +59,9 @@ typedef struct {
|
||||
SortLinkAttribute swtmrSortLink;
|
||||
LosTaskCB *swtmrTask; /* software timer task id */
|
||||
LOS_DL_LIST swtmrHandlerQueue; /* software timer timeout queue id */
|
||||
} SwtmrRunQue;
|
||||
} SwtmrRunqueue;
|
||||
|
||||
STATIC SwtmrRunQue g_swtmrRunQue[LOSCFG_KERNEL_CORE_NUM];
|
||||
STATIC SwtmrRunqueue g_swtmrRunqueue[LOSCFG_KERNEL_CORE_NUM];
|
||||
|
||||
#ifdef LOSCFG_SWTMR_DEBUG
|
||||
#define OS_SWTMR_PERIOD_TO_CYCLE(period) (((UINT64)(period) * OS_NS_PER_TICK) / OS_NS_PER_CYCLE)
|
||||
@@ -182,7 +182,7 @@ STATIC INLINE VOID SwtmrHandler(SwtmrHandlerItemPtr swtmrHandle)
|
||||
#endif
|
||||
}
|
||||
|
||||
STATIC INLINE VOID SwtmrWake(SwtmrRunQue *srq, UINT64 startTime, SortLinkList *sortList)
|
||||
STATIC INLINE VOID SwtmrWake(SwtmrRunqueue *srq, UINT64 startTime, SortLinkList *sortList)
|
||||
{
|
||||
UINT32 intSave;
|
||||
SWTMR_CTRL_S *swtmr = LOS_DL_LIST_ENTRY(sortList, SWTMR_CTRL_S, stSortList);
|
||||
@@ -216,7 +216,7 @@ STATIC INLINE VOID SwtmrWake(SwtmrRunQue *srq, UINT64 startTime, SortLinkList *s
|
||||
SWTMR_UNLOCK(intSave);
|
||||
}
|
||||
|
||||
STATIC INLINE VOID ScanSwtmrTimeList(SwtmrRunQue *srq)
|
||||
STATIC INLINE VOID ScanSwtmrTimeList(SwtmrRunqueue *srq)
|
||||
{
|
||||
UINT32 intSave;
|
||||
SortLinkAttribute *swtmrSortLink = &srq->swtmrSortLink;
|
||||
@@ -261,13 +261,13 @@ STATIC VOID SwtmrTask(VOID)
|
||||
UINT32 intSave;
|
||||
UINT64 waitTime;
|
||||
|
||||
SwtmrRunQue *srq = &g_swtmrRunQue[ArchCurrCpuid()];
|
||||
SwtmrRunqueue *srq = &g_swtmrRunqueue[ArchCurrCpuid()];
|
||||
LOS_DL_LIST *head = &srq->swtmrHandlerQueue;
|
||||
for (;;) {
|
||||
waitTime = OsSortLinkGetNextExpireTime(OsGetCurrSchedTimeCycle(), &srq->swtmrSortLink);
|
||||
if (waitTime != 0) {
|
||||
SCHEDULER_LOCK(intSave);
|
||||
OsSchedDelay(srq->swtmrTask, waitTime);
|
||||
srq->swtmrTask->ops->delay(srq->swtmrTask, waitTime);
|
||||
OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTODELAYEDLIST, srq->swtmrTask);
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
}
|
||||
@@ -309,7 +309,7 @@ STATIC UINT32 SwtmrTaskCreate(UINT16 cpuid, UINT32 *swtmrTaskID)
|
||||
|
||||
UINT32 OsSwtmrTaskIDGetByCpuid(UINT16 cpuid)
|
||||
{
|
||||
return g_swtmrRunQue[cpuid].swtmrTask->taskID;
|
||||
return g_swtmrRunqueue[cpuid].swtmrTask->taskID;
|
||||
}
|
||||
|
||||
BOOL OsIsSwtmrTask(const LosTaskCB *taskCB)
|
||||
@@ -358,7 +358,7 @@ STATIC UINT32 SwtmrBaseInit(VOID)
|
||||
}
|
||||
|
||||
for (UINT16 index = 0; index < LOSCFG_KERNEL_CORE_NUM; index++) {
|
||||
SwtmrRunQue *srq = &g_swtmrRunQue[index];
|
||||
SwtmrRunqueue *srq = &g_swtmrRunqueue[index];
|
||||
/* The linked list of all cores must be initialized at core 0 startup for load balancing */
|
||||
OsSortLinkInit(&srq->swtmrSortLink);
|
||||
LOS_ListInit(&srq->swtmrHandlerQueue);
|
||||
@@ -389,7 +389,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrInit(VOID)
|
||||
goto ERROR;
|
||||
}
|
||||
|
||||
SwtmrRunQue *srq = &g_swtmrRunQue[cpuid];
|
||||
SwtmrRunqueue *srq = &g_swtmrRunqueue[cpuid];
|
||||
srq->swtmrTask = OsGetTaskCB(swtmrTaskID);
|
||||
return LOS_OK;
|
||||
|
||||
@@ -403,13 +403,13 @@ ERROR:
|
||||
}
|
||||
|
||||
#ifdef LOSCFG_KERNEL_SMP
|
||||
STATIC INLINE VOID FindIdleSwtmrRunQue(UINT16 *idleCpuid)
|
||||
STATIC INLINE VOID FindIdleSwtmrRunqueue(UINT16 *idleCpuid)
|
||||
{
|
||||
SwtmrRunQue *idleRq = &g_swtmrRunQue[0];
|
||||
SwtmrRunqueue *idleRq = &g_swtmrRunqueue[0];
|
||||
UINT32 nodeNum = OsGetSortLinkNodeNum(&idleRq->swtmrSortLink);
|
||||
UINT16 cpuid = 1;
|
||||
do {
|
||||
SwtmrRunQue *srq = &g_swtmrRunQue[cpuid];
|
||||
SwtmrRunqueue *srq = &g_swtmrRunqueue[cpuid];
|
||||
UINT32 temp = OsGetSortLinkNodeNum(&srq->swtmrSortLink);
|
||||
if (nodeNum > temp) {
|
||||
*idleCpuid = cpuid;
|
||||
@@ -422,7 +422,7 @@ STATIC INLINE VOID FindIdleSwtmrRunQue(UINT16 *idleCpuid)
|
||||
|
||||
STATIC INLINE VOID AddSwtmr2TimeList(SortLinkList *node, UINT64 responseTime, UINT16 cpuid)
|
||||
{
|
||||
SwtmrRunQue *srq = &g_swtmrRunQue[cpuid];
|
||||
SwtmrRunqueue *srq = &g_swtmrRunqueue[cpuid];
|
||||
OsAdd2SortLink(&srq->swtmrSortLink, node, responseTime, cpuid);
|
||||
}
|
||||
|
||||
@@ -433,7 +433,7 @@ STATIC INLINE VOID DeSwtmrFromTimeList(SortLinkList *node)
|
||||
#else
|
||||
UINT16 cpuid = 0;
|
||||
#endif
|
||||
SwtmrRunQue *srq = &g_swtmrRunQue[cpuid];
|
||||
SwtmrRunqueue *srq = &g_swtmrRunqueue[cpuid];
|
||||
OsDeleteFromSortLink(&srq->swtmrSortLink, node);
|
||||
return;
|
||||
}
|
||||
@@ -442,7 +442,7 @@ STATIC VOID SwtmrAdjustCheck(UINT16 cpuid, UINT64 responseTime)
|
||||
{
|
||||
UINT32 ret;
|
||||
UINT32 intSave;
|
||||
SwtmrRunQue *srq = &g_swtmrRunQue[cpuid];
|
||||
SwtmrRunqueue *srq = &g_swtmrRunqueue[cpuid];
|
||||
SCHEDULER_LOCK(intSave);
|
||||
if ((srq->swtmrTask == NULL) || !OsTaskIsBlocked(srq->swtmrTask)) {
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
@@ -454,14 +454,14 @@ STATIC VOID SwtmrAdjustCheck(UINT16 cpuid, UINT64 responseTime)
|
||||
return;
|
||||
}
|
||||
|
||||
ret = OsSchedAdjustTaskFromTimeList(srq->swtmrTask, responseTime);
|
||||
ret = OsSchedTimeoutQueueAdjust(srq->swtmrTask, responseTime);
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
if (ret != LOS_OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (cpuid == ArchCurrCpuid()) {
|
||||
OsSchedUpdateExpireTime();
|
||||
OsSchedExpireTimeUpdate();
|
||||
} else {
|
||||
LOS_MpSchedule(CPUID_TO_AFFI_MASK(cpuid));
|
||||
}
|
||||
@@ -505,7 +505,7 @@ STATIC INLINE VOID SwtmrStart(SWTMR_CTRL_S *swtmr)
|
||||
UINT64 responseTime;
|
||||
UINT16 idleCpu = 0;
|
||||
#ifdef LOSCFG_KERNEL_SMP
|
||||
FindIdleSwtmrRunQue(&idleCpu);
|
||||
FindIdleSwtmrRunqueue(&idleCpu);
|
||||
#endif
|
||||
swtmr->startTime = OsGetCurrSchedTimeCycle();
|
||||
responseTime = SwtmrToStart(swtmr, idleCpu);
|
||||
@@ -543,7 +543,7 @@ STATIC INLINE VOID SwtmrRestart(UINT64 startTime, SortLinkList *sortList, UINT16
|
||||
VOID OsSwtmrResponseTimeReset(UINT64 startTime)
|
||||
{
|
||||
UINT16 cpuid = ArchCurrCpuid();
|
||||
SortLinkAttribute *swtmrSortLink = &g_swtmrRunQue[cpuid].swtmrSortLink;
|
||||
SortLinkAttribute *swtmrSortLink = &g_swtmrRunqueue[cpuid].swtmrSortLink;
|
||||
LOS_DL_LIST *listHead = &swtmrSortLink->sortLink;
|
||||
LOS_DL_LIST *listNext = listHead->pstNext;
|
||||
|
||||
@@ -561,7 +561,7 @@ VOID OsSwtmrResponseTimeReset(UINT64 startTime)
|
||||
LOS_SpinUnlock(&swtmrSortLink->spinLock);
|
||||
}
|
||||
|
||||
STATIC INLINE BOOL SwtmrRunQueFind(SortLinkAttribute *swtmrSortLink, SCHED_TL_FIND_FUNC checkFunc, UINTPTR arg)
|
||||
STATIC INLINE BOOL SwtmrRunqueueFind(SortLinkAttribute *swtmrSortLink, SCHED_TL_FIND_FUNC checkFunc, UINTPTR arg)
|
||||
{
|
||||
LOS_DL_LIST *listObject = &swtmrSortLink->sortLink;
|
||||
LOS_DL_LIST *list = listObject->pstNext;
|
||||
@@ -583,8 +583,8 @@ STATIC INLINE BOOL SwtmrRunQueFind(SortLinkAttribute *swtmrSortLink, SCHED_TL_FI
|
||||
STATIC BOOL SwtmrTimeListFind(SCHED_TL_FIND_FUNC checkFunc, UINTPTR arg)
|
||||
{
|
||||
for (UINT16 cpuid = 0; cpuid < LOSCFG_KERNEL_CORE_NUM; cpuid++) {
|
||||
SortLinkAttribute *swtmrSortLink = &g_swtmrRunQue[ArchCurrCpuid()].swtmrSortLink;
|
||||
if (SwtmrRunQueFind(swtmrSortLink, checkFunc, arg)) {
|
||||
SortLinkAttribute *swtmrSortLink = &g_swtmrRunqueue[ArchCurrCpuid()].swtmrSortLink;
|
||||
if (SwtmrRunqueueFind(swtmrSortLink, checkFunc, arg)) {
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
@@ -608,7 +608,7 @@ BOOL OsSwtmrWorkQueueFind(SCHED_TL_FIND_FUNC checkFunc, UINTPTR arg)
|
||||
LITE_OS_SEC_TEXT UINT32 OsSwtmrGetNextTimeout(VOID)
|
||||
{
|
||||
UINT64 currTime = OsGetCurrSchedTimeCycle();
|
||||
SwtmrRunQue *srq = &g_swtmrRunQue[ArchCurrCpuid()];
|
||||
SwtmrRunqueue *srq = &g_swtmrRunqueue[ArchCurrCpuid()];
|
||||
UINT64 time = (OsSortLinkGetNextExpireTime(currTime, &srq->swtmrSortLink) / OS_CYCLE_PER_TICK);
|
||||
if (time > OS_INVALID_VALUE) {
|
||||
time = OS_INVALID_VALUE;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
|
||||
* Copyright (c) 2020-2022 Huawei Device Co., Ltd. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
@@ -90,19 +90,23 @@ VOID OsSetMainTask()
|
||||
{
|
||||
UINT32 i;
|
||||
CHAR *name = "osMain";
|
||||
SchedParam schedParam = { 0 };
|
||||
|
||||
schedParam.policy = LOS_SCHED_RR;
|
||||
schedParam.basePrio = OS_PROCESS_PRIORITY_HIGHEST;
|
||||
schedParam.priority = OS_TASK_PRIORITY_LOWEST;
|
||||
|
||||
for (i = 0; i < LOSCFG_KERNEL_CORE_NUM; i++) {
|
||||
g_mainTask[i].taskStatus = OS_TASK_STATUS_UNUSED;
|
||||
g_mainTask[i].taskID = LOSCFG_BASE_CORE_TSK_LIMIT;
|
||||
g_mainTask[i].processID = OS_KERNEL_PROCESS_GROUP;
|
||||
g_mainTask[i].basePrio = OS_TASK_PRIORITY_HIGHEST;
|
||||
g_mainTask[i].priority = OS_TASK_PRIORITY_LOWEST;
|
||||
#ifdef LOSCFG_KERNEL_SMP_LOCKDEP
|
||||
g_mainTask[i].lockDep.lockDepth = 0;
|
||||
g_mainTask[i].lockDep.waitLock = NULL;
|
||||
#endif
|
||||
(VOID)strncpy_s(g_mainTask[i].taskName, OS_TCB_NAME_LEN, name, OS_TCB_NAME_LEN - 1);
|
||||
LOS_ListInit(&g_mainTask[i].lockList);
|
||||
(VOID)OsSchedParamInit(&g_mainTask[i], schedParam.policy, &schedParam, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,7 +128,7 @@ LITE_OS_SEC_TEXT_INIT VOID OsTaskJoinPostUnsafe(LosTaskCB *taskCB)
|
||||
if (!LOS_ListEmpty(&taskCB->joinList)) {
|
||||
LosTaskCB *resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(taskCB->joinList)));
|
||||
OsTaskWakeClearPendMask(resumedTask);
|
||||
OsSchedTaskWake(resumedTask);
|
||||
resumedTask->ops->wake(resumedTask);
|
||||
}
|
||||
}
|
||||
taskCB->taskStatus |= OS_TASK_STATUS_EXIT;
|
||||
@@ -142,7 +146,8 @@ LITE_OS_SEC_TEXT UINT32 OsTaskJoinPendUnsafe(LosTaskCB *taskCB)
|
||||
|
||||
if ((taskCB->taskStatus & OS_TASK_FLAG_PTHREAD_JOIN) && LOS_ListEmpty(&taskCB->joinList)) {
|
||||
OsTaskWaitSetPendMask(OS_TASK_WAIT_JOIN, taskCB->taskID, LOS_WAIT_FOREVER);
|
||||
return OsSchedTaskWait(&taskCB->joinList, LOS_WAIT_FOREVER, TRUE);
|
||||
LosTaskCB *runTask = OsCurrTaskGet();
|
||||
return runTask->ops->wait(runTask, &taskCB->joinList, LOS_WAIT_FOREVER);
|
||||
}
|
||||
|
||||
return LOS_EINVAL;
|
||||
@@ -201,7 +206,7 @@ EXIT:
|
||||
|
||||
UINT32 OsGetIdleTaskId(VOID)
|
||||
{
|
||||
return OsSchedGetRunQueIdle();
|
||||
return OsSchedRunqueueIdleGet();
|
||||
}
|
||||
|
||||
LITE_OS_SEC_TEXT_INIT UINT32 OsIdleTaskCreate(VOID)
|
||||
@@ -214,6 +219,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsIdleTaskCreate(VOID)
|
||||
taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)OsIdleTask;
|
||||
taskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE;
|
||||
taskInitParam.pcName = "Idle";
|
||||
taskInitParam.policy = LOS_SCHED_IDLE;
|
||||
taskInitParam.usTaskPrio = OS_TASK_PRIORITY_LOWEST;
|
||||
taskInitParam.processID = OsGetIdleProcessID();
|
||||
#ifdef LOSCFG_KERNEL_SMP
|
||||
@@ -222,10 +228,9 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsIdleTaskCreate(VOID)
|
||||
ret = LOS_TaskCreateOnly(&idleTaskID, &taskInitParam);
|
||||
LosTaskCB *idleTask = OS_TCB_FROM_TID(idleTaskID);
|
||||
idleTask->taskStatus |= OS_TASK_FLAG_SYSTEM_TASK;
|
||||
OsSchedRunQueIdleInit(idleTaskID);
|
||||
OsSchedSetIdleTaskSchedParam(idleTask);
|
||||
OsSchedRunqueueIdleInit(idleTaskID);
|
||||
|
||||
return ret;
|
||||
return LOS_TaskResume(idleTaskID);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -458,10 +463,8 @@ LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskStackAlloc(VOID **topStack, UINT32 stack
|
||||
*topStack = (VOID *)LOS_MemAllocAlign(pool, stackSize, LOSCFG_STACK_POINT_ALIGN_SIZE);
|
||||
}
|
||||
|
||||
LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB *taskCB,
|
||||
const VOID *stackPtr,
|
||||
const VOID *topStack,
|
||||
const TSK_INIT_PARAM_S *initParam)
|
||||
STATIC VOID TaskCBBaseInit(LosTaskCB *taskCB, const VOID *stackPtr, const VOID *topStack,
|
||||
const TSK_INIT_PARAM_S *initParam)
|
||||
{
|
||||
taskCB->stackPointer = (VOID *)stackPtr;
|
||||
taskCB->args[0] = initParam->auwArgs[0]; /* 0~3: just for args array index */
|
||||
@@ -470,7 +473,6 @@ LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB *taskCB,
|
||||
taskCB->args[3] = initParam->auwArgs[3];
|
||||
taskCB->topOfStack = (UINTPTR)topStack;
|
||||
taskCB->stackSize = initParam->uwStackSize;
|
||||
taskCB->priority = initParam->usTaskPrio;
|
||||
taskCB->taskEntry = initParam->pfnTaskEntry;
|
||||
taskCB->signal = SIGNAL_NONE;
|
||||
|
||||
@@ -479,7 +481,6 @@ LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB *taskCB,
|
||||
taskCB->cpuAffiMask = (initParam->usCpuAffiMask) ?
|
||||
initParam->usCpuAffiMask : LOSCFG_KERNEL_CPU_MASK;
|
||||
#endif
|
||||
taskCB->policy = (initParam->policy == LOS_SCHED_FIFO) ? LOS_SCHED_FIFO : LOS_SCHED_RR;
|
||||
taskCB->taskStatus = OS_TASK_STATUS_INIT;
|
||||
if (initParam->uwResved & LOS_TASK_ATTR_JOINABLE) {
|
||||
taskCB->taskStatus |= OS_TASK_FLAG_PTHREAD_JOIN;
|
||||
@@ -495,10 +496,13 @@ STATIC UINT32 OsTaskCBInit(LosTaskCB *taskCB, const TSK_INIT_PARAM_S *initParam,
|
||||
{
|
||||
UINT32 ret;
|
||||
UINT32 numCount;
|
||||
SchedParam schedParam = { 0 };
|
||||
UINT16 policy = (initParam->policy == LOS_SCHED_NORMAL) ? LOS_SCHED_RR : initParam->policy;
|
||||
|
||||
OsTaskCBInitBase(taskCB, stackPtr, topStack, initParam);
|
||||
TaskCBBaseInit(taskCB, stackPtr, topStack, initParam);
|
||||
|
||||
numCount = OsProcessAddNewTask(initParam->processID, taskCB);
|
||||
schedParam.policy = policy;
|
||||
numCount = OsProcessAddNewTask(initParam->processID, taskCB, &schedParam);
|
||||
#ifdef LOSCFG_KERNEL_VM
|
||||
taskCB->futex.index = OS_INVALID_VALUE;
|
||||
if (taskCB->taskStatus & OS_TASK_FLAG_USER_MODE) {
|
||||
@@ -509,6 +513,11 @@ STATIC UINT32 OsTaskCBInit(LosTaskCB *taskCB, const TSK_INIT_PARAM_S *initParam,
|
||||
}
|
||||
#endif
|
||||
|
||||
ret = OsSchedParamInit(taskCB, policy, &schedParam, initParam);
|
||||
if (ret != LOS_OK) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (initParam->pcName != NULL) {
|
||||
ret = (UINT32)OsSetTaskName(taskCB, initParam->pcName, FALSE);
|
||||
if (ret == LOS_OK) {
|
||||
@@ -622,7 +631,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreate(UINT32 *taskID, TSK_INIT_PARAM_S *in
|
||||
LosTaskCB *taskCB = OS_TCB_FROM_TID(*taskID);
|
||||
|
||||
SCHEDULER_LOCK(intSave);
|
||||
OsSchedTaskEnQueue(taskCB);
|
||||
taskCB->ops->enqueue(OsSchedRunqueue(), taskCB);
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
|
||||
/* in case created task not running on this core,
|
||||
@@ -639,13 +648,13 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskID)
|
||||
{
|
||||
UINT32 intSave;
|
||||
UINT32 errRet;
|
||||
LosTaskCB *taskCB = NULL;
|
||||
BOOL needSched = FALSE;
|
||||
|
||||
if (OS_TID_CHECK_INVALID(taskID)) {
|
||||
return LOS_ERRNO_TSK_ID_INVALID;
|
||||
}
|
||||
|
||||
taskCB = OS_TCB_FROM_TID(taskID);
|
||||
LosTaskCB *taskCB = OS_TCB_FROM_TID(taskID);
|
||||
SCHEDULER_LOCK(intSave);
|
||||
|
||||
/* clear pending signal */
|
||||
@@ -659,7 +668,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskID)
|
||||
OS_GOTO_ERREND();
|
||||
}
|
||||
|
||||
BOOL needSched = OsSchedResume(taskCB);
|
||||
errRet = taskCB->ops->resume(taskCB, &needSched);
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
|
||||
LOS_MpSchedule(OS_MP_CPU_ALL);
|
||||
@@ -667,7 +676,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskID)
|
||||
LOS_Schedule();
|
||||
}
|
||||
|
||||
return LOS_OK;
|
||||
return errRet;
|
||||
|
||||
LOS_ERREND:
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
@@ -715,9 +724,7 @@ LITE_OS_SEC_TEXT_INIT STATIC BOOL OsTaskSuspendCheckOnRun(LosTaskCB *taskCB, UIN
|
||||
LITE_OS_SEC_TEXT STATIC UINT32 OsTaskSuspend(LosTaskCB *taskCB)
|
||||
{
|
||||
UINT32 errRet;
|
||||
UINT16 tempStatus;
|
||||
|
||||
tempStatus = taskCB->taskStatus;
|
||||
UINT16 tempStatus = taskCB->taskStatus;
|
||||
if (tempStatus & OS_TASK_STATUS_UNUSED) {
|
||||
return LOS_ERRNO_TSK_NOT_CREATED;
|
||||
}
|
||||
@@ -731,8 +738,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 OsTaskSuspend(LosTaskCB *taskCB)
|
||||
return errRet;
|
||||
}
|
||||
|
||||
OsSchedSuspend(taskCB);
|
||||
return LOS_OK;
|
||||
return taskCB->ops->suspend(taskCB);
|
||||
}
|
||||
|
||||
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskSuspend(UINT32 taskID)
|
||||
@@ -833,11 +839,11 @@ LITE_OS_SEC_TEXT VOID OsInactiveTaskDelete(LosTaskCB *taskCB)
|
||||
|
||||
OsTaskReleaseHoldLock(taskCB);
|
||||
|
||||
OsSchedTaskExit(taskCB);
|
||||
taskCB->ops->exit(taskCB);
|
||||
if (taskStatus & OS_TASK_STATUS_PENDING) {
|
||||
LosMux *mux = (LosMux *)taskCB->taskMux;
|
||||
if (LOS_MuxIsValid(mux) == TRUE) {
|
||||
OsMuxBitmapRestore(mux, taskCB, (LosTaskCB *)mux->owner);
|
||||
OsMuxBitmapRestore(mux, NULL, taskCB);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -925,17 +931,16 @@ LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick)
|
||||
}
|
||||
|
||||
SCHEDULER_LOCK(intSave);
|
||||
OsSchedDelay(runTask, OS_SCHED_TICK_TO_CYCLE(tick));
|
||||
UINT32 ret = runTask->ops->delay(runTask, OS_SCHED_TICK_TO_CYCLE(tick));
|
||||
OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTODELAYEDLIST, runTask);
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
|
||||
return LOS_OK;
|
||||
return ret;
|
||||
}
|
||||
|
||||
LITE_OS_SEC_TEXT_MINOR UINT16 LOS_TaskPriGet(UINT32 taskID)
|
||||
{
|
||||
UINT32 intSave;
|
||||
UINT16 priority;
|
||||
SchedParam param = { 0 };
|
||||
|
||||
if (OS_TID_CHECK_INVALID(taskID)) {
|
||||
return (UINT16)OS_INVALID;
|
||||
@@ -948,14 +953,15 @@ LITE_OS_SEC_TEXT_MINOR UINT16 LOS_TaskPriGet(UINT32 taskID)
|
||||
return (UINT16)OS_INVALID;
|
||||
}
|
||||
|
||||
priority = taskCB->priority;
|
||||
taskCB->ops->schedParamGet(taskCB, ¶m);
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
return priority;
|
||||
return param.priority;
|
||||
}
|
||||
|
||||
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskPriSet(UINT32 taskID, UINT16 taskPrio)
|
||||
{
|
||||
UINT32 intSave;
|
||||
SchedParam param = { 0 };
|
||||
|
||||
if (taskPrio > OS_TASK_PRIORITY_LOWEST) {
|
||||
return LOS_ERRNO_TSK_PRIOR_ERROR;
|
||||
@@ -976,11 +982,15 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskPriSet(UINT32 taskID, UINT16 taskPrio)
|
||||
return LOS_ERRNO_TSK_NOT_CREATED;
|
||||
}
|
||||
|
||||
BOOL isReady = OsSchedModifyTaskSchedParam(taskCB, taskCB->policy, taskPrio);
|
||||
taskCB->ops->schedParamGet(taskCB, ¶m);
|
||||
|
||||
param.priority = taskPrio;
|
||||
|
||||
BOOL needSched = taskCB->ops->schedParamModify(taskCB, ¶m);
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
|
||||
LOS_MpSchedule(OS_MP_CPU_ALL);
|
||||
if (isReady && OS_SCHEDULER_ACTIVE) {
|
||||
if (needSched && OS_SCHEDULER_ACTIVE) {
|
||||
LOS_Schedule();
|
||||
}
|
||||
return LOS_OK;
|
||||
@@ -1010,7 +1020,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskYield(VOID)
|
||||
|
||||
SCHEDULER_LOCK(intSave);
|
||||
/* reset timeslice of yielded task */
|
||||
OsSchedYield();
|
||||
runTask->ops->yield(runTask);
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
return LOS_OK;
|
||||
}
|
||||
@@ -1040,6 +1050,7 @@ LITE_OS_SEC_TEXT_MINOR VOID LOS_TaskUnlock(VOID)
|
||||
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskInfoGet(UINT32 taskID, TSK_INFO_S *taskInfo)
|
||||
{
|
||||
UINT32 intSave;
|
||||
SchedParam param = { 0 };
|
||||
|
||||
if (taskInfo == NULL) {
|
||||
return LOS_ERRNO_TSK_PTR_NULL;
|
||||
@@ -1062,8 +1073,9 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskInfoGet(UINT32 taskID, TSK_INFO_S *taskInf
|
||||
taskInfo->uwSP = ArchSPGet();
|
||||
}
|
||||
|
||||
taskCB->ops->schedParamGet(taskCB, ¶m);
|
||||
taskInfo->usTaskStatus = taskCB->taskStatus;
|
||||
taskInfo->usTaskPrio = taskCB->priority;
|
||||
taskInfo->usTaskPrio = param.priority;
|
||||
taskInfo->uwStackSize = taskCB->stackSize;
|
||||
taskInfo->uwTopOfStack = taskCB->topOfStack;
|
||||
taskInfo->uwEventMask = taskCB->eventMask;
|
||||
@@ -1200,7 +1212,7 @@ LITE_OS_SEC_TEXT_MINOR VOID OsTaskProcSignal(VOID)
|
||||
} else if (runTask->signal & SIGNAL_AFFI) {
|
||||
runTask->signal &= ~SIGNAL_AFFI;
|
||||
|
||||
/* pri-queue has updated, notify the target cpu */
|
||||
/* priority queue has updated, notify the target cpu */
|
||||
LOS_MpSchedule((UINT32)runTask->cpuAffiMask);
|
||||
#endif
|
||||
}
|
||||
@@ -1340,6 +1352,7 @@ LITE_OS_SEC_TEXT INT32 LOS_GetTaskScheduler(INT32 taskID)
|
||||
{
|
||||
UINT32 intSave;
|
||||
INT32 policy;
|
||||
SchedParam param = { 0 };
|
||||
|
||||
if (OS_TID_CHECK_INVALID(taskID)) {
|
||||
return -LOS_EINVAL;
|
||||
@@ -1352,7 +1365,8 @@ LITE_OS_SEC_TEXT INT32 LOS_GetTaskScheduler(INT32 taskID)
|
||||
OS_GOTO_ERREND();
|
||||
}
|
||||
|
||||
policy = taskCB->policy;
|
||||
taskCB->ops->schedParamGet(taskCB, ¶m);
|
||||
policy = (INT32)param.policy;
|
||||
|
||||
LOS_ERREND:
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
@@ -1361,8 +1375,8 @@ LOS_ERREND:
|
||||
|
||||
LITE_OS_SEC_TEXT INT32 LOS_SetTaskScheduler(INT32 taskID, UINT16 policy, UINT16 priority)
|
||||
{
|
||||
SchedParam param = { 0 };
|
||||
UINT32 intSave;
|
||||
BOOL needSched = FALSE;
|
||||
|
||||
if (OS_TID_CHECK_INVALID(taskID)) {
|
||||
return LOS_ESRCH;
|
||||
@@ -1387,7 +1401,10 @@ LITE_OS_SEC_TEXT INT32 LOS_SetTaskScheduler(INT32 taskID, UINT16 policy, UINT16
|
||||
return LOS_EINVAL;
|
||||
}
|
||||
|
||||
needSched = OsSchedModifyTaskSchedParam(taskCB, policy, priority);
|
||||
taskCB->ops->schedParamGet(taskCB, ¶m);
|
||||
param.policy = policy;
|
||||
param.priority = priority;
|
||||
BOOL needSched = taskCB->ops->schedParamModify(taskCB, ¶m);
|
||||
SCHEDULER_UNLOCK(intSave);
|
||||
|
||||
LOS_MpSchedule(OS_MP_CPU_ALL);
|
||||
|
||||
Reference in New Issue
Block a user