1. 程式人生 > >freertos- 任務切換-pendSv異常(筆記)

freertos- 任務切換-pendSv異常(筆記)

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中斷服務函式,完成任務上下文切換。