ucOS-II最詳細的解釋_第1頁
ucOS-II最詳細的解釋_第2頁
ucOS-II最詳細的解釋_第3頁
ucOS-II最詳細的解釋_第4頁
ucOS-II最詳細的解釋_第5頁
已閱讀5頁,還剩83頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

μC/OS-IIFLTCHμC/OS-IIμC/OS-II是一種可移植的,可植入ROM的,可裁剪的,搶占式的,實時多任務操作系統內核。它被廣泛應用于微處理器、微控制器和數字信號處理器。μC/OS-II的前身是μC/OS,是專門為計算機的嵌入式應用設計的。FLTCH主要內容1.計算機操作系統的基本概念2.操作系統中常用的數據結構3.并發操作系統的概念4.任務的要素5.uC/OS-II的任務調度6.uC/OS-II的中斷和時鐘7.uC/OS-II任務的同步與通信8.uC/OS-II的儲存管理FLTCH計算機操作系統的基本概念FLTCH計算機操作系統的基本概念什么是計算機操作系統?操作系統是一種為應用程序提供服務的系統軟件,是一個完整計算機系統的有機組成部分。從層次來看,操作系統位于計算機硬件之上,應用軟件之下。所以也把它叫做應用軟件的運行平臺。FLTCH計算機操作系統的作用它在計算機應用程序與計算機硬件系統之間,屏蔽了計算機硬件工作的一些細節,并對系統中的資源進行有效的管理。通過提供函數(應用程序接口(API)),從而使應用程序的設計人員得以在一個友好的平臺上進行應用程序的設計和開發,大大地提高了應用程序的開發效率。從用戶的角度來看,它就是一大堆函數(API和系統函數),用戶可以調用(普通調用或系統調用)它們來對系統資源進行操作。計算機硬件用匯編語言編寫的硬件抽象層高級語言的接口應用軟件操作系統FLTCHAPI什么是API?API(ApplicationProgrammingInterface,應用程序編程接口)是一些預先定義的函數,目的是提供應用程序與開發人員基于某軟件或硬件的以訪問一組例程的能力,而又無需訪問源碼,或理解內部工作機制的細節。FLTCH計算機操作系統的功能操作系統任務的管理存儲管理I/O設備管理網絡通信管理處理器管理FLTCH操作系統中經常用到的數據結構FLTCH操作系統中經常用到得數據結構(數組)。數組1。同一數據類型數據的集合;2。占用連續內存空間;3。其中的所有元素名稱都相同,但每個元素都有一個編號;4。元素名去掉編號(下標),得到的是數組名,數組名是個指針。inta[10]a[0]a[1]a[2]a[3]a[9]……aa+1a+2a+3a+9指針數組FLTCH操作系統中經常用到得數據結構(位圖)a[0]a[1]a[2]a[3]a[9]……1/0D7D6D5D4D3D2D1D0a+2aa+1a+3a+9…

a[10],可以記錄80個事物的狀態)位圖:是數組的一種特殊應用。FLTCH操作系統中經常用到得數據結構(結構)structStudent{

intage;char*name;charsex;};結構:結構體(struct)是由一系列具有相同類型或不同類型的數據構成的數據集合,也叫結構。

FLTCH

結構體FLTCH1、概述在實際應用有不少問題中只采用已學的變量和數組作為數據結構顯得很不方便例:輸入100個學生的學號、姓名和考試成績,編寫程序找出高分者和低分者。用變量和數組作數據結構可編寫程序如下:FLTCHmain(){inti,num,maxnum,minnum;charname[20],maxname[20],minname[20];intscore,maxscore,minscore;maxscore=0;minscore=100;for(i=1;i<=100;i++){scanf(“%d%s%d”,&num,name,&score);if(score>maxscore){maxscore=score;maxnum=num;strcpy(maxname,name);}if(score<minscore){minscore=score;minnum=num;strcpy(minname,name);}

}

printf(“%d%d”,maxnum,maxscore);

printf(“%d%d”,minnum,minscore);}FLTCH明顯缺點:①變量過多,同一學生的各個數據無聯系,沒有整體概念,不便管理。②操作不便(如更新過程)。顯然,選用一種能把一個學生的數據構造成一個整體的構造型數據結構更合適,但不能是數組。對于這種情況,可以將一個學生的數據定義為一個結構體類型:

FLTCHstructstudent類型名{intnum;

charname[20];intscore;};定義了一個結構體類型,它包含三個成員。成員表,這里有三個成員FLTCH2、定義結構體類型變量的方法

