簡化的(忽略壹些細節),UCOS啟動時會創建壹個idle的任務,這個任務是最低優先級的,且不會被刪除。調用OSTaskCreate可以創建新的任務,系統維護了壹個任務列表(TCB)。
任務有休眠(可以理解成已經被從任務列表中刪除的任務),等待,Ready,運行 4種狀態(書上不是這麽說的,但可以這麽理解,等待狀態可能有多種原因造成)
系統在中斷處理函數中執行任務調度過程,執行優先級最高的,處於ready狀態的任務。調度成功後此任務從ready變成運行狀態。如果沒有任何任務可以調度,那麽idle這個任務就會運行。
從編程角度講:
1. 硬件中斷產生會導致調度,例如I/O中斷,這個不需要細說。
2. 在當前任務中調用OSTaskCreae創建新任務,會導致壹個系統的內核調用,會產生壹個模擬中斷,因為系統在中斷處理時執行任務調度,所以如果新任務的優先級比當前的大,新任務會立刻被運行。
3. 調用OSStart會導致壹個系統的內核調用,會產生壹個模擬中斷,因為系統在中斷處理時執行任務調度,所以優先級最高的,處於ready狀態的任務會被執行。
4. 調用OSTimeDly可以將當前任務改成等待狀態,設置等待的時間,然後會導致壹個系統的內核調用,會產生壹個模擬中斷。所以另壹個優先級最高的,處於ready狀態的任務會被執行;在系統的時鐘中斷中會在等待時間到了之後把任務改成ready狀態。
5. OSSemPend、OSMboxPend,OSQPend等函數調用也會導致當前任務改成等待狀態,然後會導致壹個系統的內核調用,會產生壹個模擬中斷。所以另壹個優先級最高的,處於ready狀態的任務會被執行;這個等待狀態必須在收到wakeup的信號才能解除。
6. 修改任務優先級也可以引起調度。
實際的硬件中斷對應的系統調度函數是OSIntExt,其他軟件模擬調度的函數是OSSched。
UCOS的調度原理總體來說非常簡單,因為沒有時間片概念和優先級反轉的問題。
UCOS有很多優化或者定制版本,大多在調度上會有自己的修改,請註意。