在多工系統中,令cpu中止當前正在執行的任務轉而去執行另乙個任務的工作。
(1) 獲得待執行任務的tcb(任務控制塊)指標。
(2) 進行斷點資料的切換。
作業系統是通過任務控制塊tcb來管理任務的,因此排程器真正實施任務切換之前的主要工作就是獲得待執行任務的tcb指標和當前任務的tcb指標。
(1)把被中止任務的斷點指標儲存到任務堆疊中;
(2)把cpu通用暫存器的內容儲存到任務堆疊中;
(3)把被中止任務的任務堆疊指標儲存到該任務的任務控制塊的ostcbstkptr中;
(4)獲得待執行任務的任務控制塊;
(5)使cpu通過任務控制塊獲得待執行任務的任務堆疊指標;
(6)把待執行任務堆疊中通用暫存器的內容恢復到cpu的通用暫存器中;
(7)使cpu獲得待執行任務的斷點指標(該指標是待執行任務在上一次被排程器中止執行時保留在任務堆疊中的)。
通過上面可以發現,乙個任務的中止執行跟另乙個待執行任務正好是乙個相反的過程。
用壓棧指令把cpu通用暫存器r1、r2...壓入堆疊;
//把sp儲存在中止任務控制塊中
ostcbcur -> ostcbstkptr = sp;
//使系統獲得待執行任務控制塊
ostcbcur = ostcbhighrdy;
//把待執行任務堆疊指標賦給sp
sp = ostcbhighrdy -> ostcbstkptr;
用出棧指令把r1、r2...彈入cpu的通用暫存器;
• 根據就緒表獲得待執行任務的
tcb-->cpu通用暫存器 = 待執行任務堆疊中通用暫存器-->恢復待執行任務的工作環境-->處理器pc = 任務堆疊用的斷點指標
第一步解釋(獲得tcb指標):排程器ossched()在確認未被上鎖並且不是中斷服務程式呼叫排程器的情況下,首先在就緒表中查得ospriohighrdy(即優先順序最高的就緒任務);如果ospriocur !=就緒任務,ostcbhighrdy =ostcbpriotbl[ospriohighrdy]
最後一步解釋(pc介紹):pc叫程式計數器,他用來指向執行的程式的。只有pc獲得了新任務的位址,cpu才會執行新的任務。
對於被中止任務:pc中的斷電指標壓入任務堆疊。
對於待執行任務:任務堆疊中的上次被中止時存放的中斷指標壓入pc。
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任務掛起
建立好了任務之後,就已經初步跨進了ucosii的程式設計了,隨著進一步的程式設計,發現學會建立了任務還是不夠的,建立任務1用於串列埠1傳送資料,任務2用於串列埠1接收資料,程式本身的意圖是傳送完資料後,接著就串列埠1接收反饋回來的資訊,但是不能正常通訊,原因就是當任務1在傳送資料過程 cpu時不是會...