1.1 臨界段可以關中斷來保持獨佔。為什麼可以關中斷來保持獨佔呢?因為能引起排程的有兩個,乙個是呼叫
系統函式,另外乙個是中斷喚醒了乙個事件。而明顯進入臨界段是不會呼叫系統函式的了,因而意外的就是
可能會發生中斷,所以把中斷關掉了,就不會發生排程了。
1.2 任務
ucos的任務可以達64個,但是最高和最低的四個,總共八個優先順序給保留給以後公升級用。優先級數越低
優先順序就越高。
1.3 核心的幾個基本函式
建立任務
任務的自願處理:延時函式
任務的被迫處理:訊號量、郵箱、佇列
中斷處理函式
時鐘處理函式
1.4 任務控制塊
主要的項:堆疊指標,tcb id,優先順序,當前狀態,延時計數
tcb鍊錶指標
訊號量、訊息佇列指標
擴充套件tcb指標
1.5 幾個資料列表
1.5.1 空閒列表
uc是預先把所有的任務tcb空間都分配好了。
剛剛開始的時候,所有任務都鏈結起來,當成雙向鍊錶,由乙個頭指向這個鍊錶。
每次分配空間,都在鍊錶中取乙個出來。
每釋放乙個任務,就把tcb空間放回空閒列表。
1.5.2 就緒列表
就緒列表其實就是放置當前就緒的任務列表。涉及任務放入,任務刪除,和獲取最高優先順序任務
三個操作。
uc是用兩組東西來表示就緒表,乙個8位的變數和乙個由8個8位的整數組成的陣列。
變數的乙個位代表了8個任務是否有至少乙個進入了就緒狀態。
而乙個陣列中乙個數代表了8個任務,每1位代表了乙個任務。
任務放入:就是簡單的設定變數(對應那8個任務中有放進了乙個),然後設定乙個陣列中
的對應的對應的位。
任務刪除:改變變數和陣列中對應的位。
判斷最高優先順序:主要,uc陣列中對應位的位置就是對應了相應的優先順序。8個數8位剛好就是
對應了64個優先順序。
按我的想法:
可以把任務的tcb放到乙個就緒鍊錶中。加入任務,就是把對應tcb的頭指標加入鍊錶,刪除就是
在鍊錶刪除。查詢最高優先順序,就是在鍊錶中獲得tcb指標,從而找到優先順序域,進行比較。
1.6 任務切換
1.6.1 任務切換的時候不允許中斷
1.6.3 先判斷條件,是否在中斷巢狀中呼叫或者是否禁止了任務切換
1.6.2 任務切換很簡單,就是查詢就緒表,獲得最高優先順序的任務tcb,呼叫彙編的任務切換。
1.6.3 呼叫任務切換鎖的時候,必須執行任務解鎖。呼叫了鎖後,不能呼叫訊號量同步或者佇列,會
使得當前任務掛住的系統函式。
1.7 中斷
1.7.1 中斷要做的事情:
清掉中斷源
儲存暫存器
中斷巢狀計數加1(需要互斥保護,注意,呼叫uc的 osintenter()出來後是開中斷的)
執行中斷處理
判斷中斷巢狀是否為0,是0就表示沒有中斷要處理了,馬上進行就緒表判斷
恢復暫存器
1.7.2 中斷可能要涉及彙編,而且記得清掉中斷源。
1.7.3 中斷是要盡快執行的,盡量通過訊息或者同步把訊號發到任務,給任務去執行。
1.8 時鐘
時鐘主要的工作,乙個是處理各個任務tcb的延時項,還有就是計數系統的執行時間。
Linux核心結構
linux核心主要由五個子系統組成 程序排程,記憶體管理,虛擬檔案系統,網路介面,程序間通訊。1.程序排程 sched 控制程序對cpu的訪問。當需要選擇下乙個程序執行時,由排程程式選擇最值得執行的程序。可執行程序實際上是僅等待cpu資源的程序,如果某個程序在等待其它資源,則該程序是不可執行程序。l...
Linux核心結構
linux核心主要由五個子系統組成 程序排程,記憶體管理,虛擬檔案系統,網路介面,程序間通訊。1.程序排程 sched 控制程序對cpu的訪問。當需要選擇下乙個程序執行時,由排程程式選擇最值得執行的程序。可執行程序實際上是僅等待cpu資源的程序,如果某個程序在等待其它資源,則該程序是不可執行程序。l...
linux核心結構
1.程序排程 sched 控制程序對cpu的訪問。當需要選擇下乙個程序執行時,由排程程式選擇最值得執行的程序。可執行程序實際上是僅等待cpu資源的程序,如果某個程序在等待其它資源,則該程序是不可執行程序。linux使用了比較簡單的基於優先順序的程序排程演算法選擇新的程序。2.記憶體管理 mm 允許多...