1. 程式人生 > >FreeRTOS筆記(七)開啟排程器

FreeRTOS筆記(七)開啟排程器

文章目錄


上一文連結: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都會更新
  • 開啟排程器的主要工作是建立空閒任務、設定中斷和開始第一個任務
  • 後續的工作比如任務切換等將由中斷觸發進行