freertos- 任務切換-pendSv異常(筆記)
阿新 • • 發佈:2018-11-19
1,為什麼需要任務切換
- 異常高於任何一個任務,任務亦可劃分優先順序,(0-31級;高 - 底;其中5-31級由FreeRTOS的管理排程)。
- 搶佔核心要求,使更高優先順序的任務及時得到相應,不著急的任務延後執行。
2,任務切換場合(任務上下文切換的場合)
- 執行了系統呼叫。
如:vTaskDelay() - “portYIELD_WITHIN_API - ”portYIELD()。
vTaskSuspend()/ vTaskResume()/ xQueueSend()/ xQueueReceive()/ xSemaphoreTake()/ xSemaphoreGive()等。
- 系統的系統定時器中斷SYSTICK。
osSystickHandler() - “xPortSysTickHandler() - ”portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
3,PENDSV異常
- 由ARM硬體核提供。
- 由軟體主動觸發.portYIELD()。
- PendSV是為系統裝置而設的“可懸掛請求”(pendable request);可懸起一個系統呼叫任務。
- 類似外部異常,屬於M3 / M4核16個系統異常之一,同樣可以像普通的異常一樣被搶佔掛起的。
- 可設定異常優先順序。為了實現緩期執行PendSV的,PendSV的一定要被設定為最低優先順序的異常。
- 用於嵌入式系統實現作業系統的切換。作業系統可以利用它“緩期執行”一個異常 - 直到其它重要的任務完成後才執行動作。
4,PENDSV中斷服務函式,完成任務上下文切換。