前面定義的結構體類型只是一種“模型”,還必須定義結構體變量后才能存放數據。定義結構體變量有三種方法:1、先定義結構體類型再定義結構體變量定義了結構體類型后:

structstudentst,stmax,stmin;

類型符變量名

定義了三個結構體變量,每個變量包含三個成員,每個變量可存放一個學生的數據。FLTCH2、在定義結構體類型的同時定義結構體變量

structstudent{intnum;charname[20];intscore;}st,stmax,stmin;FLTCH3、直接定義結構體類型變量

struct不出現類型名

{intnum;charname[20];intscore;}st,stmax,stmin;常用第一種方法FLTCH說明:①類型與變量不同,只對變量分配空間與操作。②對成員可以單獨使用,相當于普通變量。③成員也可以是一個結構體變量。

structdatestructstudent{intmonth;{intnum;intday;charname[20];intyear;structdatebirthday;};}st1,st2;

結構體里成員又是結構體變量④成員名可以與程序中的變量名相同,兩者代表不同的對象。FLTCH3、結構體變量的引用

■成員引用可以對成員單獨引用,形式為:結構體變量名.

成員名

成員運算符st.num=1001;st.score=90;strcpy(,“Li”);printf(“%d%s%d”,st.num,,st.score);scanf(“%d%s%d”,&st.num,,&st.score);可以引用成員的地址FLTCH如果成員本身又屬一個結構體類型,則要用若干個成員運算符,一級一級地找到最低一級的成員,只能對最低級的成員進行存取與運算。structdatestructstudent{intmonth;{intnum;intday;charname[20];intyear;structdatebirthday;};}st1,st2;st1.birthday.year=1960;st1.birthday.month=5;st1.birthday.day=15;FLTCH■整體引用可以對結構體變量進行整體賦值:stmax=st;將st中的所有內容賦值給stmax。對結構體變量的整體操作只限于賦值操作和參數傳遞,而且要求類型一致。不能對結構體變量進行整體輸入輸出。FLTCH結構體應用舉例:編寫程序輸入100個學生的學號、姓名和考試成績,找出高分者和低分者。

structstudent{intnum;charname[20];intscore;};FLTCHmain(){inti;structstudentst,stmax,stmin;stmax.score=0;stmin.score=100;for(i=1;i<=100;i++){scanf(“%d%s%d”,&st.num,,&st.score);if(st.score>stmax.score)stmax=st;if(st.score<stmin.score)stmin=st;}printf(“\n%5d%15s%5d”,stmax.num,,stmax.score);printf(“\n%5d%15s%5d”,stmin.num,,stmin.score);}FLTCH4、結構體變量的初始化對結構體變量可以在定義時指定初始值structstudent{intnum;charname[20];intscore;};structstudentst={1001,”wang”,95};FLTCH5、結構體數組

可以定義結構體數組來存放批量數據。■結構體數組的定義

structstudent{intnum;charname[20];intscore;};structstudenta[100];

定義a數組,可以存放100個學生的數據。

a數組的每個元素又是一個結構體變量。FLTCH■結構體數組的初始化在定義結構體數組的同時指定初值。

structstudent{intnum;charname[20];intscore;};

structstudenta[2]={{1001,”LiLi”,85},{1002,”wang”,90}};FLTCH或structstudent{intnum;charname[20];intscore;}a[2]={{1001,”LiLi”,85},{1002,”wang”,90}};FLTCH

■結構體數組元素的引用成員引用:

a[0].num=1001;strcpy(a[0].name,”wang”);a[0].score=85;

整體引用:

a[1]=a[0];與普通數組元素的引用相同

■結構體數組的應用輸入100個學生的學號、姓名和考試成績,然后按從高分到低分的順序排列后輸出。FLTCHstructstudent{intnum;charname[20];intscore;};main(){inti,j;structstudenta[100],t;for(i=0;i<100;i++)scanf(“%d%s%d”,&a[i].num,a[i].name,&a[i].score);FLTCH

for(i=0;i<99;i++){for(j=i+1;j<100;j++)if(a[i].score<a[j].score){t=a[i];a[i]=a[j];a[j]=t;}整體引用}for(i=0;i<100;i++)printf(“\n%5d%15s%5d”,a[i].num,a[i].name,a[i].score);}FLTCH6、指向結構體類型數據的指針

