FreeRTOS学习笔记——SysTick中断

本文详细介绍了FreeRTOS中的SysTick中断在任务调度和时间管理中的作用,涉及时钟配置、中断处理函数和STM32内核的使用。重点讲解了如何在FreeRTOSConfig.h中设置系统时钟和时间片,以及port.c中的相关初始化函数。

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

FreeRTOS学习笔记——SysTick中断_freertos tick中断-优快云博客

FreeRTOS 之六 任务调度原理解析(Systick、PendSV、SVC)_freertos m0-优快云博客

FreeRTOS中关于时间的管理分为两部分:一部分是任务的延时管理;前面叙述过一些,还有一部分就是SysTick中断,管理任务的延时时间。SysTick是由STM32内核提供的,时钟源可选,用于产生FreeRTOS所需要的系统时钟,且是由用户可配的,用户在FreeRTOSConfig.h文件中配置configCPU_CLOCK_HZ以及configTICK_RATE_HZ两个宏来设置系统时钟,产生时间片时间,系统每隔固定时间进入SysTick中断处理时间。

有关时钟配置的初始化函数在port.c文件中,如下
 

void prvSetupTimerInterrupt( void )
{
	/* Configure SysTick to interrupt at the requested rate. */
	*(portNVIC_SYSTICK_LOAD) = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
	*(portNVIC_SYSTICK_CTRL) = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE;
}

配置的是portNVIC_SYSTICK_LOAD和portNVIC_SYSTICK_CTRL两个寄存器,有关SYSTICK寄存器的说明可以在armv6-m体系结构参考手册中查看

<think>嗯,用户问的是FreeRTOSSysTick中断是否触发任务切换。这个问题涉及到操作系统的核心调度机制,需要仔细梳理引用材料中的关键信息。 从引用[1]可以明确看到,SysTick中断的主要作用是产生系统节拍,驱动调度器运行。每次SysTick中断发生时,调度器会检查任务状态,但这里有个关键点:它说的是"触发调度器的运行",而不是直接执行切换。 引用[4]和[5]提供了更具体的机制说明。原来SysTick中断服务程序中会通过设置PendSV挂起位来触发任务切换。这个设计很巧妙,因为SysTick作为周期性中断需要快速执行完毕,而任务切换需要保存大量上下文,耗时较长。所以通过触发PendSV这个可延迟的中断来实现实际切换,这样SysTick就能快速返回。 用户可能还隐含了一个疑问:为什么不用SysTick直接切换?引用[3]提到的优先级问题就是答案。SysTick优先级通常设得比普通中断高,如果让它执行耗时的切换操作,会阻塞其他重要中断。引用[2]的标题也印证了这点——"有了SysTick为什么还要PendSV"。 需要提醒用户注意的是时间片轮转场景。当多个同优先级任务采用时间片调度时,SysTick中断会通过PendSV强制切换任务,这是引用[4]明确说明的。不过阻塞任务切换的情况比较特殊,比如任务主动调用vTaskDelay,此时虽然SysTick会标记任务就绪,但实际切换可能延迟到调度器下次运行。 最后检查所有引用标记:[^1]对应系统节拍基础功能,[^4][^5]对应切换机制,[^3]说明优先级设计原因,都准确关联到了解答要点。这样用户既能得到明确结论,又能理解背后的设计思想。</think>在FreeRTOS中,**SysTick中断本身不会直接执行任务切换**,但它是**触发任务切换的关键机制**。具体过程如下: ### 1. **SysTick的核心作用** - SysTick是Cortex-M内核的定时器,提供**周期性的中断(tick)**,通常配置为1ms一次[^1]。 - 每个SysTick中断会**触发FreeRTOS调度器(scheduler)运行**,检查任务状态(如阻塞任务是否超时、时间片是否耗尽)[^1][^4]。 ### 2. **任务切换的实际执行者** - 调度器在SysTick中断服务程序(ISR)中**设置PendSV挂起位**,但**不立即切换任务**: ```c portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; // 触发PendSV中断[^5] ``` - **PendSV中断(优先级最低)** 实际执行上下文切换: - 当SysTick ISR退出后,若没有更高优先级中断,PendSV ISR自动触发。 - PendSV保存当前任务上下文,加载新任务上下文,完成切换[^2][^4][^5]。 ### 3. **为何采用两级中断?** - **保证SysTick的实时性**: SysTick ISR需快速执行(仅标记切换需求),避免阻塞其他高优先级中断[^3][^4]。 - **降低延迟影响**: 实际切换由PendSV延迟处理,确保SysTick能及时响应下一次节拍[^2][^5]。 ### 4. **任务切换的触发场景** - **时间片耗尽**:同优先级任务轮转时,SysTick触发PendSV强制切换[^4]。 - **阻塞任务就绪**:如`vTaskDelay()`延时结束,SysTick标记任务就绪,调度器通过PendSV切换[^1][^4]。 - **主动让出CPU**:任务调用`taskYIELD()`直接触发PendSV[^5]。 ### 总结 > **SysTick中断是任务切换的"触发器",而非执行者**。它通过调度器标记切换需求,并由PendSV中断在安全时机执行实际切换[^1][^4][^5]。这种设计确保了时间管理的精确性,同时最小化了对实时中断的干扰[^3]。 --- ### 相关问题 1. **SysTick和PendSV中断的优先级应如何设置?为什么?** (提示:参考引用[3]中优先级配置对实时性的影响) 2. **FreeRTOS中哪些场景会触发PendSV中断?** (提示:除SysTick外,任务主动让出、信号量操作等) 3. **如何配置SysTick中断频率?更高的频率有何利弊?** (提示:权衡调度精度与系统开销) 4. **任务切换过程中,为何需要保存/恢复寄存器上下文?** (提示:分析PendSV中断服务程序的作用)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aurora Smith

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值