任務控制塊是乙個基於鍊錶的資料結構,任務控制塊主要用於記錄任務的堆疊棧頂指標、指向下乙個任務控制塊的指標、任務等待的延遲時間、任務的當前狀態標誌與任務的優先級別等一些與任務管理有關的屬性。
任務的識別
對於rtos來說,為每乙個任務分配乙個稱為任務控制塊的結構體變數來管理任務,即使用指向任務控制塊結構體變數的指標來識別任務。
任務控制塊是多工作業系統的核心資料,如果操作錯誤,可能導致系統崩潰。所以這個指標不應當提供給使用者程式。
任務控制塊的結構體陣列
struct tn_os_tcb
;typedef
struct tn_os_tcb tn_os_tcb;
//tn_os_tcb型別等效struct tn_os_tcb
static data tn_os_tcb __gtcbtasks[tn_os_max_tasks]
;//任務控制塊的結構體陣列
為乙個任務控制塊的結構體陣列,首先宣告了乙個struct tn_os_tcb型別,它代表任務控制塊,包括2個成員:不同資料型別的jbtaskcontext 上下文資訊與uc-taskstat任務狀態字。將tn_os_tcb定義為struct tn_os_tcb型別的變數,接著定義陣列__gtcbtasks,其元素為tn_os_tcb型別資料,陣列有tn_os_max_tasks個元素。
os初始化
static data tn_os_task_handle __gthtaskcur;
//當前任務控制代碼
void
tnosinit
(void
)//初始化任務控制塊
__gthtaskcur = o;
//初始任務號為0
}
建立任務tn_os_task_handle tnostaskcreate (
void
(* pfunctask)
(void
)//指向任務函式的函式指標
idata unsigned
char
* pucstk //指向任務堆疊棧頂的指標 )
}return—l;
}
(1)申請乙個空白tcb
如果tcb中沒有空閒的tcb表項,可想而知使用者不能建立任務。因此,必須先搜尋tcb,看是否有空閒的tcb表項。如果有,則將它分配給新任務,同時系統為新任務賦予其唯一的任務控制代碼thrt。其示例如下:
for
(thrt = o;thrt}
(2)填充tcb
首先儲存新任務的上下文,然後將搜尋到的tcb設定為就緒狀態,也就是說,將相應的任務設定為就緒狀態﹐其返回值為就緒任務的任務控制代碼thrt。
本來填充任務的上下文需要在任務執行後呼叫setjmp()函式來完成,但由於此時任務並未執行,不可能呼叫setjmp(),所以只能用另乙個函式來模擬任務執行時setjmp()的呼叫,這個函式就是settaskjmp。其示例如下:
settaskjmp
(pfunctask,pucstk,__gtcbtasks[thrt]
.jbtaskcontext)
;_gtcbtasks[thrt]
.uctaskstat==__tn_task_***_rdy;
return thrt;
一般來說,rtos都會建立乙個優先順序最低的空閒任務(系統任務)。為了節省片內ram,在規劃tinyos51時,就決定使用排程器來完成空閒任務的工作。
在啟動多工環境之前,作業系統至少需要建立乙個使用者任務。當啟動多工環境之後,多工環境以及建立,即可以建立新的任務了。
假設tn_os_max_tasks為2,則thrt的有效值為0、1和-1。如果沒有空閒的tcb,則建立任務失敗,即任務控制代碼為-1.
啟動多工環境
對於單cpu系統來說,其微觀上同時只有乙個任務在執行,因此啟動作業系統就是執行第乙個使用者任務。只有當使用者任務執行起來後﹐才能表明多工環境已經建立。
在作業系統中執行第乙個使用者任務的過程稱為啟動多工環境。由於使用者建立的第乙個任務的控制代碼為0﹐所以系統開始執行控制代碼為0的任務。tinyos51是通過呼叫tn(sstart()函式來實現的,由longjmp()函式執行控制代碼為о的任務.
//啟動os
void tnosstart (
void
)
任務切換
1、保持當前任務的上下文,並恢復需要執行任務的上下文的過程
2、如果任務處於就緒狀態,則將當前正在執行的任務的上下文儲存到該任務的tcb中,然後再從相應的tcb中恢復下乙個將要執行的任務的上下文。
3、如果所有任務都未處於就緒狀態﹐則等待本任務直到就緒為止,相當於一般作業系統的空閒任務。這就是任務切換的設計思想。
tiny()s51的任務切換功能就是通過呼叫tnossched()函式來實現的。
for
(thtask =
0;thtask(__gtcbtasks[thtmp2]
.uctaskstat &_tn_task_***_rdy)!=0
)return
;//如果ctmpl=1,返回函式
}//如果所有任務都未就緒,則等待本任務就緒,相當於一般作業系統的空閒任務
puct***=
(volatile data char*)
&(_gtcbtasks[thtmp2]
.uctaskstat))
;while
(*puct***&
.__tn_task_***_rdy)--0
)}
如果沒有任務則mcu邊執行空閒任務。
由於tiny(s51沒有建立空閒任務﹐當所有任務都未處於就緒狀態時,搜尋不到下乙個將要執行的任務。此時tinyos51需要等待當前任務處於就緒狀態時才退出﹐從而實現空閒任務的作用(程式清單5.21(117~119))。而事實上.只有當所有任務都被刪除時,才搜尋不到下乙個將要執行的任務,因此,使用者必須避免這種情況的出現。
刪除任務
為了減輕作業系統的負擔,將不需要執行的任務刪除是很有必要的。只要將任務控制代碼告訴刪除任務(delete task)函式﹐即可將對應的任務刪除。不僅可以在別的任務中刪除不需要執行的任務,而且還可以刪除自身。
如果刪除其他任務﹐則只要將任務設定為不可執行狀態即可;如果刪除自身,不但要將任務設定為不可執行狀態,而且還要將cpu的控制權交給另乙個可執行的任務,即進行任務切換。既然自身已經被刪除,那麼任務也就不能執行了,當然需要執行下乙個可執行的任務。
tiny(s51刪除任務的功能是通過呼叫tnostaskdel()函式來實現的,詳見程式清單5.22。
作業系統的排程演算法主要為三類:時間片輪詢、優先順序、帶優先順序的時間片輪詢排程演算法。
不是任務主動放棄cpu而造成任務排程的就是搶占式任務排程。
時鐘節拍中斷:即每次分配給任務的時鐘節拍數都是乙個時鐘節拍。
C OS 任務控制塊
c os 是通過任務控制塊來管理任務的。任務控制塊是乙個基於鍊錶的資料結構,任務控制塊主要用於記錄任務的堆疊棧頂指標 指向下乙個任務控制塊的指標 任務等待的延遲時間 任務的當前狀態標誌與任務的優先級別等一些與任務管理有關的屬性。當任務的cpu使用權被剝奪時,c os 用任務控制塊來儲存該任務的狀態,...
uC OS ll 任務 任務控制塊 任務控制鍊錶
第二章 2.1任務 又稱為執行緒 組成部分 任務程式 任務堆疊 任務控制塊 分類 使用者任務 解決應用問題 系統任務 為應用程式提供服務 uc os ll在管理任務時將每個任務作為乙個節點,鏈結成任務鍊錶,最多可對64個任務進行管理。狀態 典型地 每個任務都是乙個無限的迴圈。每個任務都處在以下5種狀...
機器學習入門(一)初步認識了解神經網路
閱讀內容來自全英文,但是閱讀難度不高。文風比較隨性,不是很嚴謹,個人隨筆向,不太好翻譯的詞都採用了英文,大家看看就好,不要噴我,hh 愛你們,麼麼噠 3 第一章 建立神經網路識別數字 1.1 perceptrons perceptrons,感知機,20世紀60年代由frank rosenblatt在...