■指向結構體類型變量的指針

structstudentst,st1;

structstudent*p;p=&st;

指向st

定義指向結構體類型數據的指針變量pFLTCH通過指針變量引用結構體變量:①成員引用(*p).num=1001;或

p->num=1001;(*p).score=85;或

p->score=85;strcpy((*p).name,“wang”);

strcpy(p->name,“wang”);②整體引用st1=*p;等效于

st1=st;FLTCH■指向結構體數組的指針

structstudenta[100];

structstudent*p;p=a;

通過指針變量引用結構體數組元素:①成員引用

(*p).num=1001;或

p->num=1001;(*p).score=85;或

p->score=85;strcpy((*p).name,”wang”);

或strcpy(p->name,”wang”);FLTCH

一般地:(*(p+i)).num=1001;或

(p+i)->num=1001;(*(p+i)).score=85;或

(p+i)->score=85;strcpy((*(p+i)).name,”wang”);

strcpy((p+i)->name,”wang”);也可以用下標法:p[i].num=1001;p和a是等價的,就好比a[i].num=1001;②整體引用*(p+1)=*(p+0);或p[1]=p[0];FLTCH■用結構體變量和指向結構體的指針作函數參數用結構體變量作函數參數時,對應的實參應該是同類型的結構體變量(或數組元素),參數傳遞是“值傳遞”。用指向結構體的指針作函數參數時,對應的實參應該是同類型的結構體變量的地址(或數組的地址),參數傳遞是“地址傳遞”。FLTCHmain(){structstudentst={1001,”LiLi”,70};f(st);printf(“\n%5d%10s%5d”,st.num,,st.score);}f(structstudenta){a.score=90;printf(“\n%5d%10s%5d”,a.num,,a.score);}1001LiLi70sta1001LiLi90FLTCHmain(){structstudentst={1001,”LiLi”,70};f(&st);

printf(“\n%5d%10s%5d”,st.num,,st.score);}f(structstudent*a){a->score=90;

printf(“\n%5d%10s%5d”,a->num,a->name,a>score);}通過指針變量a可以訪問它所指向的結構體。

1001LiLi70st2000aFLTCH7、用指針處理鏈表

■鏈表概述鏈表是一種重要的數據結構─動態數據結構。以具體例子來說明鏈表的概念及其應用:例:選擇合適的數據結構來存放一批學生的學號及考試成績,以便進一步處理。由于學生人數未知,用靜態數據結構不合適。用鏈表處理較恰當。FLTCH用鏈表處理該問題的基本思路:將各學生的數據進行離散存放,來一個學生就分配一小塊內存(結點)。并將各結點用指針依次連接起來─鏈表。

每結點應包含下一結點的開始地址。最后一個結點中的指針為空。鏈頭指針指向第一個結點,是訪問鏈表的重要依據。這樣的鏈表稱單向鏈表。

head學號成績指針學號成績指針學號成績指針學號成績指針學號成績NULLFLTCH一個結點可用如下結構體描述:typedefstructstudent{intnum;學號

intscore;成績

structstudent*next;下一結點的首地址}STU;typedef:自定義類型符FLTCH

■單向鏈表的建立①輸入一個學生的數據。②分配結點空間,數據存入。③將該結點的首地址賦給上一結點的next,若該結點是第一個結點,則賦給頭指針。④將該結點的next置為空,表示該結點為當前的最后結點。head學號成績next學號成績next學號成績next學號成績NULL學號成績nextFLTCHSTU*creat(){STUst,*p0=NULL,*p,*head=NULL;while(1){scanf("%d%d",&st.num,&st.score);if(st.num<0)break;p=malloc(sizeof(STU));*p=st;(*p).next=NULL;if(p0==NULL)head=p;p0為前一結點的指針

else(*p0).next=p;p0=p;}returnhead;}學號成績next學號成績nexthead學號成績NULLFLTCH■單向鏈表的訪問以輸出為例①通過頭指針找到第一個結點.②輸出當前結點的內容,并通過next找到后繼結點,┄┄,直到next為空.FLTCHvoidoutput(STU*head){STU*p=head;while(p){printf("\n%d%d",(*p).num,(*p).score);p=(*p).next;}}head學號成績next學號成績next學號成績NULL學號成績nextFLTCH■刪除結點操作①按鏈表的訪問方法找到相應結點。②若該結點是第一個結點,則將后繼結點指針賦給頭指針。若該結點是最后一個結點,則將前綴結點的next置為空。若該結點是中間結點,則將后繼結點指針賦給前綴結點的next。③釋放該結點所占的內存單元。head學號成績next學號成績next學號成績NULL學號成績nextFLTCHSTU*delete(STU*head,intnumber){STU*p=head,*p0=NULL;while(p){if((*p).num==number){ if(p==head)head=(*p).next; elseif((*p).next==NULL)(*p0).next=NULL; else(*p0).next=(*p).next; free(p);break;}else{p0=p;p=(*p).next;}}returnhead;}假定要刪除某一指定學號的結點

