FreeRTOS疑问解决2(关于列表)
2.1task.c中的(1)pxReadyTasksLists[ configMAX_PRIORITIES ](2)xDelayedTaskList1(3)xDelayedTaskList2(4)pxDelayedTaskList(5)pxOverflowDelayedTaskList(6)xPendingReadyList分别是什么含义其中(1)和(6)很清楚是就绪列表和等待就绪列表没有问题。中间四个延时列表1和延时列表2延时列表指针和溢出延时列表指针分别指向上述两个延时列表在函数static void prvInitialiseTaskLists( void )有这段代码用来佐证/* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList* using list2. */pxDelayedTaskList xDelayedTaskList1;pxOverflowDelayedTaskList xDelayedTaskList2;为什么要有两个延时列表及其指针呢答为了解决溢出问题因为滴答计数器xTickCount以及其他变量如阻塞任务的超时时间(即xItemValue xTickCount xTicksToDelay)都是32位变量0XFFFF FFFF总是会溢出的。指针是方便交换这两个列表那么这样是如何解决溢出问题的呢举个简单例子假设xTickCount及阻塞任务超时时间都是20(ms)溢出。当xTickCount15时有task1、task2、task3分别延时4、6、10ms然后task1会被添加到xDelayedTaskList1task2和3会被添加到xDelayedTaskList2中并且其xItemValue分别为19、1、5(因为溢出)。xTickCount会先计数到19然后恢复task1并执行紧接着会计数到20并溢出然后重0开始计数计数到1会运行task2然后计数到5会运行task3。但是恢复阻塞任务取TCB指令都是它pxTCB listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList )来执行都是通过pxDelayedTaskList即xDelayedTaskList1来取得可是task23都是在xDelayedTaskList2中啊这就是交换列表的作用啦这样系统只需要在xDelayedTaskList1中查找xItemValue最低的TCB即可函数BaseType_t xTaskIncrementTick( void )中一段代码if( xConstTickCount ( TickType_t ) 0U ){taskSWITCH_DELAYED_LISTS();///*当列表切换时延迟任务列表被切换列表应该为空 */}这段代码用来执行列表xDelayedTaskList1和xDelayedTaskList2的交换讲的很好的内容FreeRTOS系列第28篇---系统节拍时钟分析 - 21ic电子网xPendingReadyList属于event而不是state哪些是event哪些是state怎么判断