任务切换
所谓任务切换,就是在就绪列表中,寻找优先级最高的就绪任务,然后执行该任务
任务切换的本质是通过触发 PendSV 中断,在中断中执行任务切换
#define portNVIC_INT_CTRL_REG (*(( volatile uint32_t *) 0xe000ed04))
#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
#define portSY_FULL_READ_WRITE ( 15 )
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD()
#define taskYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API()
#define portYIELD_WITHIN_API portYIELD
#define taskYIELD() portYIELD()
#define portYIELD() \
{ \
/* 触发 PendSV,将PendSV的悬起位置1,产生中断(优先级最低)*/\
/* 产生上下文切换,任务切换处理主要是在PendSV中断中 */ \
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; // bit28写1触发pendsv中断\
__dsb( portSY_FULL_READ_WRITE ); \
__isb( portSY_FULL_READ_WRITE ); \
} // 也就是切换任务的本质是通过 PendSV 中断实现