ucos任務排程

2021-07-25 21:55:20 字數 1174 閱讀 3752

實現任務切換,需要呼叫函式ossched()

void ossched(void)

int8u y;

os_enter_critical();

if(oslocknesting|osintnesting==0)            (1)

y=osunmaptbl[osrdygrp];

ospriohighrdy=(int8u)((y<<3)+osunmaptbl[osrdytbl[y]]);

if(ospriiohighrdy!=ospriocur)

ostcbhighrdy=ostcbpriotbl[ospriohighrdy];

osctxswctr++;

os_task_sw();

os_exit_critical();

基本實現原理大致是找出優先順序最高的任務,ostcbhighrdy指向優先順序最高任務的任務控制塊,接著呼叫巨集os_task_sw();

巨集os_task_sw()完成實質性任務切換工作

下面具體了解**的作用

1.首先判斷是不是在中斷子函式中呼叫,任務排程由沒有上鎖 (1);

2.如果不是在中斷子函式中呼叫,並且任務排程沒有上鎖,找出就緒表中優先順序最高任務(2)

3.檢驗這個優先順序最高的任務是不是當前正在執行的任務,以此來避免不必要的任務排程  (3)

4.如果不是,ostcbhighrdy指向優先順序最高的那個任務控制塊os_tcb(4);

5.osctxswctr加1,這個值是記錄任務切換次數的

6.最後巨集呼叫os_task_sw()來完成實際上的任務切換,這個巨集是我們子啊移植ucosii時編寫

任務切換很簡單,由以下兩步完成,將被掛起任務的微處理器暫存器推入堆疊,然後將優先順序較高的任務的暫存器從棧中恢復到暫存器中。

在uc/os-ii中,就緒任務的棧結構總是看起來跟剛剛發生過中斷一樣,所有微處理器的暫存器都儲存在棧空間。換句話說ucos執行就緒任務所要做的一切

,指是恢復所有cpu暫存器並執行中斷指令,為了做任務切換,執行os_task_sw();人為模仿一次中斷,多數微處理器有軟中斷指令實現上述操作,

中斷服務子程式,必須提供中斷向量給彙編函式osctxsw,osctxsw除了需要os_tcbhighrdy指向即將被掛起的任務,還需要讓當前任務控制塊

ostcbcur指向被掛起的任務,有關於osctxsw更詳盡的解釋。

ucos任務排程

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

ucos的任務排程

在多工系統中,都會提供乙個系統函式來進行程序 任務 間切換,綜合來說,他們有兩種程序 任務 切換方式 1 由程序 任務 本身直接呼叫任務切換函式進行程序 任務 切換 在當前程序 任務 因為不能獲得必須的資源而立即被堵塞時,就由程序 任務 本生直接呼叫程序 任務 切換函式進行程序 任務 間排程。在li...

ucos何時進行任務排程

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