From e5e9289a08cf1db71c09647b71a864f5a1f8a4a2 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Wed, 23 Jun 2021 19:25:58 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=B0=83=E5=BA=A6=E8=BF=87=E7=A8=8B?= =?UTF-8?q?=E4=BD=8E=E6=A6=82=E7=8E=87=E8=A7=A6=E5=8F=91OsSchedTaskEnQueue?= =?UTF-8?q?=E6=96=AD=E8=A8=80=EF=BC=8C=E5=AF=BC=E8=87=B4=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当任务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 Change-Id: I28f33d25504ade47469980fd6bb0b922bf4756da --- kernel/src/los_sched.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kernel/src/los_sched.c b/kernel/src/los_sched.c index c461dd34..d0b27435 100644 --- a/kernel/src/los_sched.c +++ b/kernel/src/los_sched.c @@ -362,7 +362,8 @@ VOID OsSchedTaskWake(LosTaskCB *resumedTask) 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); } }