From bcec32e389634097102a203ee7e937ed3193c984 Mon Sep 17 00:00:00 2001 From: zhushengle Date: Thu, 17 Jun 2021 20:07:20 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=BB=B6=E6=97=B6=E9=98=9F=E5=88=97?= =?UTF-8?q?=E4=B8=BANULL=E6=97=B6=EF=BC=8C=E8=BF=94=E5=9B=9E=E7=9A=84?= =?UTF-8?q?=E5=93=8D=E5=BA=94=E6=97=B6=E9=97=B4=E4=B8=BA64=E4=BD=8D?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E5=80=BC=EF=BC=8C=E5=AF=BC=E8=87=B4=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=9B=B4=E6=96=B0tick=20timer=E7=9A=84=E5=93=8D?= =?UTF-8?q?=E5=BA=94=E5=91=A8=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题描述: 当g_schedResponseTime = OS_SCHED_MAX_RESPONSE_TIME,且nextExpireTime =(UINT64-1时, 表示系统的延时队列已为NULL, 此时tick timer 中应该设置为最大值,但由于判断 g_schedResponseTime - nextExpireTime >= OS_CYCLE_PER_TICK,导致条件不成立,直接返回, 无法将其设置为最大值,导致tick 中断一直频繁响应。 解决方案: 将延时队列为NULL时的返回值以及idle线程的时间片修改为OS_SCHED_MAX_RESPONSE_TIME - OS_CYCLE_PER_TICK, 保证延时队列为NULL,能够正常设置tick响应的最大值。 Close #I3W1LF Change-Id: I0d09119240ae5a50ddcb0c96fb23cd3d6e70b892 Signed-off-by: zhushengle --- kernel/include/los_sched.h | 2 ++ kernel/src/los_sched.c | 6 ++---- kernel/src/los_sortlink.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/kernel/include/los_sched.h b/kernel/include/los_sched.h index b514edb3..56955c3a 100644 --- a/kernel/include/los_sched.h +++ b/kernel/include/los_sched.h @@ -42,6 +42,8 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ +#define OS_SCHED_MAX_RESPONSE_TIME (UINT64)(((UINT64)-1) - 1U) + extern UINT32 g_taskScheduled; typedef BOOL (*SchedScan)(VOID); diff --git a/kernel/src/los_sched.c b/kernel/src/los_sched.c index a7616fda..500abc6f 100644 --- a/kernel/src/los_sched.c +++ b/kernel/src/los_sched.c @@ -41,12 +41,10 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ -#define OS_64BIT_MAX 0xFFFFFFFFFFFFFFFFULL #define OS_PRIORITY_QUEUE_NUM 32 #define PRIQUEUE_PRIOR0_BIT 0x80000000U #define OS_SCHED_TIME_SLICES ((LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT * OS_SYS_NS_PER_US) / OS_NS_PER_CYCLE) #define OS_TIME_SLICE_MIN (INT32)((50 * OS_SYS_NS_PER_US) / OS_NS_PER_CYCLE) /* 50us */ -#define OS_SCHED_MAX_RESPONSE_TIME (UINT64)(OS_64BIT_MAX - 1U) #define OS_TICK_RESPONSE_TIME_MAX LOSCFG_BASE_CORE_TICK_RESPONSE_MAX #if (LOSCFG_BASE_CORE_TICK_RESPONSE_MAX == 0) #error "Must specify the maximum value that tick timer counter supports!" @@ -184,7 +182,7 @@ VOID OsSchedUpdateExpireTime(UINT64 startTime) INT32 timeSlice = (runTask->timeSlice <= OS_TIME_SLICE_MIN) ? OS_SCHED_TIME_SLICES : runTask->timeSlice; endTime = startTime + timeSlice; } else { - endTime = OS_SCHED_MAX_RESPONSE_TIME; + endTime = OS_SCHED_MAX_RESPONSE_TIME - OS_CYCLE_PER_TICK; } OsSchedSetNextExpireTime(startTime, runTask->taskID, endTime); } @@ -488,7 +486,7 @@ BOOL OsSchedTaskSwitch(VOID) if (newTask->taskID != g_idleTaskID) { endTime = newTask->startTime + newTask->timeSlice; } else { - endTime = OS_SCHED_MAX_RESPONSE_TIME; + endTime = OS_SCHED_MAX_RESPONSE_TIME - OS_CYCLE_PER_TICK; } OsSchedSetNextExpireTime(newTask->startTime, newTask->taskID, endTime); diff --git a/kernel/src/los_sortlink.c b/kernel/src/los_sortlink.c index 8c2a77eb..e1783063 100644 --- a/kernel/src/los_sortlink.c +++ b/kernel/src/los_sortlink.c @@ -92,7 +92,7 @@ STATIC INLINE UINT64 OsGetSortLinkNextExpireTime(SortLinkAttribute *sortHeader, LOS_DL_LIST *list = head->pstNext; if (LOS_ListEmpty(head)) { - return (UINT64)-1; + return OS_SCHED_MAX_RESPONSE_TIME - OS_CYCLE_PER_TICK; } do {