任务的调度机制(核心是链表)!!!
使用链表来管理任务
在我前面写的FreeRTOS任务(深入到源码进行分析),我创建了三个任务,他们的优先级都是一样的,所以他们在FreeRTOS中是轮流执行的,实际上,根据不同的需求,会创建出不同优先级的任务,有些任务的优先级高,就会优先执行,只要优先级任务处于就绪状态之下,低优先级的任务就永远无法执行。有很多任务都想运行,优先级各不相同,怎么管理它们?
在task.c文件下面,创建了很多的链表,如图:
每个优先级,都有一个就绪链表:pxReadyTasksLists[优先级],
任务被创建时,要使用prvAddNewTaskToReadyList()
来把它放入对应的就绪链表,调用过程为:
xTaskCreate
prvAddNewTaskToReadyList
listINSERT_END( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) );
使用链表来理解调度机制
第1个任务是谁?
最高优先级的ready list里最后一个创建的任务:
这里可以解释,为什么在任务进行调度之前,相等优先级以及该优先级是最高优先级的情况下,后创建的任务会先运行,因为pxCurrentTCB->uxPriority <= pxNewTCB->uxPriority,等于状态下pxCurrentTCB也会指向新创建的任务(后创建的任务)。
抢占
最高优先级的ready list里的第1个任务永远可以即刻执行:
使用链表和Tick来理解时间片轮转
FreeRTOS的任务轮转时:每个任务运行一个Tick。一个Tick有多大,我们可以在FreeRTOSConfig.h中找到。
在FreeRTOS中,用于配置时钟节拍频率和任务调度行为的宏通常包含在FreeRTOSConfig.h文件中。以下是一些常见的宏定义,用于配置FreeRTOS的行为:
1. configTICK_RATE_HZ:用于设置时钟节拍的频率,即每秒钟的时钟节拍数。
2. configUSE_PREEMPTION:用于启用或禁用抢占式调度。
3. configUSE_TIME_SLICING:用于启用或禁用时间片轮转调度。
4. configMAX_PRIORITIES:用于设置系统支持的最大任务优先级数量。
这些宏定义可以根据你的需求进行配置,以定制化FreeRTOS的行为和任务调度机制。你可以在FreeRTOSConfig.h文件中找到这些宏定义,并根据需要进行修改。
任务状态的切换(链表+Tick)
任务状态切换图 :
Ready:就绪状态
Blocked:阻塞状态
Suspended:挂起状态
在FreeRTOS中,任务的状态可以分为几种,包括就绪状态(Ready)、阻塞状态(Blocked)和挂起状态(Suspended)。这些状态对应了不同的任务链表,这些链表在FreeRTOS内核中用于管理任务的调度和状态转换。
1. Ready状态(就绪状态)的任务存储在就绪任务列表(Ready List)中。这个列表包含了所有已经准备好运行,但还未被调度执行的任务。
2. Blocked状态(阻塞状态)的任务存储在阻塞任务列表(Blocked List)中。这个列表包含了由于某种原因而无法立即执行的任务,比如等待某个事件发生或者等待某个资源的释放。
3. Suspended状态(挂起状态)的任务通常不会存储在特定的链表中,因为挂起状态的任务已经被暂时停止,不参与调度。它们的状态信息通常会以其他方式进行管理,比如在任务控制块中进行标记。
通过这些链表,FreeRTOS可以有效地管理任务的状态转换和调度,确保任务按照预期的方式执行。
总结:
链表在任务调度中起着至关重要的作用,对任务的管理和调度都有着重要的影响。以下是链表在任务调度中的作用和影响的总结:
1. 任务状态管理:链表用于存储不同状态的任务,如就绪状态、阻塞状态等。通过将任务按照状态存储在不同的链表中,操作系统可以高效地管理和调度任务。
2. 调度算法实现:操作系统根据不同的调度算法(如优先级调度、时间片轮转调度等)从任务链表中选择下一个要执行的任务。链表提供了数据结构来组织和管理这些任务,以便调度器能够快速找到合适的任务进行调度。
3. 任务状态转换:任务在不同状态之间转换时,需要移动到不同的链表中。例如,一个任务从就绪状态变为阻塞状态时,需要从就绪任务列表中移除并加入到阻塞任务列表中。链表提供了数据结构来支持这种状态转换操作。
4. 系统性能影响:链表的设计和实现会影响任务调度的效率和系统性能。良好设计的链表数据结构可以提高调度器的效率,减少任务切换的开销,并促进系统的稳定运行。
综上所述,链表在任务调度中扮演着关键的角色,通过有效地管理任务的状态和调度顺序,帮助操作系统实现高效的任务调度和管理。知道了链表和任务调度的关系,在后续的学习中将会如虎添翼,让你对FreeRTOS的底层掌握更进一步。