ucos的任務排程

2021-05-02 23:08:14 字數 794 閱讀 7063

在多工系統中,都會提供乙個系統函式來進行程序(任務)間切換,綜合來說,他們有兩種程序(任務)切換方式:

1) 由程序(任務)本身直接呼叫任務切換函式進行程序(任務)切換:

在當前程序(任務)因為不能獲得必須的資源而立即被堵塞時,就由程序(任務)本生直接呼叫程序(任務)切換函式進行程序(任務)間排程。

在linux中可以直接呼叫schedule()函式來實現。

在ucos中,通過呼叫ossched()來完成。

2) 延遲呼叫任務切換函式進行程序(任務)切換:

此方式是把當前程序(任務)設定一排程標誌而以延遲方式呼叫任務切換函式進行程序(任務)切換。

在linux系統中,總是在恢復使用者態程序執行之前,檢查這一排程標誌,在這裡標誌是:tif_need_resched,如果有這一標誌,就呼叫排程函式進行程序切換。此種情況主要包括以下幾種:

a. 當前程序用完了它的cpu時間片,有scheduler_tick()函式完成 schedule()的延遲呼叫。

b.當乙個被喚醒程序的優先順序比當前程序優先順序高時,由try_to_wake_up()函式完成schedule()的延遲呼叫。

c.當發出系統呼叫sched_setscheduler()時。

在這些情況中,主要由於系統呼叫或中斷而進入核心態,或者當前程序本來在核心態時,返回使用者態時發生的。

在ucos中,所有的任務有不同的優先順序,不會出現同一優先順序上有多個任務的情況,而且也沒有系統呼叫的概念,所以任務排程的延遲呼叫只能出現在中斷處理完成返回時,在osintext()函式中,檢查是否有高優先順序的任務就緒,如果有高優先順序的任務就緒,進行任務切換。

ucos任務排程

1 ostimedly產生延時,假設當前任務a呼叫ostimedly函式,則ostimedly函式就將任務a從任務就緒表中去掉,並將延時時間賦值給任務a的任務控制塊中的ostcbdly,然後呼叫os sched。2 os sched函式,它利用任務就緒表,將就緒任務中的優先順序最高的任務查出,賦值給...

ucos任務排程

實現任務切換,需要呼叫函式ossched void ossched void int8u y os enter critical if oslocknesting osintnesting 0 1 y osunmaptbl osrdygrp ospriohighrdy int8u y 3 osunm...

ucos何時進行任務排程

ucos是搶占式執行任務的,需要手動執行任務排程。任務排程一種是任務級的排程器,由函式ossched 實現,而中斷級的排程器由函式osintexit 實現。ostimedlyhmsm ostimedly os sched 就可以實現任務排程。中斷函式中開始有osintenter 結束時有osinte...