FreeRTOS笔记(七)开启调度器


上一文链接:FreeRTOS笔记(六)列表与任务控制块

01 - vTaskStartScheduler()

  调度器负责给各个任务分配CPU资源,使得多任务并发执行,FreeRTOS提供的vTaskStartScheduler()用于开启调度器,一旦开启,整个系统就交给调度器负责。
  跟踪源码,过滤不必要的信息,可以看到调度器是如何开启的

  一个简化的甘特图如下

Mon 31 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都会更新
  • 开启调度器的主要工作是创建空闲任务、设置中断和开始第一个任务
  • 后续的工作比如任务切换等将由中断触发进行

猜你喜欢

转载自blog.csdn.net/Hxj_CSDN/article/details/85243811