初级会员
- 积分
- 91
- 金钱
- 91
- 注册时间
- 2016-8-2
- 在线时间
- 14 小时
|
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 );
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 ,而当该任务被放置于溢出延时列表下时, ...
|