FLTCH■插入操作

假定將結點p插入到結點p0的后面,則插入操作的關鍵為:

p->next=p0->next;p0->next=p;head學號成績next學號成績next學號成績next學號成績NULLFLTCH操作系統中經常使用的數據結構(鏈表)structStudent{Student*nextintage;char*name;charsex;};nextnext兩個元素的鏈表1。同數據類型數據的集合;2。不占用連續內存空間。使用上的特點:1。分類存放,但空間上不連續(不需要大量的連續存儲空間);2。檢索速度慢,且耗費的時間不固定;應用:存放大量的較大的表,類似檔案柜FLTCH操作系統中經常使用的數據結構(隊列)按照先進先出的規則組織的數據結構可以用數組也可以用鏈表來實現主要用于對象的排隊FLTCH操作系統中經常使用的數據結構(堆棧)按照先進后出規則組織的數據結構主要用數組來實現主要用于程序模塊的嵌套運行FLTCH在ucos-ii中,每個任務可以有5種狀態,在任一時刻,任務的狀態一定是這5種狀態之一。等待或掛起就緒休眠中斷服務運行↓←→→←←→收到消息,掛起時間到刪除任務任務調度中斷創建任務中斷結束FLTCH1、單次執行類任務創建單次執行類任務運行刪除↘↘voidMyTask(void*pdata){

}進行準備工作的代碼;任務實體代碼;調用任務刪除函數;定義和初始化變量及硬件設備完成該任務的具體功能將自己刪除,操作系統將不再管理它→→→FLTCH2、周期執行類任務就緒執行等待↙↙↙voidMyTask(*pdata){while(1){}}進行準備工作的代碼;任務實體代碼;調用延時函數;FLTCH3、事件觸發類任務運行等待就緒運行↓↓↓消息VoidMyTask(void*pdata){while(1){}}進行準備工作的代碼;調用獲取事件的函數;任務實體代碼;FLTCH系統函數概述1、配對性原則對ucos-ii來說,大多數API都是成對的,而且一部分必須成對使用。OSFlagCreat();建立事件標志組OSFlagDel();刪除事件標志組OSSemCreat();建立信號量OSSemDel();刪除信號量FLTCHFLTCH什么是多任務系統?簡單的說,就是能用一個處理器并發(不是同時)地運行多個程序的計算機管理系統。并發:由同一個處理器輪換地運行多個程序。或者說是由多個程序輪班地占用處理器這個資源。且在占用這個資源期間,并不一定能夠把程序運行完畢。并發過程示意圖處理器如何進行程序的切換?FLTCH程序的切換(兩句話)處理器是個傻瓜,PC讓它干啥,它就干啥。PC是個指路器,它指向哪兒,處理器就去哪兒。從此可以知道,哪個程序占有了PC,哪個程序就占有了處理器。深刻地理解PC是理解系統進行程序切換動作的關鍵。FLTCH如何操作PC所謂切換PC←目標地址指令:不同計算機類型的指令是不同的1、數據傳輸指令2、子程序返回指令(由堆棧彈出)3、中斷服務程序返回指令(由堆棧彈出)系統是通過把待運行程序的地址賦予程序計數器PC來實現程序的切換的。FLTCH任務代碼任務堆棧內存處理器PCSP處理器通過兩個指針寄存器(PC和SP)來與任務代碼和任務堆棧建立聯系并運行它寄存器組程序運行環境運行環境包括了兩部分:處理器中的運行環境和內存中的運行環境程序運行時與處理器之間的關系FLTCH任務代碼任務堆棧內存處理器PCSP任務代碼任務堆棧內存任務代碼任務堆棧內存?當有多個任務時,處理器中的運行環境應該怎么辦?寄存器組程序運行環境多任務時的問題FLTCH程序虛擬處理器PCSP虛擬處理器PCSP虛擬處理器PCSP虛擬處理器PCSP調度器程序處理器PCSP在內存中為每個任務創建一個虛擬的處理器(處理器部分的運行環境由操作系統的調度器按某種規則來進行這兩個復制工作復制當需要運行某個任務時就把該任務的虛擬處理器復制到實際處理器中復制當需要中止當前任務時,則把任務對應的虛擬處理器復制到內存復制再把另一個需要運行的任務的虛擬處理器復制到實際處理器中寄存器組寄存器組也就是說,任務的切換是任務運行環境的切換多任務時任務與處理器之間關系的處理FLTCH

μC/OS-II中 的任務管理FLTCH任務的狀態及其轉換正在運行的任務,需要等待一段時間或需要等待一個事件發生再運行時,該任務就會把CPU的使用權讓給別的任務而使任務進入等待狀態。任務在沒有被配備任務控制塊或被剝奪了任務控制塊時的狀態叫做任務的睡眠狀態

系統為任務配備了任務控制塊且在任務就緒表中進行了就緒登記,這時任務的狀態叫做就緒狀態。

處于就緒狀態的任務如果經調度器判斷獲得了CPU的使用權,則任務就進入運行狀態

一個正在運行的任務一旦響應中斷申請就會中止運行而去執行中斷服務程序,這時任務的狀態叫做中斷服務狀態

FLTCH前面談到,一個任務的任務控制塊的主要作用就是保存該任務的虛擬處理器的堆棧指針寄存器SP。其實,隨著任務管理工作的復雜性的提高,它還應該保存一些其他信息。任務控制塊—任務在系統中的身份證

由于系統存在著多個任務,于是系統如何來識別并管理一個任務就是一個需要解決的問題。識別一個任務的最直接的辦法是為每一個任務起一個名稱。由于μC/OS-II中的任務都有一個惟一的優先級別,因此μC/OS-II是用任務的優先級來作為任務的標識的。所以,任務控制塊還要來保存該任務的優先級別。另外,前面也談到,一個任務在不同的時刻還處于不同的狀態,顯然,記錄了任務狀態的數據也應該保存到任務控制塊中。基于上述原因,系統必須為每個任務創建一個保存與該任務有關的相關信息的數據結構,這個數據結構就叫做該任務的任務控制塊(TCB)。任務控制塊結構的主要成員typedefstructos_tcb{

OS_STK*OSTCBStkPtr; //指向任務堆棧棧頂的指針

……

INT8U OSTCBStat; //任務的當前狀態標志

INT8U OSTCBPrio; //任務的優先級別

……}OS_TCB;

任務控制塊是不是像我們人在一個國家中的身份證?(其實,系統中的所有資源都應該有身份證。)FLTCH一旦任務建立,一個任務控制塊OS_TCB就被賦值。任務控制塊是一個數據結構,當任務的cpu使用權被剝奪時,ucos-II用它來保存該任務的狀態。當任務重新得到cpu使用權時,任務控制塊能確保任務從當時被中斷的那一點絲毫不差的繼續執行。OS_TCB全部駐留在RAM中。FLTCH任務在內存中的結構FLTCH用戶任務代碼的一般結構

voidMyTask(void*pdata){for(;;){

可以被中斷的用戶代碼;

OS_ENTER_CRITICAL();//進入臨界段(關中斷)

不可以被中斷的用戶代碼;

OS_EXIT_CRITICAL(); //退出臨界段(開中斷)

可以被中斷的用戶代碼;

}}臨界段無限循環于是可以這樣說,μC/OS-II任務的代碼結構是一個可以帶有臨界段的無限循環。

FLTCH系統提供的另一個任務

——統計任務μC/OS-II提供的另一個系統任務是統計任務OSTaskStat()。這個統計任務每秒計算一次CPU在單位時間內被使用的時間,并把計算結果以百分比的形式存放在變量OSCPUsage中,以便應用程序通過訪問它來了解CPU的利用率,所以這個系統任務OSTaskStat()叫做統計任務

FLTCH

任務的優先權及優先級別

μC/OS_II把任務的優先權分為64個優先級別,每一個級別都用一個數字來表示。數字0表示任務的優先級別最高,數字越大則表示任務的優先級別越低

用戶可以根據應用程序的需要,在文件OS_CFG.H中通過給表示最低優先級別的常數OS_LOWEST_PRIO賦值的方法,來說明應用程序中任務優先級別的數目。該常數一旦被定義,則意味著系統中可供使用的優先級別為:0,1,2,……,OS_LOWEST_PRIO,共OS_LOWEST_PRIO+1個

固定地,系統總是把最低優先級別OS_LOWEST_PRIO自動賦給空閑任務。如果應用程序中還使用了統計任務,系統則會把優先級別OS_LOWEST_PRIO-1自動賦給統計任務,因此用戶任務可以使用的優先級別是:0,1,2…OS_LOWEST_PRIO-2,共OS_LOWEST_PRIO-1個

FLTCH

任務堆棧

保存CPU寄存器中的內容及存儲任務私有數據的需要,每個任務都應該配有自己的堆棧,任務堆棧是任務的重要的組成部分在應用程序中定義任務堆棧的棧區非常簡單,即定義一個OS_STK類型的一個數組并在創建一個任務時把這個數組的地址賦給該任務就可以了。例如:

//定義堆棧的長度#define TASK_STK_SIZE 512//定義一個數組來作為任務堆棧OS_STKTaskStk[TASK_STK_SIZE]; typedefunsignedintOS_STK;//這是系統定義的一個數據類型voidmain(void){ …… OSTaskCreate( MyTask, //任務的指針

&MyTaskAgu, //傳遞給任務的參數

&MyTaskStk[MyTaskStkN-1],//任務堆棧棧頂地址

20 //任務的優先級別

); ……}在創建用戶任務時,要傳遞任務的堆棧指針和任務優先級別使用函數OSTaskCreate()創建任務時,一定要注意所使用的處理器對堆棧增長方向的支持是向上的還是向下的

