在移植FreeRTOS时,要在FreeRTOSConfig.h配置文件中进行下面的定义
#define xPortPendSVHandler PendSV_Handler
PendSV是一种特殊的中断,主要用于任务调度和上下文切换
1. PendSV的特点
可悬起: PendSV可以被操作系统悬起,以便在其他重要任务完成后才执行操作。这使得操作系统可以利用PendSV来实现任务的“缓期执行”。
优先级: PendSV通常被设置为最低优先级,以确保在所有其他更高优先级的中断和异常处理完毕后才执行上下文切换。这有助于减少对实时性能的影响。中断优先级高于所有任务
任务切换: 在实时操作系统(RTOS)中,PendSV主要用于触发上下文切换,使得操作系统能够从一个任务切换到另一个任务。
2. PendSV的使用
- 设置优先级: 在函数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;
- 触发PendSV: 系统调用portYIELD()/系统滴答定时器(SysTick)中断。通过将中断控制和状态寄存器 ICSR 的 bit28,也就是 PendSV 的挂起位置 1 来触发PendSV 中断
/* Set a PendSV to request a context switch. */ \
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
- 上下文切换: 在PendSV处理程序中,操作系统会保存当前任务的状态(包括寄存器、堆栈指针等),并恢复即将运行的任务的状态。这实现了无缝的任务切换,使得新的任务能够立即接管CPU的使用权。
- 优化性能: 通过将PendSV设置为最低优先级,操作系统可以确保在执行上下文切换之前,所有其他更高优先级的中断和异常都已经得到处理。这有助于减少中断延迟并提高系统的实时性能。
未完待续~~~