OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3340|回复: 3

求助有关xNextTaskUnblockTime的问题

[复制链接]

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2016-8-2
在线时间
14 小时
发表于 2022-3-4 11:19:37 | 显示全部楼层 |阅读模式
1金钱
在看freeRTOS源码时,在xTaskDelay(xTicksToDelay)中,调用prvAddCurrentTaskToDelayedList函数;

prvAddCurrentTaskToDelayedList的作用是将任务从就绪列表中移除,并计算解锁时间xTimeToWait;
将解锁时间xTimeToWait与当前系统时基计数器xConstTicksCount比较,来选择是加入溢出延时列表
xDelayedTaskList2还是加入正常延时列表xDelayedTaskList1;如果正常延时列表后,要判断解锁时间xTimeToWait是否小于xNextTaskUnblockTime,是的话将xTimeToWait的值赋给下一个任务的解锁时间xNextTaskUnblockTime
但问题是:
为什么没有在溢出时间列表中做“xTimeToWait是否小于xNextTaskUnblockTime”的判断呢?难道在溢出延时列表的任务不做任务调度吗?
请知道的大侠给与赐教

源码如下:
1 static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait )
2 {
3     TickType_t xTimeToWake;
4
5     /* 获取系统时基计数器 xTickCount 的值 */
6     const TickType_t xConstTickCount = xTickCount; (1)
7
8     /* 将任务从就绪列表中移除 */ (2)
9     if ( uxListRemove( &( pxCurrentTCB->xStateListItem ) )
10    == ( UBaseType_t ) 0 )
11     {
12      /* 将任务在优先级位图中对应的位清除 */
13       portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority,
14       uxTopReadyPriority );
15 }
16
17     /* 计算任务延时到期时,系统时基计数器 xTickCount 的值是多少 */ (3)
18     xTimeToWake = xConstTickCount + xTicksToWait;
19
20     /* 将延时到期的值设置为节点的排序值 */ (4)
21     listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ),
22     xTimeToWake );
23
24     /* 溢出 */ (5)
25     if ( xTimeToWake < xConstTickCount )
26     {
27       vListInsert( pxOverflowDelayedTaskList,
28       &( pxCurrentTCB->xStateListItem ) );
29     }
30     else /* 没有溢出 */
31     {
32
33     vListInsert( pxDelayedTaskList,
34     &( pxCurrentTCB->xStateListItem ) ); (6)
35
36     /* 更新下一个任务解锁时刻变量 xNextTaskUnblockTime 的值 */ (7)
37     if ( xTimeToWake < xNextTaskUnblockTime )
38     {
39         xNextTaskUnblockTime = xTimeToWake;
40     
}
41    }
42 }





最佳答案

查看完整内容[请看2#楼]

问题已解决,针对于自己提的问题自己回答: 在xTaskDelay()调用prvAddCurrentTaskToDelayedList()中,根据当前待延时任务的延时时刻值xTimeToWake,与当前的系统时基计数器进行比较,判断出待延时任务被放置于正常延时列表还是溢出延时列表,当被放置于正常延时列表下时, 当前任务的延时时刻值如果小于下一个任务的解锁时刻xNextTaskUnblockTime ,则用该值更新xNextTaskUnblockTime ,而当该任务被放置于溢出延时列表下时, ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2016-8-2
在线时间
14 小时
 楼主| 发表于 2022-3-4 11:19:38 | 显示全部楼层
问题已解决,针对于自己提的问题自己回答:
在xTaskDelay()调用prvAddCurrentTaskToDelayedList()中,根据当前待延时任务的延时时刻值xTimeToWake,与当前的系统时基计数器进行比较,判断出待延时任务被放置于正常延时列表还是溢出延时列表,当被放置于正常延时列表下时, 当前任务的延时时刻值如果小于下一个任务的解锁时刻xNextTaskUnblockTime ,则用该值更新xNextTaskUnblockTime ,而当该任务被放置于溢出延时列表下时,将不对xNextTaskUnblockTime做任何改变。不跟新的原因是:
任务的调度途径之一是在系统滴答中断服务函数中给pendSV位置1引发pendSV中断函数触发系统调度。在系统滴答中断服务函数xPortSysTickHandler()中,调用xTaskIncrementTick()函数来判断是否给pendSV置1,在xTaskIncrementTick()中,首先要做的第一件事就是根据当前的系统时间计数器的值是否已经溢出,如果溢出则将正常延时列表的异常延时列表的指针互换,并给下一个任务解锁时间xNextTaskUnblockTime重新赋值,然后对比xNextTaskUnblockTime与当前系统时间计数器的值进行比较,如果相等,则将溢出延时列表中对应的任务从该列表中删除,并添加到继续列表中。如果系统配置为支持“抢占”或“时间片”调度方式,则高优先级的任务将被执行,相同优先级的任务将被轮流执行
因此说,xNextTaskUnblockTime只在正常延时列表指针pxDelayedTaskList指向的列表中判断并赋值
回复

使用道具 举报

14

主题

821

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2034
金钱
2034
注册时间
2021-7-17
在线时间
635 小时
发表于 2022-3-4 11:38:48 | 显示全部楼层
帮顶   
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2016-8-2
在线时间
14 小时
 楼主| 发表于 2022-3-4 17:45:54 | 显示全部楼层

感谢帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 18:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表