FLTCH任務堆棧的初始化

應用程序在創建一個新任務的時候,必須把在系統啟動這個任務時CPU各寄存器所需要的初始數據(任務指針、任務堆棧指針、程序狀態字等等),事先存放在任務的堆棧中

μC/OS-II在創建任務函數OSTaskCreate()中通過調用任務堆棧初始化函數OSTaskStkInit()來完成任務堆棧初始化工作的

它的原型如下:

OS_STK*OSTaskStkInit( void(*task)(void*pd), void*pdato, OS_STK*ptos, INT16Uopt );由于各種處理器的寄存器及對堆棧的操作方式不盡相同,因此該函數需要用戶在進行μC/OS-II的移植時,按所使用的處理器由用戶來編寫。實現這個函數的具體細節,將在本書有關μC/OS-II移植的章節中做進一步的介紹

其實,任務堆棧的初始化就是對該任務的虛擬處理器的初始化(復位)。

FLTCH任務控制塊 (OS_TCB)

及任務控制塊鏈表

μC/OS-II用來記錄任務的堆棧指針、任務的當前狀態、任務的優先級別等一些與任務管理有關的屬性的表就叫做任務控制塊

任務控制塊就相當于是一個任務的身份證,沒有任務控制塊的任務是不能被系統承認和管理的

