版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
μC/OS-IIFLTCHμC/OS-IIμC/OS-II是一種可移植的,可植入ROM的,可裁剪的,搶占式的,實(shí)時(shí)多任務(wù)操作系統(tǒng)內(nèi)核。它被廣泛應(yīng)用于微處理器、微控制器和數(shù)字信號(hào)處理器。μC/OS-II的前身是μC/OS,是專(zhuān)門(mén)為計(jì)算機(jī)的嵌入式應(yīng)用設(shè)計(jì)的。FLTCH主要內(nèi)容1.計(jì)算機(jī)操作系統(tǒng)的基本概念2.操作系統(tǒng)中常用的數(shù)據(jù)結(jié)構(gòu)3.并發(fā)操作系統(tǒng)的概念4.任務(wù)的要素5.uC/OS-II的任務(wù)調(diào)度6.uC/OS-II的中斷和時(shí)鐘7.uC/OS-II任務(wù)的同步與通信8.uC/OS-II的儲(chǔ)存管理FLTCH計(jì)算機(jī)操作系統(tǒng)的基本概念FLTCH計(jì)算機(jī)操作系統(tǒng)的基本概念什么是計(jì)算機(jī)操作系統(tǒng)?操作系統(tǒng)是一種為應(yīng)用程序提供服務(wù)的系統(tǒng)軟件,是一個(gè)完整計(jì)算機(jī)系統(tǒng)的有機(jī)組成部分。從層次來(lái)看,操作系統(tǒng)位于計(jì)算機(jī)硬件之上,應(yīng)用軟件之下。所以也把它叫做應(yīng)用軟件的運(yùn)行平臺(tái)。FLTCH計(jì)算機(jī)操作系統(tǒng)的作用它在計(jì)算機(jī)應(yīng)用程序與計(jì)算機(jī)硬件系統(tǒng)之間,屏蔽了計(jì)算機(jī)硬件工作的一些細(xì)節(jié),并對(duì)系統(tǒng)中的資源進(jìn)行有效的管理。通過(guò)提供函數(shù)(應(yīng)用程序接口(API)),從而使應(yīng)用程序的設(shè)計(jì)人員得以在一個(gè)友好的平臺(tái)上進(jìn)行應(yīng)用程序的設(shè)計(jì)和開(kāi)發(fā),大大地提高了應(yīng)用程序的開(kāi)發(fā)效率。從用戶(hù)的角度來(lái)看,它就是一大堆函數(shù)(API和系統(tǒng)函數(shù)),用戶(hù)可以調(diào)用(普通調(diào)用或系統(tǒng)調(diào)用)它們來(lái)對(duì)系統(tǒng)資源進(jìn)行操作。計(jì)算機(jī)硬件用匯編語(yǔ)言編寫(xiě)的硬件抽象層高級(jí)語(yǔ)言的接口應(yīng)用軟件操作系統(tǒng)FLTCHAPI什么是API?API(ApplicationProgrammingInterface,應(yīng)用程序編程接口)是一些預(yù)先定義的函數(shù),目的是提供應(yīng)用程序與開(kāi)發(fā)人員基于某軟件或硬件的以訪(fǎng)問(wèn)一組例程的能力,而又無(wú)需訪(fǎng)問(wèn)源碼,或理解內(nèi)部工作機(jī)制的細(xì)節(jié)。FLTCH計(jì)算機(jī)操作系統(tǒng)的功能操作系統(tǒng)任務(wù)的管理存儲(chǔ)管理I/O設(shè)備管理網(wǎng)絡(luò)通信管理處理器管理FLTCH操作系統(tǒng)中經(jīng)常用到的數(shù)據(jù)結(jié)構(gòu)FLTCH操作系統(tǒng)中經(jīng)常用到得數(shù)據(jù)結(jié)構(gòu)(數(shù)組)。數(shù)組1。同一數(shù)據(jù)類(lèi)型數(shù)據(jù)的集合;2。占用連續(xù)內(nèi)存空間;3。其中的所有元素名稱(chēng)都相同,但每個(gè)元素都有一個(gè)編號(hào);4。元素名去掉編號(hào)(下標(biāo)),得到的是數(shù)組名,數(shù)組名是個(gè)指針。inta[10]a[0]a[1]a[2]a[3]a[9]……aa+1a+2a+3a+9指針數(shù)組FLTCH操作系統(tǒng)中經(jīng)常用到得數(shù)據(jù)結(jié)構(gòu)(位圖)a[0]a[1]a[2]a[3]a[9]……1/0D7D6D5D4D3D2D1D0a+2aa+1a+3a+9…
a[10],可以記錄80個(gè)事物的狀態(tài))位圖:是數(shù)組的一種特殊應(yīng)用。FLTCH操作系統(tǒng)中經(jīng)常用到得數(shù)據(jù)結(jié)構(gòu)(結(jié)構(gòu))structStudent{
intage;char*name;charsex;};結(jié)構(gòu):結(jié)構(gòu)體(struct)是由一系列具有相同類(lèi)型或不同類(lèi)型的數(shù)據(jù)構(gòu)成的數(shù)據(jù)集合,也叫結(jié)構(gòu)。
FLTCH
結(jié)構(gòu)體FLTCH1、概述在實(shí)際應(yīng)用有不少問(wèn)題中只采用已學(xué)的變量和數(shù)組作為數(shù)據(jù)結(jié)構(gòu)顯得很不方便例:輸入100個(gè)學(xué)生的學(xué)號(hào)、姓名和考試成績(jī),編寫(xiě)程序找出高分者和低分者。用變量和數(shù)組作數(shù)據(jù)結(jié)構(gòu)可編寫(xiě)程序如下: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明顯缺點(diǎn):①變量過(guò)多,同一學(xué)生的各個(gè)數(shù)據(jù)無(wú)聯(lián)系,沒(méi)有整體概念,不便管理。②操作不便(如更新過(guò)程)。顯然,選用一種能把一個(gè)學(xué)生的數(shù)據(jù)構(gòu)造成一個(gè)整體的構(gòu)造型數(shù)據(jù)結(jié)構(gòu)更合適,但不能是數(shù)組。對(duì)于這種情況,可以將一個(gè)學(xué)生的數(shù)據(jù)定義為一個(gè)結(jié)構(gòu)體類(lèi)型:
FLTCHstructstudent類(lèi)型名{intnum;
charname[20];intscore;};定義了一個(gè)結(jié)構(gòu)體類(lèi)型,它包含三個(gè)成員。成員表,這里有三個(gè)成員FLTCH2、定義結(jié)構(gòu)體類(lèi)型變量的方法
前面定義的結(jié)構(gòu)體類(lèi)型只是一種“模型”,還必須定義結(jié)構(gòu)體變量后才能存放數(shù)據(jù)。定義結(jié)構(gòu)體變量有三種方法:1、先定義結(jié)構(gòu)體類(lèi)型再定義結(jié)構(gòu)體變量定義了結(jié)構(gòu)體類(lèi)型后:
structstudentst,stmax,stmin;
類(lèi)型符變量名
定義了三個(gè)結(jié)構(gòu)體變量,每個(gè)變量包含三個(gè)成員,每個(gè)變量可存放一個(gè)學(xué)生的數(shù)據(jù)。FLTCH2、在定義結(jié)構(gòu)體類(lèi)型的同時(shí)定義結(jié)構(gòu)體變量
structstudent{intnum;charname[20];intscore;}st,stmax,stmin;FLTCH3、直接定義結(jié)構(gòu)體類(lèi)型變量
struct不出現(xiàn)類(lèi)型名
{intnum;charname[20];intscore;}st,stmax,stmin;常用第一種方法FLTCH說(shuō)明:①類(lèi)型與變量不同,只對(duì)變量分配空間與操作。②對(duì)成員可以單獨(dú)使用,相當(dāng)于普通變量。③成員也可以是一個(gè)結(jié)構(gòu)體變量。
structdatestructstudent{intmonth;{intnum;intday;charname[20];intyear;structdatebirthday;};}st1,st2;
結(jié)構(gòu)體里成員又是結(jié)構(gòu)體變量④成員名可以與程序中的變量名相同,兩者代表不同的對(duì)象。FLTCH3、結(jié)構(gòu)體變量的引用
■成員引用可以對(duì)成員單獨(dú)引用,形式為:結(jié)構(gòu)體變量名.
成員名
成員運(yùn)算符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如果成員本身又屬一個(gè)結(jié)構(gòu)體類(lèi)型,則要用若干個(gè)成員運(yùn)算符,一級(jí)一級(jí)地找到最低一級(jí)的成員,只能對(duì)最低級(jí)的成員進(jìn)行存取與運(yùn)算。structdatestructstudent{intmonth;{intnum;intday;charname[20];intyear;structdatebirthday;};}st1,st2;st1.birthday.year=1960;st1.birthday.month=5;st1.birthday.day=15;FLTCH■整體引用可以對(duì)結(jié)構(gòu)體變量進(jìn)行整體賦值:stmax=st;將st中的所有內(nèi)容賦值給stmax。對(duì)結(jié)構(gòu)體變量的整體操作只限于賦值操作和參數(shù)傳遞,而且要求類(lèi)型一致。不能對(duì)結(jié)構(gòu)體變量進(jìn)行整體輸入輸出。FLTCH結(jié)構(gòu)體應(yīng)用舉例:編寫(xiě)程序輸入100個(gè)學(xué)生的學(xué)號(hào)、姓名和考試成績(jī),找出高分者和低分者。
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、結(jié)構(gòu)體變量的初始化對(duì)結(jié)構(gòu)體變量可以在定義時(shí)指定初始值structstudent{intnum;charname[20];intscore;};structstudentst={1001,”wang”,95};FLTCH5、結(jié)構(gòu)體數(shù)組
可以定義結(jié)構(gòu)體數(shù)組來(lái)存放批量數(shù)據(jù)?!鼋Y(jié)構(gòu)體數(shù)組的定義
structstudent{intnum;charname[20];intscore;};structstudenta[100];
定義a數(shù)組,可以存放100個(gè)學(xué)生的數(shù)據(jù)。
a數(shù)組的每個(gè)元素又是一個(gè)結(jié)構(gòu)體變量。FLTCH■結(jié)構(gòu)體數(shù)組的初始化在定義結(jié)構(gòu)體數(shù)組的同時(shí)指定初值。
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
■結(jié)構(gòu)體數(shù)組元素的引用成員引用:
a[0].num=1001;strcpy(a[0].name,”wang”);a[0].score=85;
整體引用:
a[1]=a[0];與普通數(shù)組元素的引用相同
■結(jié)構(gòu)體數(shù)組的應(yīng)用輸入100個(gè)學(xué)生的學(xué)號(hào)、姓名和考試成績(jī),然后按從高分到低分的順序排列后輸出。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、指向結(jié)構(gòu)體類(lèi)型數(shù)據(jù)的指針
■指向結(jié)構(gòu)體類(lèi)型變量的指針
structstudentst,st1;
structstudent*p;p=&st;
指向st
定義指向結(jié)構(gòu)體類(lèi)型數(shù)據(jù)的指針變量pFLTCH通過(guò)指針變量引用結(jié)構(gòu)體變量:①成員引用(*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■指向結(jié)構(gòu)體數(shù)組的指針
structstudenta[100];
structstudent*p;p=a;
通過(guò)指針變量引用結(jié)構(gòu)體數(shù)組元素:①成員引用
(*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”);也可以用下標(biāo)法:p[i].num=1001;p和a是等價(jià)的,就好比a[i].num=1001;②整體引用*(p+1)=*(p+0);或p[1]=p[0];FLTCH■用結(jié)構(gòu)體變量和指向結(jié)構(gòu)體的指針作函數(shù)參數(shù)用結(jié)構(gòu)體變量作函數(shù)參數(shù)時(shí),對(duì)應(yīng)的實(shí)參應(yīng)該是同類(lèi)型的結(jié)構(gòu)體變量(或數(shù)組元素),參數(shù)傳遞是“值傳遞”。用指向結(jié)構(gòu)體的指針作函數(shù)參數(shù)時(shí),對(duì)應(yīng)的實(shí)參應(yīng)該是同類(lèi)型的結(jié)構(gòu)體變量的地址(或數(shù)組的地址),參數(shù)傳遞是“地址傳遞”。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);}通過(guò)指針變量a可以訪(fǎng)問(wèn)它所指向的結(jié)構(gòu)體。
1001LiLi70st2000aFLTCH7、用指針處理鏈表
■鏈表概述鏈表是一種重要的數(shù)據(jù)結(jié)構(gòu)─動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)。以具體例子來(lái)說(shuō)明鏈表的概念及其應(yīng)用:例:選擇合適的數(shù)據(jù)結(jié)構(gòu)來(lái)存放一批學(xué)生的學(xué)號(hào)及考試成績(jī),以便進(jìn)一步處理。由于學(xué)生人數(shù)未知,用靜態(tài)數(shù)據(jù)結(jié)構(gòu)不合適。用鏈表處理較恰當(dāng)。FLTCH用鏈表處理該問(wèn)題的基本思路:將各學(xué)生的數(shù)據(jù)進(jìn)行離散存放,來(lái)一個(gè)學(xué)生就分配一小塊內(nèi)存(結(jié)點(diǎn))。并將各結(jié)點(diǎn)用指針依次連接起來(lái)─鏈表。
每結(jié)點(diǎn)應(yīng)包含下一結(jié)點(diǎn)的開(kāi)始地址。最后一個(gè)結(jié)點(diǎn)中的指針為空。鏈頭指針指向第一個(gè)結(jié)點(diǎn),是訪(fǎng)問(wèn)鏈表的重要依據(jù)。這樣的鏈表稱(chēng)單向鏈表。
head學(xué)號(hào)成績(jī)指針學(xué)號(hào)成績(jī)指針學(xué)號(hào)成績(jī)指針學(xué)號(hào)成績(jī)指針學(xué)號(hào)成績(jī)NULLFLTCH一個(gè)結(jié)點(diǎn)可用如下結(jié)構(gòu)體描述:typedefstructstudent{intnum;學(xué)號(hào)
intscore;成績(jī)
structstudent*next;下一結(jié)點(diǎn)的首地址}STU;typedef:自定義類(lèi)型符FLTCH
■單向鏈表的建立①輸入一個(gè)學(xué)生的數(shù)據(jù)。②分配結(jié)點(diǎn)空間,數(shù)據(jù)存入。③將該結(jié)點(diǎn)的首地址賦給上一結(jié)點(diǎn)的next,若該結(jié)點(diǎn)是第一個(gè)結(jié)點(diǎn),則賦給頭指針。④將該結(jié)點(diǎn)的next置為空,表示該結(jié)點(diǎn)為當(dāng)前的最后結(jié)點(diǎn)。head學(xué)號(hào)成績(jī)next學(xué)號(hào)成績(jī)next學(xué)號(hào)成績(jī)next學(xué)號(hào)成績(jī)NULL學(xué)號(hào)成績(jī)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為前一結(jié)點(diǎn)的指針
else(*p0).next=p;p0=p;}returnhead;}學(xué)號(hào)成績(jī)next學(xué)號(hào)成績(jī)nexthead學(xué)號(hào)成績(jī)NULLFLTCH■單向鏈表的訪(fǎng)問(wèn)以輸出為例①通過(guò)頭指針找到第一個(gè)結(jié)點(diǎn).②輸出當(dāng)前結(jié)點(diǎn)的內(nèi)容,并通過(guò)next找到后繼結(jié)點(diǎn),┄┄,直到next為空.FLTCHvoidoutput(STU*head){STU*p=head;while(p){printf("\n%d%d",(*p).num,(*p).score);p=(*p).next;}}head學(xué)號(hào)成績(jī)next學(xué)號(hào)成績(jī)next學(xué)號(hào)成績(jī)NULL學(xué)號(hào)成績(jī)nextFLTCH■刪除結(jié)點(diǎn)操作①按鏈表的訪(fǎng)問(wèn)方法找到相應(yīng)結(jié)點(diǎn)。②若該結(jié)點(diǎn)是第一個(gè)結(jié)點(diǎn),則將后繼結(jié)點(diǎn)指針賦給頭指針。若該結(jié)點(diǎn)是最后一個(gè)結(jié)點(diǎn),則將前綴結(jié)點(diǎn)的next置為空。若該結(jié)點(diǎn)是中間結(jié)點(diǎn),則將后繼結(jié)點(diǎn)指針賦給前綴結(jié)點(diǎn)的next。③釋放該結(jié)點(diǎn)所占的內(nèi)存單元。head學(xué)號(hào)成績(jī)next學(xué)號(hào)成績(jī)next學(xué)號(hào)成績(jī)NULL學(xué)號(hào)成績(jī)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;}假定要?jiǎng)h除某一指定學(xué)號(hào)的結(jié)點(diǎn)
FLTCH■插入操作
假定將結(jié)點(diǎn)p插入到結(jié)點(diǎn)p0的后面,則插入操作的關(guān)鍵為:
p->next=p0->next;p0->next=p;head學(xué)號(hào)成績(jī)next學(xué)號(hào)成績(jī)next學(xué)號(hào)成績(jī)next學(xué)號(hào)成績(jī)NULLFLTCH操作系統(tǒng)中經(jīng)常使用的數(shù)據(jù)結(jié)構(gòu)(鏈表)structStudent{Student*nextintage;char*name;charsex;};nextnext兩個(gè)元素的鏈表1。同數(shù)據(jù)類(lèi)型數(shù)據(jù)的集合;2。不占用連續(xù)內(nèi)存空間。使用上的特點(diǎn):1。分類(lèi)存放,但空間上不連續(xù)(不需要大量的連續(xù)存儲(chǔ)空間);2。檢索速度慢,且耗費(fèi)的時(shí)間不固定;應(yīng)用:存放大量的較大的表,類(lèi)似檔案柜FLTCH操作系統(tǒng)中經(jīng)常使用的數(shù)據(jù)結(jié)構(gòu)(隊(duì)列)按照先進(jìn)先出的規(guī)則組織的數(shù)據(jù)結(jié)構(gòu)可以用數(shù)組也可以用鏈表來(lái)實(shí)現(xiàn)主要用于對(duì)象的排隊(duì)FLTCH操作系統(tǒng)中經(jīng)常使用的數(shù)據(jù)結(jié)構(gòu)(堆棧)按照先進(jìn)后出規(guī)則組織的數(shù)據(jù)結(jié)構(gòu)主要用數(shù)組來(lái)實(shí)現(xiàn)主要用于程序模塊的嵌套運(yùn)行FLTCH在ucos-ii中,每個(gè)任務(wù)可以有5種狀態(tài),在任一時(shí)刻,任務(wù)的狀態(tài)一定是這5種狀態(tài)之一。等待或掛起就緒休眠中斷服務(wù)運(yùn)行↓←→→←←→收到消息,掛起時(shí)間到刪除任務(wù)任務(wù)調(diào)度中斷創(chuàng)建任務(wù)中斷結(jié)束FLTCH1、單次執(zhí)行類(lèi)任務(wù)創(chuàng)建單次執(zhí)行類(lèi)任務(wù)運(yùn)行刪除↘↘voidMyTask(void*pdata){
}進(jìn)行準(zhǔn)備工作的代碼;任務(wù)實(shí)體代碼;調(diào)用任務(wù)刪除函數(shù);定義和初始化變量及硬件設(shè)備完成該任務(wù)的具體功能將自己刪除,操作系統(tǒng)將不再管理它→→→FLTCH2、周期執(zhí)行類(lèi)任務(wù)就緒執(zhí)行等待↙↙↙voidMyTask(*pdata){while(1){}}進(jìn)行準(zhǔn)備工作的代碼;任務(wù)實(shí)體代碼;調(diào)用延時(shí)函數(shù);FLTCH3、事件觸發(fā)類(lèi)任務(wù)運(yùn)行等待就緒運(yùn)行↓↓↓消息VoidMyTask(void*pdata){while(1){}}進(jìn)行準(zhǔn)備工作的代碼;調(diào)用獲取事件的函數(shù);任務(wù)實(shí)體代碼;FLTCH系統(tǒng)函數(shù)概述1、配對(duì)性原則對(duì)ucos-ii來(lái)說(shuō),大多數(shù)API都是成對(duì)的,而且一部分必須成對(duì)使用。OSFlagCreat();建立事件標(biāo)志組OSFlagDel();刪除事件標(biāo)志組OSSemCreat();建立信號(hào)量OSSemDel();刪除信號(hào)量FLTCHFLTCH什么是多任務(wù)系統(tǒng)?簡(jiǎn)單的說(shuō),就是能用一個(gè)處理器并發(fā)(不是同時(shí))地運(yùn)行多個(gè)程序的計(jì)算機(jī)管理系統(tǒng)。并發(fā):由同一個(gè)處理器輪換地運(yùn)行多個(gè)程序?;蛘哒f(shuō)是由多個(gè)程序輪班地占用處理器這個(gè)資源。且在占用這個(gè)資源期間,并不一定能夠把程序運(yùn)行完畢。并發(fā)過(guò)程示意圖處理器如何進(jìn)行程序的切換?FLTCH程序的切換(兩句話(huà))處理器是個(gè)傻瓜,PC讓它干啥,它就干啥。PC是個(gè)指路器,它指向哪兒,處理器就去哪兒。從此可以知道,哪個(gè)程序占有了PC,哪個(gè)程序就占有了處理器。深刻地理解PC是理解系統(tǒng)進(jìn)行程序切換動(dòng)作的關(guān)鍵。FLTCH如何操作PC所謂切換PC←目標(biāo)地址指令:不同計(jì)算機(jī)類(lèi)型的指令是不同的1、數(shù)據(jù)傳輸指令2、子程序返回指令(由堆棧彈出)3、中斷服務(wù)程序返回指令(由堆棧彈出)系統(tǒng)是通過(guò)把待運(yùn)行程序的地址賦予程序計(jì)數(shù)器PC來(lái)實(shí)現(xiàn)程序的切換的。FLTCH任務(wù)代碼任務(wù)堆棧內(nèi)存處理器PCSP處理器通過(guò)兩個(gè)指針寄存器(PC和SP)來(lái)與任務(wù)代碼和任務(wù)堆棧建立聯(lián)系并運(yùn)行它寄存器組程序運(yùn)行環(huán)境運(yùn)行環(huán)境包括了兩部分:處理器中的運(yùn)行環(huán)境和內(nèi)存中的運(yùn)行環(huán)境程序運(yùn)行時(shí)與處理器之間的關(guān)系FLTCH任務(wù)代碼任務(wù)堆棧內(nèi)存處理器PCSP任務(wù)代碼任務(wù)堆棧內(nèi)存任務(wù)代碼任務(wù)堆棧內(nèi)存?當(dāng)有多個(gè)任務(wù)時(shí),處理器中的運(yùn)行環(huán)境應(yīng)該怎么辦?寄存器組程序運(yùn)行環(huán)境多任務(wù)時(shí)的問(wèn)題FLTCH程序虛擬處理器PCSP虛擬處理器PCSP虛擬處理器PCSP虛擬處理器PCSP調(diào)度器程序處理器PCSP在內(nèi)存中為每個(gè)任務(wù)創(chuàng)建一個(gè)虛擬的處理器(處理器部分的運(yùn)行環(huán)境由操作系統(tǒng)的調(diào)度器按某種規(guī)則來(lái)進(jìn)行這兩個(gè)復(fù)制工作復(fù)制當(dāng)需要運(yùn)行某個(gè)任務(wù)時(shí)就把該任務(wù)的虛擬處理器復(fù)制到實(shí)際處理器中復(fù)制當(dāng)需要中止當(dāng)前任務(wù)時(shí),則把任務(wù)對(duì)應(yīng)的虛擬處理器復(fù)制到內(nèi)存復(fù)制再把另一個(gè)需要運(yùn)行的任務(wù)的虛擬處理器復(fù)制到實(shí)際處理器中寄存器組寄存器組也就是說(shuō),任務(wù)的切換是任務(wù)運(yùn)行環(huán)境的切換多任務(wù)時(shí)任務(wù)與處理器之間關(guān)系的處理FLTCH
μC/OS-II中 的任務(wù)管理FLTCH任務(wù)的狀態(tài)及其轉(zhuǎn)換正在運(yùn)行的任務(wù),需要等待一段時(shí)間或需要等待一個(gè)事件發(fā)生再運(yùn)行時(shí),該任務(wù)就會(huì)把CPU的使用權(quán)讓給別的任務(wù)而使任務(wù)進(jìn)入等待狀態(tài)。任務(wù)在沒(méi)有被配備任務(wù)控制塊或被剝奪了任務(wù)控制塊時(shí)的狀態(tài)叫做任務(wù)的睡眠狀態(tài)
系統(tǒng)為任務(wù)配備了任務(wù)控制塊且在任務(wù)就緒表中進(jìn)行了就緒登記,這時(shí)任務(wù)的狀態(tài)叫做就緒狀態(tài)。
處于就緒狀態(tài)的任務(wù)如果經(jīng)調(diào)度器判斷獲得了CPU的使用權(quán),則任務(wù)就進(jìn)入運(yùn)行狀態(tài)
一個(gè)正在運(yùn)行的任務(wù)一旦響應(yīng)中斷申請(qǐng)就會(huì)中止運(yùn)行而去執(zhí)行中斷服務(wù)程序,這時(shí)任務(wù)的狀態(tài)叫做中斷服務(wù)狀態(tài)
FLTCH前面談到,一個(gè)任務(wù)的任務(wù)控制塊的主要作用就是保存該任務(wù)的虛擬處理器的堆棧指針寄存器SP。其實(shí),隨著任務(wù)管理工作的復(fù)雜性的提高,它還應(yīng)該保存一些其他信息。任務(wù)控制塊—任務(wù)在系統(tǒng)中的身份證
由于系統(tǒng)存在著多個(gè)任務(wù),于是系統(tǒng)如何來(lái)識(shí)別并管理一個(gè)任務(wù)就是一個(gè)需要解決的問(wèn)題。識(shí)別一個(gè)任務(wù)的最直接的辦法是為每一個(gè)任務(wù)起一個(gè)名稱(chēng)。由于μC/OS-II中的任務(wù)都有一個(gè)惟一的優(yōu)先級(jí)別,因此μC/OS-II是用任務(wù)的優(yōu)先級(jí)來(lái)作為任務(wù)的標(biāo)識(shí)的。所以,任務(wù)控制塊還要來(lái)保存該任務(wù)的優(yōu)先級(jí)別。另外,前面也談到,一個(gè)任務(wù)在不同的時(shí)刻還處于不同的狀態(tài),顯然,記錄了任務(wù)狀態(tài)的數(shù)據(jù)也應(yīng)該保存到任務(wù)控制塊中?;谏鲜鲈?,系統(tǒng)必須為每個(gè)任務(wù)創(chuàng)建一個(gè)保存與該任務(wù)有關(guān)的相關(guān)信息的數(shù)據(jù)結(jié)構(gòu),這個(gè)數(shù)據(jù)結(jié)構(gòu)就叫做該任務(wù)的任務(wù)控制塊(TCB)。任務(wù)控制塊結(jié)構(gòu)的主要成員typedefstructos_tcb{
OS_STK*OSTCBStkPtr; //指向任務(wù)堆棧棧頂?shù)闹羔?/p>
……
INT8U OSTCBStat; //任務(wù)的當(dāng)前狀態(tài)標(biāo)志
INT8U OSTCBPrio; //任務(wù)的優(yōu)先級(jí)別
……}OS_TCB;
任務(wù)控制塊是不是像我們?nèi)嗽谝粋€(gè)國(guó)家中的身份證?(其實(shí),系統(tǒng)中的所有資源都應(yīng)該有身份證。)FLTCH一旦任務(wù)建立,一個(gè)任務(wù)控制塊OS_TCB就被賦值。任務(wù)控制塊是一個(gè)數(shù)據(jù)結(jié)構(gòu),當(dāng)任務(wù)的cpu使用權(quán)被剝奪時(shí),ucos-II用它來(lái)保存該任務(wù)的狀態(tài)。當(dāng)任務(wù)重新得到cpu使用權(quán)時(shí),任務(wù)控制塊能確保任務(wù)從當(dāng)時(shí)被中斷的那一點(diǎn)絲毫不差的繼續(xù)執(zhí)行。OS_TCB全部駐留在RAM中。FLTCH任務(wù)在內(nèi)存中的結(jié)構(gòu)FLTCH用戶(hù)任務(wù)代碼的一般結(jié)構(gòu)
voidMyTask(void*pdata){for(;;){
可以被中斷的用戶(hù)代碼;
OS_ENTER_CRITICAL();//進(jìn)入臨界段(關(guān)中斷)
不可以被中斷的用戶(hù)代碼;
OS_EXIT_CRITICAL(); //退出臨界段(開(kāi)中斷)
可以被中斷的用戶(hù)代碼;
}}臨界段無(wú)限循環(huán)于是可以這樣說(shuō),μC/OS-II任務(wù)的代碼結(jié)構(gòu)是一個(gè)可以帶有臨界段的無(wú)限循環(huán)。
FLTCH系統(tǒng)提供的另一個(gè)任務(wù)
——統(tǒng)計(jì)任務(wù)μC/OS-II提供的另一個(gè)系統(tǒng)任務(wù)是統(tǒng)計(jì)任務(wù)OSTaskStat()。這個(gè)統(tǒng)計(jì)任務(wù)每秒計(jì)算一次CPU在單位時(shí)間內(nèi)被使用的時(shí)間,并把計(jì)算結(jié)果以百分比的形式存放在變量OSCPUsage中,以便應(yīng)用程序通過(guò)訪(fǎng)問(wèn)它來(lái)了解CPU的利用率,所以這個(gè)系統(tǒng)任務(wù)OSTaskStat()叫做統(tǒng)計(jì)任務(wù)
FLTCH
任務(wù)的優(yōu)先權(quán)及優(yōu)先級(jí)別
μC/OS_II把任務(wù)的優(yōu)先權(quán)分為64個(gè)優(yōu)先級(jí)別,每一個(gè)級(jí)別都用一個(gè)數(shù)字來(lái)表示。數(shù)字0表示任務(wù)的優(yōu)先級(jí)別最高,數(shù)字越大則表示任務(wù)的優(yōu)先級(jí)別越低
用戶(hù)可以根據(jù)應(yīng)用程序的需要,在文件OS_CFG.H中通過(guò)給表示最低優(yōu)先級(jí)別的常數(shù)OS_LOWEST_PRIO賦值的方法,來(lái)說(shuō)明應(yīng)用程序中任務(wù)優(yōu)先級(jí)別的數(shù)目。該常數(shù)一旦被定義,則意味著系統(tǒng)中可供使用的優(yōu)先級(jí)別為:0,1,2,……,OS_LOWEST_PRIO,共OS_LOWEST_PRIO+1個(gè)
固定地,系統(tǒng)總是把最低優(yōu)先級(jí)別OS_LOWEST_PRIO自動(dòng)賦給空閑任務(wù)。如果應(yīng)用程序中還使用了統(tǒng)計(jì)任務(wù),系統(tǒng)則會(huì)把優(yōu)先級(jí)別OS_LOWEST_PRIO-1自動(dòng)賦給統(tǒng)計(jì)任務(wù),因此用戶(hù)任務(wù)可以使用的優(yōu)先級(jí)別是:0,1,2…OS_LOWEST_PRIO-2,共OS_LOWEST_PRIO-1個(gè)
FLTCH
任務(wù)堆棧
保存CPU寄存器中的內(nèi)容及存儲(chǔ)任務(wù)私有數(shù)據(jù)的需要,每個(gè)任務(wù)都應(yīng)該配有自己的堆棧,任務(wù)堆棧是任務(wù)的重要的組成部分在應(yīng)用程序中定義任務(wù)堆棧的棧區(qū)非常簡(jiǎn)單,即定義一個(gè)OS_STK類(lèi)型的一個(gè)數(shù)組并在創(chuàng)建一個(gè)任務(wù)時(shí)把這個(gè)數(shù)組的地址賦給該任務(wù)就可以了。例如:
//定義堆棧的長(zhǎng)度#define TASK_STK_SIZE 512//定義一個(gè)數(shù)組來(lái)作為任務(wù)堆棧OS_STKTaskStk[TASK_STK_SIZE]; typedefunsignedintOS_STK;//這是系統(tǒng)定義的一個(gè)數(shù)據(jù)類(lèi)型voidmain(void){ …… OSTaskCreate( MyTask, //任務(wù)的指針
&MyTaskAgu, //傳遞給任務(wù)的參數(shù)
&MyTaskStk[MyTaskStkN-1],//任務(wù)堆棧棧頂?shù)刂?/p>
20 //任務(wù)的優(yōu)先級(jí)別
); ……}在創(chuàng)建用戶(hù)任務(wù)時(shí),要傳遞任務(wù)的堆棧指針和任務(wù)優(yōu)先級(jí)別使用函數(shù)OSTaskCreate()創(chuàng)建任務(wù)時(shí),一定要注意所使用的處理器對(duì)堆棧增長(zhǎng)方向的支持是向上的還是向下的
FLTCH任務(wù)堆棧的初始化
應(yīng)用程序在創(chuàng)建一個(gè)新任務(wù)的時(shí)候,必須把在系統(tǒng)啟動(dòng)這個(gè)任務(wù)時(shí)CPU各寄存器所需要的初始數(shù)據(jù)(任務(wù)指針、任務(wù)堆棧指針、程序狀態(tài)字等等),事先存放在任務(wù)的堆棧中
μC/OS-II在創(chuàng)建任務(wù)函數(shù)OSTaskCreate()中通過(guò)調(diào)用任務(wù)堆棧初始化函數(shù)OSTaskStkInit()來(lái)完成任務(wù)堆棧初始化工作的
它的原型如下:
OS_STK*OSTaskStkInit( void(*task)(void*pd), void*pdato, OS_STK*ptos, INT16Uopt );由于各種處理器的寄存器及對(duì)堆棧的操作方式不盡相同,因此該函數(shù)需要用戶(hù)在進(jìn)行μC/OS-II的移植時(shí),按所使用的處理器由用戶(hù)來(lái)編寫(xiě)。實(shí)現(xiàn)這個(gè)函數(shù)的具體細(xì)節(jié),將在本書(shū)有關(guān)μC/OS-II移植的章節(jié)中做進(jìn)一步的介紹
其實(shí),任務(wù)堆棧的初始化就是對(duì)該任務(wù)的虛擬處理器的初始化(復(fù)位)。
FLTCH任務(wù)控制塊 (OS_TCB)
及任務(wù)控制塊鏈表
μC/OS-II用來(lái)記錄任務(wù)的堆棧指針、任務(wù)的當(dāng)前狀態(tài)、任務(wù)的優(yōu)先級(jí)別等一些與任務(wù)管理有關(guān)的屬性的表就叫做任務(wù)控制塊
任務(wù)控制塊就相當(dāng)于是一個(gè)任務(wù)的身份證,沒(méi)有任務(wù)控制塊的任務(wù)是不能被系統(tǒng)承認(rèn)和管理的
任務(wù)控制塊結(jié)構(gòu)的主要成員typedefstructos_tcb{
OS_STK*OSTCBStkPtr;//指向任務(wù)堆棧棧頂?shù)闹羔?/p>
……
structos_tcb*OSTCBNext;//指向后一個(gè)任務(wù)控制塊的指針
structos_tcb*OSTCBPrev;
//指向前一個(gè)任務(wù)控制塊的指針
……
INT16U OSTCBDly; //任務(wù)等待的時(shí)限(節(jié)拍數(shù))
INT8U OSTCBStat; //任務(wù)的當(dāng)前狀態(tài)標(biāo)志
INT8U OSTCBPrio; //任務(wù)的優(yōu)先級(jí)別
……}OS_TCB;任務(wù)控制塊鏈表空任務(wù)控制塊鏈表當(dāng)應(yīng)用程序調(diào)用函數(shù)OSTaskCreate()創(chuàng)建一個(gè)任務(wù)時(shí),這個(gè)函數(shù)會(huì)調(diào)用系統(tǒng)函數(shù)OSTCBInit()來(lái)為任務(wù)控制塊進(jìn)行初始化。這個(gè)函數(shù)首先為被創(chuàng)建任務(wù)從空任務(wù)控制塊鏈表獲取一個(gè)任務(wù)控制塊,然后用任務(wù)的屬性對(duì)任務(wù)控制塊各個(gè)成員進(jìn)行賦值,最后再把這個(gè)任務(wù)控制塊鏈入到任務(wù)控制塊鏈表的頭部
當(dāng)進(jìn)行系統(tǒng)初始化時(shí),初始化函數(shù)會(huì)按用戶(hù)提供的任務(wù)數(shù)為系統(tǒng)創(chuàng)建具有相應(yīng)數(shù)量的任務(wù)控制塊并把它們鏈接為一個(gè)鏈表。 由于這些任務(wù)控制塊還沒(méi)有對(duì)應(yīng)的任務(wù),故這個(gè)鏈表叫做空任務(wù)塊鏈表。即相當(dāng)于是一些空白的身份證。
FLTCH 任務(wù)就緒表 及 任務(wù)調(diào)度
多任務(wù)操作系統(tǒng)的核心工作就是任務(wù)調(diào)度。所謂調(diào)度,就是通過(guò)一個(gè)算法在多個(gè)任務(wù)中確定該運(yùn)行的任務(wù),做這項(xiàng)工作的函數(shù)就叫做調(diào)度器。
μC/OS_II進(jìn)行任務(wù)調(diào)度的思想是“近似地每時(shí)每刻總是讓優(yōu)先級(jí)最高
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年翡翠原石代銷(xiāo)與質(zhì)量保證協(xié)議3篇
- 二零二五版養(yǎng)老院服務(wù)人員勞務(wù)分包協(xié)議2篇
- 機(jī)構(gòu)純傭直播賣(mài)貨推廣合作協(xié)議
- 個(gè)人廠(chǎng)房轉(zhuǎn)租協(xié)議
- 法律服務(wù)股權(quán)轉(zhuǎn)讓協(xié)議
- 二零二五版離婚協(xié)議范本編寫(xiě)規(guī)范解讀2篇
- 2024款汽車(chē)銷(xiāo)售協(xié)議樣本版A版
- 2024版正式的用工勞動(dòng)合同
- 2024年新型塔吊工程安全施工合作協(xié)議3篇
- 2024版標(biāo)準(zhǔn)塔吊操作與維護(hù)協(xié)議
- Unit 3 We should obey the rules. Lesson15(說(shuō)課稿)-2023-2024學(xué)年人教精通版英語(yǔ)五年級(jí)下冊(cè)
- 綿陽(yáng)市高中2022級(jí)(2025屆)高三第二次診斷性考試(二診)語(yǔ)文試卷(含答案)
- 2024年聊城市東昌府區(qū)中醫(yī)院招聘?jìng)浒钢乒ぷ魅藛T考試真題
- 2025年極兔速遞有限公司招聘筆試參考題庫(kù)含答案解析
- 一般固廢處理流程
- 《健康體檢知識(shí)》課件
- 《AIGC應(yīng)用實(shí)戰(zhàn)(慕課版)》-課程標(biāo)準(zhǔn)
- 政府機(jī)關(guān)辦公用品配送方案
- 永威置業(yè)項(xiàng)目交付前風(fēng)險(xiǎn)排查表
- 《儲(chǔ)能材料與器件》課程教學(xué)大綱(新能源材料與器件專(zhuān)業(yè))
- 人力資源許可證制度(服務(wù)流程、服務(wù)協(xié)議、收費(fèi)標(biāo)準(zhǔn)、信息發(fā)布審查和投訴處理)
評(píng)論
0/150
提交評(píng)論