上一文链接:
FreeRTOS笔记(六)列表与任务控制块
01 – vTaskStartScheduler()
调度器负责给各个任务分配CPU资源,使得多任务并发执行,FreeRTOS提供的
vTaskStartScheduler()
用于开启调度器,一旦开启,整个系统就交给调度器负责。
跟踪源码,过滤不必要的信息,可以看到调度器是如何开启的
一个简化的甘特图如下
开启调度器的主要工作是进行任务创建、中断设置以及运行第一个任务,接下来的工作将由各个中断触发运行,比如
SysTick
中断里面进行调度器程序的运行,
PenSVC
中断里面进行上下文切换等等。
02 – xTaskCreate()
现在比较关心的是
pxCurrentTCB
指针,因为调度器开启的时候就是加载
pxCurrentTCB
获取第一个任务的TCB,
pxCurrentTCB
指向的任务其实就是运行态的任务,永远指向当前优先级最高可运行的任务。
pxCurrentTCB
的改变大概分为两个情况:
情况1:任务创建
情况2:任务切换
先查看第1种情况,任务创建的时候,可以跟踪
xTaskCreate() / xTaskCreateStatic() / xTaskCreateRestricted()
查看任务的创建过程
从跟踪可知,
在每一次创建任务的时候(不管调度器有没有开启),都会检查新创建任务的优先级是否比当前高
,如果是,就把
pxCurrentTCB
指向这个任务,然后就可以进行任务切换了。
第2种情况,高优先级任务可能自行删除、或者挂起、或者阻塞等等让出了CPU,这个时候需要任务切换,
pxCurrentTCB
的改变就在这个时候,总的来说其实就是在就绪列表中查找优先级最高的任务,在下一文讨论。
03 – 总结
- 每次创建任务,pxCurrentTCB都会更新
- 开启调度器的主要工作是创建空闲任务、设置中断和开始第一个任务
- 后续的工作比如任务切换等将由中断触发进行