FreeRTOS---PendSV介绍

在移植FreeRTOS时,要在FreeRTOSConfig.h配置文件中进行下面的定义
#define xPortPendSVHandler PendSV_Handler

PendSV是一种特殊的中断,主要用于任务调度和上下文切换

1. PendSV的特点

可悬起: PendSV可以被操作系统悬起,以便在其他重要任务完成后才执行操作。这使得操作系统可以利用PendSV来实现任务的“缓期执行”。
优先级: PendSV通常被设置为最低优先级,以确保在所有其他更高优先级的中断和异常处理完毕后才执行上下文切换。这有助于减少对实时性能的影响。中断优先级高于所有任务
任务切换: 在实时操作系统(RTOS)中,PendSV主要用于触发上下文切换,使得操作系统能够从一个任务切换到另一个任务。

2. PendSV的使用

  1. 设置优先级: 在函数xPortStartScheduler() 中,设置PendSV优先级为最低
#define portNVIC_SHPR3_REG   ( *( ( volatile uint32_t * ) 0xe000ed20 ) )
/* Make PendSV and SysTick the lowest priority interrupts. */
portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI;
portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;
  1. 触发PendSV: 系统调用portYIELD()/系统滴答定时器(SysTick)中断。通过将中断控制和状态寄存器 ICSR 的 bit28,也就是 PendSV 的挂起位置 1 来触发PendSV 中断
/* Set a PendSV to request a context switch. */ \
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; 
  1. 上下文切换: 在PendSV处理程序中,操作系统会保存当前任务的状态(包括寄存器、堆栈指针等),并恢复即将运行的任务的状态。这实现了无缝的任务切换,使得新的任务能够立即接管CPU的使用权。
  2. 优化性能: 通过将PendSV设置为最低优先级,操作系统可以确保在执行上下文切换之前,所有其他更高优先级的中断和异常都已经得到处理。这有助于减少中断延迟并提高系统的实时性能

在这里插入图片描述

未完待续~~~

### FreeRTOS 任务调度原理解析 #### 任务调度的核心结构 FreeRTOS 使用链表来管理系统中的各个任务,这些链表用于维护不同状态下的任务列表。每当发生TICK中断时,即每隔固定的周期产生一次定时器中断,系统会检查当前的任务状态并决定下一个要执行的任务[^1]。 #### 启动任务调度过程 当应用程序调用了`vTaskStartScheduler()`函数之后,FreeRTOS将会初始化必要的内核对象,并创建一个特殊的空闲任务(idle task)。此空闲任务会在没有任何更高优先级可运行任务的情况下被执行;它通常负责处理诸如降低CPU功耗之类的低级别操作[^2]。 #### 上下文切换触发条件 每次进入Systick中断期间——这是由硬件定时器驱动的一个定期发生的事件——操作系统都会评估是否存在新加入到就绪队列里的高优先级任务等待执行。如果确实存在这样的情况,则会设置标志位以请求稍后挂起PendSV异常来进行实际的上下文切换工作[^3]。 #### 初始任务的选择逻辑 在首次激活调度程序之前已经创建好的所有任务当中,具有最高优先级别的那个会被选作首个投入运行的对象。而在同属这一最高等级的一组候选者之间,则按照它们被建立的时间顺序逆序选取最后生成的那个作为起点[^4]。 ```c // 示例代码展示如何启动调度器 void main(void){ // 创建一些任务... // 开始多任务调度 vTaskStartScheduler(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值