任务切换一共两种方式:系统节拍器中断、调用portYIELD。但是,最终都是产生PendSV中断。
/* SysTick异常处理入口 */
void xPortSysTickHandler(void)
{
/* 禁止不高于系统调用优先级的中断 */
vPortRaiseBASEPRI();
{
/* 提供系统节拍,并判断是否需要切换任务 */
if(xTaskIncrementTick() != pdFALSE)
{
/* 悬起PendSV */
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
}
}
/* 打开中断 */
vPortClearBASEPRIFromISR();
}
/* 请求调度 */
#define portYIELD() \
{ \
/* 请求可悬起异常 */ \
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \
\
__dsb(portSY_FULL_READ_WRITE); \
__isb(portSY_FULL_READ_WRITE); \
}
系统节拍器产生中断之后ÿ