FreeRTOS任务调度
-
架构:Cortex-M3
-
版本:FreeRTOS V9.0.0
-
前言:上一篇我们分析了任务的切换,其中写到了在
vTaskSwitchContext
里面的taskSELECT_HIGHEST_PRIORITY_TASK
,计算uxTopReadyPriority 的前导零值,那么本篇尝试分析,FreeRTOS依据什么机制来操作uxTopReadyPriority 的。
1.任务创建
任务创建时,会把任务优先级的对应位置位到uxTopReadyPriority里,具体函数在prvAddTaskToReadyList
#define prvAddTaskToReadyList( pxTCB ) \
traceMOVED_TASK_TO_READY_STATE( pxTCB ); \
taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \
vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \
tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB )
比如我们创建第一个任务,任务优先级为1,那么在任务创建完成时,uxTopReadyPriority会被置为0x00000002。
2.SysTick异常
FreeRTOS中有一个系统滴答定时器,它会根据宏configTICK_RATE_HZ
来设置周期中断时间,比如设置为1000,则1ms发生一次中断,在前面章节分析过,这个中断的优先级是最低的。下面具体看这个中断程序xP