FreeRTOS 任务调度 系统节拍

本文详细解析FreeRTOS中的任务调度,包括xTaskIncrementTick()函数的作用,如节拍计数器溢出、任务超时唤醒、时间片轮询等。同时介绍了两种系统延时函数vTaskDelay和vTaskDelayUntil的使用,特别是vTaskDelayUntil用于确保周期性任务准确执行的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@(嵌入式)

Freertos
FreeRtos

简述

文章 < FreeRTOS 任务调度 任务切换 > 记录了 FreeRTOS 中任务切换的过程, 提到触发任务切换的两种情况 : 高优先级任务就绪抢占和同优先级任务时间共享(包括提前挂起)。 系统中,时间延时和任务阻塞,时间片都以 Systick 为单位。

通过设置文件 FreeRTOSConfig.hconfigTICK_RATE_HZ 设置任务节拍中断频率, 在启动任务调度器时,系统会根据另一个变量, CPU 的频率 configCPU_CLOCK_HZ 计算对应写入节拍计数器的值,启动定时器中断。

系统在每一次节拍计数器中断服务程序xPortSysTickHandler(平台实现 port.c 中) 中调用处理函数 xTaskIncrementTick, 依据该函数返回值判断是否需要触发 PendSV 异常, 进行任务切换。
涉及任务时间片轮循, 任务阻塞超时, 以及结束以此实现的延时函数。

分析的源码版本是 v9.0.0

xTaskIncrementTick()

系统每次节拍中断服务程序中主要任务由函数 xTaskIncrementTick 完成。
在任务调度器没有挂起的情况下( xTaskIncrementTick != pdFALSE ),该函数主要完成 :
* 判断节拍计数器xTickCount 是否溢出, 溢出轮换延时函数队列
* 判断是否有阻塞任务超时,取出插入就绪链表
* 同优先级任务时间片轮

而当任务调度器被挂起时, 该函数累加挂起时间计数器 uxPendedTicks, 调用用户钩子函数, 此时,正在运行的任务不会被切换, 一直运行。
当恢复调度时, 系统会先重复调用 xTaskIncrementTick 补偿 (uxPendedTicks次)。

不管, 系统调度器是否挂起, 每次节拍中断都会调用用户的钩子函数 vApplicationTickHook。 由于函数是中断中调用,不要在里面处理太复杂的事情!!

节拍计数器溢出

涉及的变量, 定义在 task.c开头。

PRIVILEGED_DATA static List_t xDelayedTaskList1;
PRIVILEGED_DATA static List_t xDelayedTaskList2;
PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList;
PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList;

初始化时, pxDelayedTaskList 指向 xDelayedTaskList1pxOverflowDelayedTaskList 指向 pxOverflowDelayedTaskList,一开始我还在郁闷延时链表为什么要两个,到这里才明白。

当任务由于等待事件(延时,消息队列什么的堵塞)时,会设置一个时间,这时候,响应的任务会被挂到延时链表中,如果超过设置时间没有事件响应,则系统会从延时链表中取出任务恢复就绪。
系统任务延时参考系统节拍计数器 xTickCount, 加入链表前依据当前计数器的值计算出超时的值 ( xTickCount+ xTicksToDelay ), 顺序插入到延时链表中。

对不同平台xTickCount 表示的位数不同,但是每次节拍中断加一,总会溢出。 上述计算任务延时时间,如果系统发现计算出来的时间已经溢出,则会将该任务加入到 pxOverflowDelayedTaskList 这个链表中。
在系统节拍中断时, 节拍计数器每次加一, 系统判断是否溢出,如果溢出, 调用宏 taskSWITCH_DELAYED_LISTS()切换上述的链表指针。
宏主要实现

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值