1)ostimedly產生延時,假設當前任務a呼叫ostimedly函式,則ostimedly函式就將任務a從任務就緒表中去掉,並將延時時間賦值給任務a的任務控制塊中的ostcbdly,然後呼叫os_sched。
(2)os_sched函式,它利用任務就緒表,將就緒任務中的優先順序最高的任務查出,賦值給ospriohighrdy,然後用os_task_sw切換任務。
(3)ostimetick函式,它由定時器的中斷服務程式呼叫,ostimetick函式的作用是將延時時間已到的任務新增到任務就緒表中,以供os_sched切換任務時查詢使用。
總 結一下就是,排程任務要靠任務就緒表,如果要延時,則ostimedly將該任務從就緒表中去掉,如果延時已到,則ostimetick將該任務新增到就 緒表中,他們這樣做的目的都是為os_sched產生任務切換提供依據,最終,任務的切換是要靠os_sched!!!!!!
在多工系統中,都會提供乙個系統函式來進行程序(任務)間切換,綜合來說,他們有兩種程序(任務)切換方式:
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()函式中,檢查是否有高優先順序的任務就緒,如果有高優先順序的任務就緒,進行任務切換。
在多工系統中,都會提供乙個系統函式來進行程序(任務)間切換,綜合來說,他們有兩種程序(任務)切換方式:
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任務排程
實現任務切換,需要呼叫函式ossched void ossched void int8u y os enter critical if oslocknesting osintnesting 0 1 y osunmaptbl osrdygrp ospriohighrdy int8u y 3 osunm...
ucos的任務排程
在多工系統中,都會提供乙個系統函式來進行程序 任務 間切換,綜合來說,他們有兩種程序 任務 切換方式 1 由程序 任務 本身直接呼叫任務切換函式進行程序 任務 切換 在當前程序 任務 因為不能獲得必須的資源而立即被堵塞時,就由程序 任務 本生直接呼叫程序 任務 切換函式進行程序 任務 間排程。在li...
ucos何時進行任務排程
ucos是搶占式執行任務的,需要手動執行任務排程。任務排程一種是任務級的排程器,由函式ossched 實現,而中斷級的排程器由函式osintexit 實現。ostimedlyhmsm ostimedly os sched 就可以實現任務排程。中斷函式中開始有osintenter 結束時有osinte...