fix: 调度过程低概率触发OsSchedTaskEnQueue断言,导致系统异常
当任务A调用LOS_EventRead阻塞开中断后,突然响应中断B,此时任务A已入阻塞链表, 任务状态为OS_TASK_STATUS_PEND | OS_TASK_STATUS_RUNNING;而B的回调函数中调用 LOS_EventWrite唤醒任务A,这个过程会调用OsSchedTaskWake,将任务A从阻塞链表中 取出,并去除OS_TASK_STATUS_PEND状态,且调用OsSchedTaskEnQueue将任务A添 加到调度队列并增加OS_TASK_STATUS_READY状态。OsSchedTaskWake全部流程完成后, 会开中断并调用LOS_Schedule,在LOS_Schedule流程中由于当前任务为A,且状态为 OS_TASK_STATUS_RUNNING | OS_TASK_STATUS_READY,会再次调用OsSchedTaskEnQueue, 从而被OsSchedTaskEnQueue断言拦住。修改方式:当任务状态含有OS_TASK_STATUS_RUNNING时 OsSchedTaskWake中不调用OsSchedTaskEnQueue。 close: #I3VX9Y Signed-off-by: zff <zhangfanfan2@huawei.com> Change-Id: I28f33d25504ade47469980fd6bb0b922bf4756da
This commit is contained in:
parent
1f4b7aa85d
commit
e5e9289a08
|
@ -362,7 +362,8 @@ VOID OsSchedTaskWake(LosTaskCB *resumedTask)
|
||||||
resumedTask->taskStatus &= ~OS_TASK_STATUS_PEND_TIME;
|
resumedTask->taskStatus &= ~OS_TASK_STATUS_PEND_TIME;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(resumedTask->taskStatus & OS_TASK_STATUS_SUSPEND)) {
|
if (!(resumedTask->taskStatus & OS_TASK_STATUS_SUSPEND) &&
|
||||||
|
!(resumedTask->taskStatus & OS_TASK_STATUS_RUNNING)) {
|
||||||
OsSchedTaskEnQueue(resumedTask);
|
OsSchedTaskEnQueue(resumedTask);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue