搶占式核心:即當任務正在執行,有乙個更高優先順序的任務出現時,如果當前核心允許搶占,則可以將當前任務掛起,執行優先順序更高的任務。在我們上一章的基礎上我們已經做了這個工作。說白了就是在任務建立的時候進行了任務排程,已保證更高優先順序的任務能夠被及時執行。
還有就是在更高優先順序從非就緒態到就緒態的時候應該進行任務排程。這個場景是什麼呢?比如高優先順序的任務進入了sleep態,當sleep到達的時候應該在中斷中直接進行任務排程。
再比如高優先順序等待的事件到達時,應該直接切換到高優先順序任務執行。因為還沒有進行任務事件的部分所以這裡暫時先不討論。
好了,總結一下就是高優先順序任務只要從非就緒態變為就緒態就切換任務進行執行的核心就是搶占式核心。現在我們就來把我們唯一能做的sleep時間到時進行任務排程的工作做了吧。
我們在中斷中進行修改,為了避免不必要的任務排程,我們設定乙個變數記錄此次中斷是否需要任務排程boolean need_schedule = false;
if (need_schedule == true) }}
}os_task_running_id = highest_prio_id;
//把當前任務插入已執行任務佇列中
os_task_run[0] = os_task_running_id;}}
if (os_tcb[os_task_running_id].ostcbtimequantactr == 0) //給當前執行的時間片賦值
os_tcb[os_task_running_id].ostcbtimequantactr = os_tcb[os_task_running_id].ostcbtimequanta;
os_tcb[os_task_running_id].ostcbstatus = os_stat_running;
sp = os_tcb[os_task_running_id].ostcbstkptr;
}
如果此次中斷需要排程就把變數置起。
need_schedule = true;
好了,我們改完了。
main.c使用第6章的**執行結果如下:
[2019-09-10 19:09:28.314]# recv ascii>
stc15f2k60s2 rt-os test prgramme!
idle_task_0 in
[2019-09-10 19:09:29.314]# recv ascii>
[2019-09-10 19:09:30.314]# recv ascii>
[2019-09-10 19:09:31.314]# recv ascii>
[2019-09-10 19:09:32.300]# recv ascii>
(7)從1開始寫乙個作業系統
時間片輪轉排程是一種最古老,最簡單,最公平且使用最廣的演算法。每個任務被分配乙個時間段,稱作它的時間片,即該任務允許執行的時間。如果在時間片結束時程序還在執行,則cpu將被剝奪並分配給另乙個任務。如果任務在時間片結束前阻塞或結束,則cpu當即進行切換。排程程式所要做的就是維護一張任務先後執行的列表,...
寫乙個國產的作業系統?
如果我要寫乙個國產的作業系統,以下幾點也許可以考慮一下 中文程式設計。我們能不能做乙個用中文 寫成的作業系統呢?是的,中文 不僅僅要能顯示中文,處理中文,還要求作業系統的源 也是盡可能的用中文來寫。為了做成這件事,看來下面的事情是逃不掉的 寫乙個支援中文的編譯器 彙編,高階語言 乙個支援中文的控制台...
從零實現乙個作業系統 day1
我的部落格 startcraft.cn 從這次春招中的碰壁和各種感悟,深刻體會到自己基礎知識的不足,從零實現乙個作業系統可以幫助自己更好得了解作業系統的知識。自己很早之前就開始有寫乙個微型作業系統的想法,之前也實踐過,但弄了幾天就放棄了,發現自己的毅力太差了,其實就是太懶了,寫blog的目的也有敦促...