ucos期末復(fù)習(xí)整理2023版_第1頁
ucos期末復(fù)習(xí)整理2023版_第2頁
ucos期末復(fù)習(xí)整理2023版_第3頁
ucos期末復(fù)習(xí)整理2023版_第4頁
ucos期末復(fù)習(xí)整理2023版_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論