任務控制塊結構的主要成員typedefstructos_tcb{

OS_STK*OSTCBStkPtr;//指向任務堆棧棧頂的指針

……

structos_tcb*OSTCBNext;//指向后一個任務控制塊的指針

structos_tcb*OSTCBPrev;

//指向前一個任務控制塊的指針

……

INT16U OSTCBDly; //任務等待的時限(節拍數)

INT8U OSTCBStat; //任務的當前狀態標志

INT8U OSTCBPrio; //任務的優先級別

……}OS_TCB;任務控制塊鏈表空任務控制塊鏈表當應用程序調用函數OSTaskCreate()創建一個任務時,這個函數會調用系統函數OSTCBInit()來為任務控制塊進行初始化。這個函數首先為被創建任務從空任務控制塊鏈表獲取一個任務控制塊,然后用任務的屬性對任務控制塊各個成員進行賦值,最后再把這個任務控制塊鏈入到任務控制塊鏈表的頭部

當進行系統初始化時,初始化函數會按用戶提供的任務數為系統創建具有相應數量的任務控制塊并把它們鏈接為一個鏈表。 由于這些任務控制塊還沒有對應的任務,故這個鏈表叫做空任務塊鏈表。即相當于是一些空白的身份證。

FLTCH 任務就緒表 及 任務調度

多任務操作系統的核心工作就是任務調度。所謂調度,就是通過一個算法在多個任務中確定該運行的任務,做這項工作的函數就叫做調度器。

μC/OS_II進行任務調度的思想是“近似地每時每刻總是讓優先級最高

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論