實現任務切換,需要呼叫函式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...