![ucos期末復(fù)習(xí)整理2023版_第1頁](http://file4.renrendoc.com/view/44de05e31569ba056f437a1ecd5faba7/44de05e31569ba056f437a1ecd5faba71.gif)
![ucos期末復(fù)習(xí)整理2023版_第2頁](http://file4.renrendoc.com/view/44de05e31569ba056f437a1ecd5faba7/44de05e31569ba056f437a1ecd5faba72.gif)
![ucos期末復(fù)習(xí)整理2023版_第3頁](http://file4.renrendoc.com/view/44de05e31569ba056f437a1ecd5faba7/44de05e31569ba056f437a1ecd5faba73.gif)
![ucos期末復(fù)習(xí)整理2023版_第4頁](http://file4.renrendoc.com/view/44de05e31569ba056f437a1ecd5faba7/44de05e31569ba056f437a1ecd5faba74.gif)
![ucos期末復(fù)習(xí)整理2023版_第5頁](http://file4.renrendoc.com/view/44de05e31569ba056f437a1ecd5faba7/44de05e31569ba056f437a1ecd5faba75.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
本文格式為Word版,下載可任意編輯——ucos期末復(fù)習(xí)整理2023版
復(fù)習(xí)題
一、概述
1、μC/OS-II嵌入式操作系統(tǒng)的主要組成部分。
2、μC/OS-II嵌入式操作系統(tǒng)的主要特點(diǎn)。
1).資源占用最小化微內(nèi)核結(jié)構(gòu)
模塊化(系統(tǒng)可裁減)2).實(shí)時(shí)性3).事件驅(qū)動(dòng)
優(yōu)先級任務(wù)調(diào)度和搶占式調(diào)度切換時(shí)間和中斷延遲時(shí)間確定4).非通用性,不易壟斷
3、μC/OS-II的裁剪:修改OS_CFG.h文件。
OS_CFG.H是配置文件,μC/OS-II是依靠編譯時(shí)的條件編譯來實(shí)現(xiàn)可裁剪性的。即把用戶可以裁剪的代碼段放在#if和#endif預(yù)編譯指令之間,在編譯時(shí)根據(jù)#if后面的常數(shù)來決定該段代碼是否編譯到目標(biāo)代碼中。而#if后面的常數(shù)一般就是在OS_CFG.H中定義的。
二、基本任務(wù)管理
1、任務(wù)的基本構(gòu)成:任務(wù)控制塊、任務(wù)堆棧、任務(wù)函數(shù)
2、任務(wù)控制塊(TaskControlBlock,TCB)就相當(dāng)于是一個(gè)任務(wù)的身份證,任何已經(jīng)創(chuàng)立的任務(wù)都有唯一的任務(wù)控制塊。了解任務(wù)控制塊TCB的主要字段的含義和作用。
任務(wù)控制塊用來記錄任務(wù)的堆棧指針、任務(wù)狀態(tài)、優(yōu)先級等一些與任務(wù)管理有關(guān)的屬性3、任務(wù)堆棧主要用于在任務(wù)切換是保存現(xiàn)場和恢復(fù)現(xiàn)場,所以每個(gè)任務(wù)都必需有它的專用任務(wù)堆棧。即使是基于同一任務(wù)函數(shù)創(chuàng)立的多個(gè)任務(wù)也應(yīng)當(dāng)有它們各自專用的任務(wù)堆棧。
注意:把握任務(wù)創(chuàng)立函數(shù)的使用方法。
INT8UOSTaskCreate(
void(*task)(void*pd),//指向任務(wù)的指針void*pdata,//傳遞給任務(wù)的參數(shù)
OS_STK*ptos,//指向任務(wù)堆棧棧頂?shù)闹羔業(yè)NT8Uprio//任務(wù)的優(yōu)先級)
例如:根據(jù)函數(shù)函數(shù)MyTask和其任務(wù)堆棧MyTaskStk定義一個(gè)優(yōu)先級為5的任務(wù):
OSTaskCreate(MyTask,0,
3、注意任務(wù)函數(shù)的框架。如何向任務(wù)函數(shù)傳遞參數(shù)(試驗(yàn)二)。
voidTaskSendByUart(void*pdata){Baud=*(INT16U*)pdata;while(1){}}
4、任務(wù)狀態(tài)及其狀態(tài)轉(zhuǎn)換:哪些轉(zhuǎn)換是可能的,哪些轉(zhuǎn)換是不可能的?
5、在μC/OS-II中,不同的任務(wù)具有不同優(yōu)先級。注意理解優(yōu)先級含義。
6、基于μC/OS-II應(yīng)用程序在調(diào)用其他系統(tǒng)函數(shù)之前,必需先調(diào)用OSInit()對包括全局變量和數(shù)據(jù)結(jié)構(gòu)的運(yùn)行環(huán)境進(jìn)行初始化。
7、在基于μC/OS-II的應(yīng)用程序設(shè)計(jì)中,創(chuàng)立用戶任務(wù)后,必需調(diào)用OSStart()啟動(dòng)μC/OS-II操作系統(tǒng),把控制權(quán)交給操作系統(tǒng)內(nèi)核,開始任務(wù)調(diào)度。
8、一個(gè)正在運(yùn)行任務(wù)如要掛起任務(wù)自身,則調(diào)用OSTaskSuspend(OS_PRIO_SELF)9、在μC/OS-II中,恢復(fù)被掛起任務(wù)函數(shù)的函數(shù)原型是OSTaskResume(INT8Uprio)請問能否通過任務(wù)的掛起和恢復(fù)實(shí)現(xiàn)兩個(gè)任務(wù)的交替執(zhí)行?(參照相關(guān)例如)
voidMyTask(void*pdata){
while(1){printf(\Beep(1950,20);n++;//通過空循環(huán)進(jìn)行延時(shí)if(n>=10){
printf(\
n=0;OSTaskSuspend(OS_PRIO_SELF);}}}
OSTaskResume(5)恢復(fù)優(yōu)先級為5的任務(wù)MyTask,MyTask進(jìn)入就緒狀態(tài),由于其優(yōu)先級高過當(dāng)前任務(wù)YourTask,所以通過任務(wù)調(diào)度進(jìn)入運(yùn)行狀態(tài)voidYourTask(void*pdata){while(1){
printf(\Beep(4000,20);m++;
//通過空循環(huán)進(jìn)行延時(shí)if(m>=10){
printf(\m=0;
OSTaskResume(5);}}
10、正在運(yùn)行的任務(wù)假使需要?jiǎng)h除自身,則需要調(diào)用OSTaskDel(OS_PRIO_SELF)。OS_PRIO_SELF為常數(shù),用這個(gè)參數(shù)就是對本任務(wù)進(jìn)行操作。
11、在單處理器的多任務(wù)系統(tǒng)中,任務(wù)什么時(shí)候占用處理器和能占用多長時(shí)間,取決于:任務(wù)自身狀態(tài)、優(yōu)先級和任務(wù)調(diào)度策略二、任務(wù)之間的同步
1、在任務(wù)同步時(shí),生產(chǎn)者(控制任務(wù))和消費(fèi)者(被控任務(wù))的優(yōu)先級一般如何設(shè)置?誰負(fù)責(zé)發(fā)送信號(hào)量,誰申請信號(hào)量?信號(hào)量計(jì)數(shù)器的初始值如何設(shè)置?通過例如總結(jié)理解。
在通過信號(hào)量實(shí)現(xiàn)兩個(gè)任務(wù)單向同步時(shí),為了達(dá)到較好的同步效果,一般將發(fā)送信號(hào)量任務(wù)設(shè)置較低優(yōu)先級,將接收信號(hào)量任務(wù)設(shè)置較高優(yōu)先級。
2、假使希望實(shí)現(xiàn)多個(gè)任務(wù)同步一個(gè)任務(wù),一般采用信號(hào)量集(事件標(biāo)志組)。通過例如了解。3、假使希望一個(gè)任務(wù)同步多個(gè)任務(wù),則一般采用消息廣播(或者多個(gè)信號(hào)量)。通過例如理解。
4、當(dāng)利用信號(hào)量用于實(shí)現(xiàn)兩個(gè)任務(wù)對一個(gè)共享資源共享訪問時(shí),則創(chuàng)立該信號(hào)量時(shí)的信號(hào)量計(jì)數(shù)器OSEventCnt的初始值應(yīng)設(shè)置為1。
Sem=OSSemCreate(1);
寫出各個(gè)訪問共享資源任務(wù)的任務(wù)函數(shù)框架。
voidMyTask(void*pdata){while(1){
OSSemPend(sem,0,OSSemPost(sem);}}
voidYourTask(void*pdata){while(1){
OSSemPend(sem,0,OSSemPost(sem);}}
5、分析產(chǎn)生死鎖的原因以及解決死鎖的策略。
原因:死鎖是指兩個(gè)任務(wù)以上無限期地相互等待其他任務(wù)控制著的資源。
解決策略:每個(gè)必需先得到全部需要的資源再做下一步的工作,而且用同樣的順序去申請多個(gè)資源;資源利用完后使用相反的順序釋放資源;在申請信號(hào)量時(shí)定義等待超時(shí),假使在給定的時(shí)限內(nèi)沒有申請成功,則釋放原來占用的信號(hào)量(資源)。:
每個(gè)必需先得到全部需要的資源再做下一步的工作,而且用同樣的順序去申請多個(gè)資源;資源利用完后使用相反的順序釋放資源;
在申請信號(hào)量時(shí)定義等待超時(shí),假使在給定的時(shí)限內(nèi)沒有申請成功,則釋放原來占用的信號(hào)量(資源)。
6、任何任務(wù)創(chuàng)立后,在它的生命周期中,其優(yōu)先級一定不會(huì)發(fā)生改變嗎?
占用互斥信號(hào)量的任務(wù)在執(zhí)行過程中優(yōu)先級可能發(fā)生改變。(請問在什么時(shí)候可能發(fā)生改變),通過試驗(yàn)例如加以理解。當(dāng)一個(gè)優(yōu)先級較低的任務(wù)已經(jīng)申請到信號(hào)量,而另一個(gè)優(yōu)先級較高的任務(wù)也申請?jiān)撔盘?hào)量時(shí),優(yōu)先級較低的任務(wù)的優(yōu)先級將發(fā)生改變。
7、請說明信號(hào)量的應(yīng)用情形,分析在不同的應(yīng)用狀況下(行為同步、資源互斥訪問),創(chuàng)立信號(hào)量時(shí)設(shè)置的信號(hào)量計(jì)數(shù)器初始值有什么不同。
理解試驗(yàn)中所有與任務(wù)之間同步(行為同步、資源訪問同步)有關(guān)的代碼。行為同步:信號(hào)量計(jì)數(shù)器初始值為0
資源互斥訪問:信號(hào)量計(jì)數(shù)器初始值為可訪問的資源數(shù)量。
8、什么是優(yōu)先級反轉(zhuǎn),并說明解決優(yōu)先級反轉(zhuǎn)的解決方法。(上課例如、試驗(yàn)五)
在可剝奪型內(nèi)核中,當(dāng)任務(wù)以獨(dú)占方式使用共享資源時(shí),會(huì)出現(xiàn)低優(yōu)先級任務(wù)先于高優(yōu)先級任務(wù)而被運(yùn)行的現(xiàn)象,這種現(xiàn)象叫做任務(wù)優(yōu)先級反轉(zhuǎn)。
解決問題的方法之一,是使獲得信號(hào)量任務(wù)的優(yōu)先級在使用共享資源期間暫時(shí)提升它的優(yōu)先級,以使該任務(wù)不被其他的任務(wù)所打斷,從而能盡快使用完共享資源并釋放資源使用權(quán)(信號(hào)量),然后在釋放了資源使用權(quán)(信號(hào)量)之后再恢復(fù)該任務(wù)原來的優(yōu)先級別。
9、設(shè)有三個(gè)任務(wù)TaskA、TaskB、TaskC,它們共享一個(gè)緩沖區(qū)S。TaskA負(fù)責(zé)從輸入設(shè)備讀信息,每讀一紀(jì)錄后,把它存放在緩沖區(qū)S;TaskB負(fù)責(zé)對緩沖區(qū)中的紀(jì)錄進(jìn)行加工;TaskC把加工后的紀(jì)錄打印輸出。讀入的紀(jì)錄加工輸出后,緩沖區(qū)中只可存放下一個(gè)紀(jì)錄。請給出解決上述問題的應(yīng)用程序的示意性代碼(除與任務(wù)之間同步、通信有關(guān)的代碼外可以用偽碼)。
sem1=OSSemCreate(1);sem2=OSSemCreate(0);sem3=OSSemCreate(0);voidTaskA(void*pdata){
while(1){
OSSemPend(sem1,0,//從輸入設(shè)備讀信息OSSemPost(sem2);}}
voidTaskB(void*pdata){
while(1){
OSSemPend(sem2,0,//對緩沖區(qū)的中的記錄進(jìn)行加工OSSemPost(sem3);}}
voidTaskC(void*pdata){
while(1){
OSSemPend(sem3,0,//把加工后的記錄打印輸出OSSemPost(sem1);}}
10、理解上課例如和試驗(yàn)所有與同步、死鎖、優(yōu)先級反轉(zhuǎn)有關(guān)代碼。三、任務(wù)之間的數(shù)據(jù)通信
Beep(1950,20);n++;
for(i=0;i=3){
printf(\取消任務(wù)MyTask的延時(shí)!\\n\m=0;
OSTimeDlyResume(5);}}}
3、任務(wù)之間的單向同步(通過信號(hào)量):按鍵控制音頻播放(PC)、按鍵控制LED(Proteus)設(shè)計(jì)兩個(gè)任務(wù),第一個(gè)任務(wù)是按鍵檢測任務(wù)(TaskKey),其次個(gè)任務(wù)是串口發(fā)送任務(wù)(TaskSendByUART),這兩個(gè)任務(wù)要求通過信號(hào)量進(jìn)行同步,即按鍵任務(wù)檢測到按鍵后,串口發(fā)送任務(wù)將按鍵次數(shù)信息發(fā)送到串口終端上。注意:要求創(chuàng)立串口發(fā)送任務(wù)時(shí)能夠通過任務(wù)函數(shù)的參數(shù)pdata實(shí)現(xiàn)波特率的設(shè)置。
檢測到按鍵后,串口發(fā)送按鍵次數(shù)信息,8個(gè)Led再以二進(jìn)制數(shù)的形式顯示按鍵次數(shù)。如何改造程序達(dá)到以上要求的試驗(yàn)效果,請畫出通過信號(hào)量實(shí)現(xiàn)三個(gè)任務(wù)同步的示意圖。
voidTaskLed(void*pdata){while(1){
OSTaskSuspend(OS_PRIO_SELF);n=(n+1)%255;IO1SET=LEDCON;IO1CLR=n
if(flag)OSMboxPost(mbox,}}
(2)假使希望試驗(yàn)效果為:鍵盤掃描任務(wù)檢測到按鍵后,假使需要將按鍵信息發(fā)送給多個(gè)任務(wù)(如串口發(fā)送任務(wù)、數(shù)碼管顯示任務(wù)),請問如何改造程序達(dá)到以上要求的試驗(yàn)效果,請寫出三個(gè)任務(wù)的任務(wù)函數(shù)框架,說明三個(gè)任務(wù)的數(shù)據(jù)通信的實(shí)現(xiàn)。
voidTaskSendByUart(void*pdata){
while(1){
pkey=(_key*)OSMboxPend(mbox,0,
sprintf(s,\UART0SendStr(s);}}
voidTaskLed(void*pdata){while(1){
pkey=(_key*)OSMboxPend(mbox,0,i=pkey->row*4+pkey->col;
HC595_SendDat(DISP_TAB[i]);//輸出LED顯示數(shù)據(jù)DelayNS(100);//延時(shí)}}
voidTaskKeyScan(void*pdata){while(1){
while((IO1PIN//等待按鍵釋放
if(flag)OSMboxPostOpt(mbox,}}
試驗(yàn)六:
編寫兩個(gè)任務(wù),一個(gè)任務(wù)獲取漢字區(qū)位碼,并將漢字區(qū)位碼發(fā)送到消息郵箱,另外一個(gè)任務(wù)從消息郵箱接收漢字區(qū)位碼,并從漢字字庫中獲取漢字點(diǎn)陣信息并顯示。請寫出根據(jù)漢字內(nèi)碼獲取漢字點(diǎn)陣信息并顯示的基本步驟。
1.根據(jù)漢子機(jī)內(nèi)碼求出區(qū)位碼:qh=*p++-160;wh=*p-1602.求出漢子在字庫中的位置:loc=(94*(qh-1)+(wh-1)*hzsize);3.讀入漢字字庫點(diǎn)陣信息:fseek(fp,loc,0);fread(4.顯示漢字:Load_HZ(hz,24,24,x,100);
voidMyTask(void*pdata){
chars[]=\電子科技大學(xué)中山學(xué)院\p=s;
while(*p){//根據(jù)漢字機(jī)內(nèi)碼求出區(qū)位碼qw.qh=*p++-160;qw.wh=*p++-160;OSMboxPost(mbox,}
while(1){}}
voidYourTask(void*pdata)
{
fp=fopen(\楷\while(1){qw=(_qwh*)OSMboxPend(mbox,0,GUI_DispDecAt(qw->qh,x+3,60,2);GUI_DispDecAt(qw->wh,x+3,80,2);loc=(94*(qw->qh-1)+(qw->wh-1))*HZSize;//求出漢字在字庫中的位置//讀入漢字字庫點(diǎn)陣信息fseek(fp,loc,0);fread(Load_HZ(hz,24,24,x,100);x+=30;}
fclose(fp);
while(1){}}
//漢字顯示完整代碼:#include#include#include#include\#include\
#defineTaskStkLengh2048//定義用戶任務(wù)的堆棧長度OS_STKTaskSendStk[TaskStkLengh];//定義發(fā)送漢字點(diǎn)陣任務(wù)堆棧OS_STKTaskDispStk[TaskStkLengh];//定義顯示漢字點(diǎn)陣任務(wù)堆棧voidTaskSend(void*pdata);voidTaskDisp(void*pdata);OS_EVENT*mbox;typedefstructQWM{INT8Uqh;INT8Uwh;}QWCode;
//顯示漢字點(diǎn)陣函數(shù)
voidLoad_HZ(constINT8U*hz,INT16ULen,INT16UHeight,INT16UxPos,INT16UyPos){
INT16Ux,y,i;INT8Utemp;
for(y=yPos;y=1;i=i/2){GUI_SetColor(GUI_RED);if(tempx++;}}}}
intmain(){
GUI_Init();OSInit();
OSTaskCreate(TaskSend,0,OSTaskCreate(TaskDisp,0,mbox=OSMboxCreate((void*)0);OSStart();return0;}
voidTaskSend(void*pdata){QWCodeqw;
chars[]=\電子科大計(jì)算機(jī)學(xué)院\
//實(shí)際應(yīng)用中可能是通過通信鏈路獲得要顯示的字符串p=s;
while(*p){//根據(jù)漢字機(jī)內(nèi)碼求出區(qū)位碼qw.qh=*p++-160;qw.wh=*p++-160;OSMboxPost(mbox,}while(1){}}
voidTaskDisp(void*pdata){FILE*fp;INT8Uerr;QWCode*p;INT8Uhz[72];INT32Uloc;INT16Ux=10;
fp=fopen(\//開啟漢字庫文件
if(!fp){GUI_DispStringAt(\exit(0);}
elseGUI_DispStringAt(\while(1){p=(QWCode*)OSMboxPend(mbox,0,loc=(94*(p->qh-1)+(p->wh-1))*72;//求出漢字在字庫中的位置//讀入漢字字庫點(diǎn)陣信息fseek(fp,loc,0);fread(
Load_HZ(hz,24,24,x,100);x+=30;}}
//BMP圖片顯示
//#include\#defineTaskStkLengh2048//定義用戶任務(wù)的堆棧長度OS_STKTaskSendStk[TaskStkLengh];//定義用戶任務(wù)堆棧OS_STKTaskDispStk[TaskStkLengh];//定義用戶任務(wù)堆棧voidTaskSend(void*pdata);voidTaskDisp(void*pdata);OS_EVENT*mbox;
INT16UWidth,Height,w;//定義BMP文件信息區(qū)typedefstructBMP_file{INT16UbfType;//文件類型
INT32UbfSize;//bmp文件長度INT16UReserved1;INT16UReserved2;
INT32UbfOffset;//文件描述區(qū)長度,16色為118,256色為1078}bitmapfile;
//定義圖象信息區(qū)
typedefstructBMP_info{INT32UbiSize;
INT32UbiWidth;INT32UbiHeight;INT16UbiPlanes;
INT16UbiBitCount;//每個(gè)像素的顏色位INT32UbiCompression;INT32UbiSizeImage;
INT32UbiXplosPerMeter;INT32UbiYplosPerMeter;INT32UbiClrUsed;
INT32UbiClrImportant;}bitmapinfo;
intmain(){
GUI_Init();OSInit();
OSTaskCreate(TaskSend,0,OSTa
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房地產(chǎn)買賣合同
- 車輛駕駛承包合同范本
- 外貿(mào)代理合同仲裁條款
- 正規(guī)個(gè)人借款合同范本
- 無償借用車間合同范本
- 綠化綠植買賣合同范本
- 2025合法的工程合同樣式
- 專利申請委托合同書樣本
- 項(xiàng)目咨詢服務(wù)合同范本
- 貨物運(yùn)輸公司的勞務(wù)合同
- 保安服務(wù)項(xiàng)目信息反饋溝通機(jī)制
- 全國各省(直轄市、自治區(qū))市(自治州、地區(qū))縣(縣級市)區(qū)名稱一覽表
- 《團(tuán)隊(duì)介紹模板》課件
- 常用中醫(yī)適宜技術(shù)目錄
- 沖壓模具價(jià)格估算方法
- 碳納米管應(yīng)用研究
- 運(yùn)動(dòng)技能學(xué)習(xí)與控制課件第十一章運(yùn)動(dòng)技能的練習(xí)
- 蟲洞書簡全套8本
- 2023年《反電信網(wǎng)絡(luò)詐騙法》專題普法宣傳
- 小學(xué)數(shù)學(xué)五年級上、下冊口算題大全
- 和平精英電競賽事
評論
0/150
提交評論