fix: 删除延时节点后,存在时间无法有效刷新的场景
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 <zhushengle@huawei.com> Change-Id: Ia77b789a10112935b719e8f733ba33835894e060
This commit is contained in:
parent
2868891bc8
commit
0a87c04d58
|
@ -51,6 +51,8 @@ typedef BOOL (*SchedScan)(VOID);
|
||||||
|
|
||||||
extern UINT64 g_sysSchedStartTime;
|
extern UINT64 g_sysSchedStartTime;
|
||||||
|
|
||||||
|
VOID OsSchedResetSchedResponseTime(UINT64 responseTime);
|
||||||
|
|
||||||
VOID OsSchedUpdateSchedTimeBase(VOID);
|
VOID OsSchedUpdateSchedTimeBase(VOID);
|
||||||
|
|
||||||
UINT64 OsGetCurrSysTimeCycle(VOID);
|
UINT64 OsGetCurrSysTimeCycle(VOID);
|
||||||
|
|
|
@ -79,6 +79,13 @@ UINT32 OsSchedRealSleepTimeSet(VOID (*func)(UINT64))
|
||||||
return LOS_OK;
|
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)
|
#if (LOSCFG_BASE_CORE_TICK_WTIMER == 0)
|
||||||
STATIC UINT64 g_schedTimerBase;
|
STATIC UINT64 g_schedTimerBase;
|
||||||
|
|
||||||
|
@ -530,6 +537,10 @@ BOOL OsSchedTaskSwitch(VOID)
|
||||||
} else {
|
} else {
|
||||||
endTime = OS_SCHED_MAX_RESPONSE_TIME - OS_TICK_RESPONSE_PRECISION;
|
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);
|
OsSchedSetNextExpireTime(newTask->startTime, newTask->taskID, endTime, TRUE);
|
||||||
|
|
||||||
return isTaskSwitch;
|
return isTaskSwitch;
|
||||||
|
|
|
@ -135,6 +135,7 @@ VOID OsDeleteSortLink(SortLinkList *node, SortLinkType type)
|
||||||
|
|
||||||
intSave = LOS_IntLock();
|
intSave = LOS_IntLock();
|
||||||
if (node->responseTime != OS_SORT_LINK_INVALID_TIME) {
|
if (node->responseTime != OS_SORT_LINK_INVALID_TIME) {
|
||||||
|
OsSchedResetSchedResponseTime(node->responseTime);
|
||||||
OsDeleteNodeSortLink(sortLinkHeader, node);
|
OsDeleteNodeSortLink(sortLinkHeader, node);
|
||||||
}
|
}
|
||||||
LOS_IntRestore(intSave);
|
LOS_IntRestore(intSave);
|
||||||
|
|
Loading…
Reference in New Issue