文章目录
任务调度器
任务调度器的开启 vTaskStartScheduler
- 创建空闲任务和软件定时器
- 关中断 portDISABLE_INTERRUPTS();
- 允许运行任务调度器 xSchedulerRunning = pdTRUE;
- 开启任务调度器,初始化相关硬件 xPortStartScheduler()
开启任务调度器,初始化 xPortStartScheduler
- 设置pendsv和滴答定时器优先级为最低优先级
- 设置滴答定时器的周期
- 初始化临界区嵌套计时器
- 开始第一个任务 prvStartFirstTask();
开启第一个任务 prvStartFirstTask
- 获取MSP的初始值,复位MSP
- 使能中断
- 数据和指令同步(保证数据和指令的写入和执行,而非在缓冲区)
- 触发SVC中断
SVC中断服务函数
中断服务函数:SVC_Handler()
- 取当前任务的TCB块,获取栈顶指针赋值给r0
- 寄存器出栈
- 进程栈PSP指针初始化为任务堆栈
- 指令同步
- 开启中断
空闲任务
在vTaskStartScheduler函数中会创建一个空闲任务,这个任务优先级最低,功能有:
- 判断系统是否有任务删除
- 运行用户设置的空闲任务钩子函数
- 低功耗模式的开启与处理
调度器的挂起和恢复 vTaskSuspendAll xTaskResumeAll
vTaskSuspendAll:任务挂起所有主要是使得滴答定时器不在更新系统时钟节拍数(xTickCount),系统就会认为时间仍未达到唤醒其他任务的时间,这样就不会进行任务切换了;挂起时候用uxPendedTicks来记录时间节拍;同时将任务调度器挂起,即将更改标志位
xTaskResumeAll:相反,恢复xTickCount计数时钟节拍数;恢复任务调度器,即将更改标志位