feat: swtmr机制与调度分离,调度只针对通用线程,不针对特殊功能

背景:
原调度机制与软件定时器实现混合,调度时间链表存在两个链表,
任务切换时需要遍历两个链表才可以获取到最终的tick响应时间。
软件定时作为一个独立的功能,不应该和调度强耦合,而且软件定时
器作为一个任务,某个软件定时器的响应时间应该是软件定时器任务的
响应时间,不应该直接做为tick中断的响应时间。

方案描述:
1.将软件定时器从调度分离,作为一个独立的机制,从调度角度看其就是一个任务
2.软件定时器从调度分离之后,其timelist遍历从tick中断移动至软件定时器任务中
3.优化软件定时器的均衡调度

优势:
1.将软件定时器与调度完全分离,使得调度功能单一化,便于后续其它调度算法的引入
2.优化tick中断,减小tick中断耗时
3.优化通过写队列唤醒软件定时器任务去执行软件定时器钩子为插队列,减少软件定时
器机制本身的耗时,提升软件定时器的实时性
4.优化软件定时器均衡调度,使得软件定时器均匀分布于多核,提升软件定时器的实时性

Signed-off-by: zhushengle <zhushengle@huawei.com>
Change-Id: I07c01f134e69c1d9b7061ddf5a231df1ee99b68e
This commit is contained in:
zhushengle
2022-03-16 20:28:30 +08:00
parent e4cad073a9
commit 6d8cef40c8
21 changed files with 523 additions and 416 deletions

View File

@@ -49,7 +49,7 @@ static UINT32 Testcase(void)
ret = LOS_TaskSuspend(gTestIdleTaskID);
ICUNIT_ASSERT_EQUAL(ret, LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK, ret);
gTestSwtmrTaskID = OsSwtmrTaskIdByCpuId(cpuid);
gTestSwtmrTaskID = OsSwtmrTaskIDGetByCpuid(cpuid);
ret = LOS_TaskSuspend(gTestSwtmrTaskID);
ICUNIT_ASSERT_EQUAL(ret, LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK, ret);

View File

@@ -49,7 +49,7 @@ static UINT32 Testcase(void)
ret = LOS_TaskDelete(gTestIdleTaskID);
ICUNIT_ASSERT_EQUAL(ret, LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK, ret);
gTestSwtmrTaskID = OsSwtmrTaskIdByCpuId(cpuid);
gTestSwtmrTaskID = OsSwtmrTaskIDGetByCpuid(cpuid);
ret = LOS_TaskDelete(gTestSwtmrTaskID);
ICUNIT_ASSERT_EQUAL(ret, LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK, ret);

View File

@@ -44,7 +44,7 @@ static UINT32 Testcase(void)
UINT32 gTestSwtmrTaskID;
UINT32 cpuid = (ArchCurrCpuid() + 1) % (LOSCFG_KERNEL_CORE_NUM);
gTestSwtmrTaskID = OsSwtmrTaskIdByCpuId(cpuid);
gTestSwtmrTaskID = OsSwtmrTaskIDGetByCpuid(cpuid);
ret = LOS_TaskDelete(gTestSwtmrTaskID);
ICUNIT_ASSERT_EQUAL(ret, LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK, ret);

View File

@@ -54,7 +54,7 @@ static void HwiF01(void)
LOS_AtomicInc(&g_testCount);
gTestSwtmrTaskID = OsSwtmrTaskIdByCpuId(cpuid);
gTestSwtmrTaskID = OsSwtmrTaskIDGetByCpuid(cpuid);
ret = LOS_TaskDelete(gTestSwtmrTaskID);
ICUNIT_ASSERT_EQUAL_VOID(ret, LOS_ERRNO_TSK_YIELD_IN_INT, ret);

View File

@@ -49,7 +49,7 @@ static void HwiF01(void)
ret = LOS_TaskDelete(gTestIdleTaskID);
ICUNIT_ASSERT_EQUAL_VOID(ret, LOS_ERRNO_TSK_YIELD_IN_INT, ret);
gTestSwtmrTaskID = OsSwtmrTaskIdByCpuId(cpuid);
gTestSwtmrTaskID = OsSwtmrTaskIDGetByCpuid(cpuid);
ret = LOS_TaskDelete(gTestSwtmrTaskID);
ICUNIT_ASSERT_EQUAL_VOID(ret, LOS_ERRNO_TSK_YIELD_IN_INT, ret);