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