From 0a87c04d58d11da2082470698de0760d72259533 Mon Sep 17 00:00:00 2001 From: zhushengle Date: Fri, 13 Aug 2021 11:09:52 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=88=A0=E9=99=A4=E5=BB=B6=E6=97=B6?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E5=90=8E=EF=BC=8C=E5=AD=98=E5=9C=A8=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=97=A0=E6=B3=95=E6=9C=89=E6=95=88=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E7=9A=84=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.从延时队列上删除延时节点时,如果该延时节点的响应时间比当前系统tick的响应时间小时, 将tick的响应时间修改为OS_SCHED_MAX_RESPONSE_TIME,以保证tick响应时间能够被刷新。 2.任务切换时,若g_schedResponseID为旧任务的taskID时(tick的响应时间为旧任务的时间片 结束时间),将tick的响应时间修改为OS_SCHED_MAX_RESPONSE_TIME。 Close #I45I9Y Signed-off-by: zhushengle Change-Id: Ia77b789a10112935b719e8f733ba33835894e060 --- kernel/include/los_sched.h | 2 ++ kernel/src/los_sched.c | 11 +++++++++++ kernel/src/los_sortlink.c | 1 + 3 files changed, 14 insertions(+) diff --git a/kernel/include/los_sched.h b/kernel/include/los_sched.h index aef3bd48..781a176f 100644 --- a/kernel/include/los_sched.h +++ b/kernel/include/los_sched.h @@ -51,6 +51,8 @@ typedef BOOL (*SchedScan)(VOID); extern UINT64 g_sysSchedStartTime; +VOID OsSchedResetSchedResponseTime(UINT64 responseTime); + VOID OsSchedUpdateSchedTimeBase(VOID); UINT64 OsGetCurrSysTimeCycle(VOID); diff --git a/kernel/src/los_sched.c b/kernel/src/los_sched.c index d169fd72..a68a3a4b 100644 --- a/kernel/src/los_sched.c +++ b/kernel/src/los_sched.c @@ -79,6 +79,13 @@ UINT32 OsSchedRealSleepTimeSet(VOID (*func)(UINT64)) return LOS_OK; } +VOID OsSchedResetSchedResponseTime(UINT64 responseTime) +{ + if (responseTime <= g_schedResponseTime) { + g_schedResponseTime = OS_SCHED_MAX_RESPONSE_TIME; + } +} + #if (LOSCFG_BASE_CORE_TICK_WTIMER == 0) STATIC UINT64 g_schedTimerBase; @@ -530,6 +537,10 @@ BOOL OsSchedTaskSwitch(VOID) } else { endTime = OS_SCHED_MAX_RESPONSE_TIME - OS_TICK_RESPONSE_PRECISION; } + + if (g_schedResponseID == runTask->taskID) { + g_schedResponseTime = OS_SCHED_MAX_RESPONSE_TIME; + } OsSchedSetNextExpireTime(newTask->startTime, newTask->taskID, endTime, TRUE); return isTaskSwitch; diff --git a/kernel/src/los_sortlink.c b/kernel/src/los_sortlink.c index 8f772f7a..8d8073f7 100644 --- a/kernel/src/los_sortlink.c +++ b/kernel/src/los_sortlink.c @@ -135,6 +135,7 @@ VOID OsDeleteSortLink(SortLinkList *node, SortLinkType type) intSave = LOS_IntLock(); if (node->responseTime != OS_SORT_LINK_INVALID_TIME) { + OsSchedResetSchedResponseTime(node->responseTime); OsDeleteNodeSortLink(sortLinkHeader, node); } LOS_IntRestore(intSave);