FreeRTOS 宏定义prvReaddTaskToReadyList,重新添加任务,是否破坏原本的双向链表
涉及到的代码
// 代码位于freeRTOS源码task.c文件的454行附近
#define prvReaddTaskToReadyList( pxTCB ) \
traceREADDED_TASK_TO_READY_STATE( pxTCB ); \
taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \
vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xGenericListItem ) )
// 代码位于freeRTOS源码list.c文件的116行附近
void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem )
{
ListItem_t * const pxIndex = pxList->pxIndex; /* 通常是最后一个节点,最后一个节点是标志节点,不使用 */
/* Insert a new list item into pxList, but rather than sort the list,
makes the new list item the last item to be removed by a call to
listGET_OWNER_OF_NEXT_ENTRY().
插入一个新的节点到pxList中,但是 */
pxNewListItem->pxNext = pxIndex; /* 下一个节点 */
pxNewListItem->pxPrevious = pxIndex->pxPrevious; /* 上一个节点 */
pxIndex->pxPrevious->pxNext = pxNewListItem; /* 将这个节点插入到链表中 */
pxIndex->pxPrevious = pxNewListItem;
/* Remember which list the item is in. 存储这个节点在那个链表中 */
pxNewListItem->pvContainer = ( void * ) pxList; /* 设置节点的父链表 */
( pxList->uxNumberOfItems )++; /* 更新链表节点数 */
}
运行结果及报错内容
实验代码
List_t test;
ListItem_t item1;
ListItem_t item2;
ListItem_t item3;
ListItem_t item4;
ListItem_t item5;
vListInitialise(&test);
vListInitialiseItem(&item1);
vListInitialiseItem(&item2);
vListInitialiseItem(&item3);
vListInitialiseItem(&item4);
vListInitialiseItem(&item5);
item1.xItemValue = 1;
item2.xItemValue = 2;
item3.xItemValue = 3;
item4.xItemValue = 4;
item5.xItemValue = 5;
vListInsertEnd(&test, &item1);
vListInsertEnd(&test, &item2);
vListInsertEnd(&test, &item3);
vListInsertEnd(&test, &item4);
vListInsertEnd(&test, &item5);
//vListInsertEnd(&test, &item2); //这一行表示重新添加任务
for(ListItem_t* item=listGET_HEAD_ENTRY(&test); item->xItemValue<test.xListEnd.xItemValue; item = listGET_NEXT(item)){
printf("this is item%d\n",item->xItemValue);
}
this is item1
this is item2
this is item3
this is item4
this is item5
重新添加任务后
this is item1
this is item2
简单的添加前后的示意图
B即为重新添加的任务
问题
这样对任务的调度有什么影响,还是说FREERTOS可以把它恢复成正常的双向链表