首先看调度器这三个字啥意思呢?
调度器的主要作用是在就绪队列中选择优先级最高的任务运行,如果优先级最高的任务不止一个,则选择队头的任务运行(某度查到的)
一句话理解他:好多作业都没写呢,先写那个好呢?嗯,不错,你想先写那个作业就写那个作业,你说了算,没错,你就是调度器
下面我们用两个任务的切换来是看看调度器到底是怎么干活的!
假设两任务分别为:Task1TCB和Task2TCB
言归正传,上代码:
void vTaskStartScheduler( void )
{
/* 手动指定第一个运行的任务 */
pxCurrentTCB = &Task1TCB;
/* 启动调度器 */
if( xPortStartScheduler() != pdFALSE )
{
/* 调度器启动成功,则不会返回,即不会来到这里 */
}
}
先运行任务一(Task1TCB)
代码继续
#define configKERNEL_INTERRUPT_PRIORITY 255 /* 高四位有效,即等于0xff,或者是15 */
#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )
#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )
BaseType_t xPortStartScheduler( void )
{
/* 配置PendSV 和 SysTick 的中断优先级为最低 */
portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;
/* 启动第一个任务,不再返回 */
prvStartFirstTask();
/* 不应该运行到这里 */
return 0;
}
之前有讲过如何配置PendSV 和 SysTick 的中断优先级,看不懂的查看下之前的文章
代码继续
__asm void prvStartFirstTask( void )