FreeRTOS笔记(七)开启调度器

  • Post author:
  • Post category:其他


上一文链接:

FreeRTOS笔记(六)列表与任务控制块




01 – vTaskStartScheduler()

调度器负责给各个任务分配CPU资源,使得多任务并发执行,FreeRTOS提供的

vTaskStartScheduler()

用于开启调度器,一旦开启,整个系统就交给调度器负责。

跟踪源码,过滤不必要的信息,可以看到调度器是如何开启的

一个简化的甘特图如下

Mon 07 xPortStartScheduler() prvStartFirstTask() vPortSVCHandler() 过程 vTaskStartScheduler()

开启调度器的主要工作是进行任务创建、中断设置以及运行第一个任务,接下来的工作将由各个中断触发运行,比如

SysTick

中断里面进行调度器程序的运行,

PenSVC

中断里面进行上下文切换等等。



02 – xTaskCreate()

现在比较关心的是

pxCurrentTCB

指针,因为调度器开启的时候就是加载

pxCurrentTCB

获取第一个任务的TCB,

pxCurrentTCB

指向的任务其实就是运行态的任务,永远指向当前优先级最高可运行的任务。


pxCurrentTCB

的改变大概分为两个情况:


情况1:任务创建



情况2:任务切换


先查看第1种情况,任务创建的时候,可以跟踪

xTaskCreate() / xTaskCreateStatic() / xTaskCreateRestricted()

查看任务的创建过程

从跟踪可知,

在每一次创建任务的时候(不管调度器有没有开启),都会检查新创建任务的优先级是否比当前高

,如果是,就把

pxCurrentTCB

指向这个任务,然后就可以进行任务切换了。

第2种情况,高优先级任务可能自行删除、或者挂起、或者阻塞等等让出了CPU,这个时候需要任务切换,

pxCurrentTCB

的改变就在这个时候,总的来说其实就是在就绪列表中查找优先级最高的任务,在下一文讨论。



03 – 总结

  • 每次创建任务,pxCurrentTCB都会更新
  • 开启调度器的主要工作是创建空闲任务、设置中断和开始第一个任务
  • 后续的工作比如任务切换等将由中断触发进行



版权声明:本文为Hxj_CSDN原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。