ucosii學(xué)習(xí)中文書第1在這本書里的約定_第1頁
ucosii學(xué)習(xí)中文書第1在這本書里的約定_第2頁
ucosii學(xué)習(xí)中文書第1在這本書里的約定_第3頁
ucosii學(xué)習(xí)中文書第1在這本書里的約定_第4頁
ucosii學(xué)習(xí)中文書第1在這本書里的約定_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

在這一章里將提供三個(gè)范例來說明如何使用μC/OS-II。筆者之所以在本書一開始就寫這一章是為了讓讀者盡快開始使用μC/OS-II。在開始講述這些例子之前,筆者想先說明一這些例子曾經(jīng)用BorlandC/C++編譯器(V3.1)編譯過,用選擇項(xiàng)產(chǎn)生In/AMD80186處理器(大模式下編譯)的代碼。這些代碼實(shí)際上是在InPentiumIIPC(300MHz)上運(yùn)行和測試過,InPentiumIIPC可以看成是特別快的80186。筆者選擇PC做為目標(biāo)系PCEPROMEPROM真器中程序等等。用戶只需要簡單地編譯、和執(zhí)行。其次,使用BorlandC/C++產(chǎn)CPUPentium-IIDOSWindows955MbuC/OS-II。A:INSTALLdriveINSTALL.BATDOS的批處理文件,位于磁盤的根下。它會(huì)自動(dòng)在讀者指定的目標(biāo)驅(qū)動(dòng)器中建立\SOFTWARE并且將uCOS-II.EXE文件從A:驅(qū)動(dòng)器到\SOFTWARE并μC/OS-II\SOFTWARE下添加所有的INSTALL.BATuCOS-II.EXE并且將改為\SOFTWARE\uCOS-II\EX1_x86L錄下應(yīng)該有一下子:這是 下 這 TO存放在 下。DOS下的可執(zhí)行文件(HPLIST.EXE)存放在TO(D,HPLISTCTOTO.CDOS(TO.EXETOTO.TBL文件,它必須放在根下。用戶可以在\SOFTWARE\TO\EXE 下與μC/OS-II相關(guān)的文件都放在這 這 這 這 這 *.C#include#includeINCLUDE.H可以使用戶不必在工程項(xiàng)目中每個(gè)*.C文件中都考慮需要什么樣的頭文件。INCLUDES.H,3\SOFTWARE\uCOS-II\EX1_x86L\SOFTWARE\uCOS-II\EX2_x86L,以及TypedefTypedefunsignedcharBOOLEAN;TypedefunsignedcharINT8U;TypedefsignedcharINT8S;TypedefunsignedintINT16U;TypedefsignedTypedefunsignedTypedefsignedlongTypedefTypedef#define#define#define#define#define#defineINT16U16μC/OS-II065,535μCO/S-II32INT16UμC/OS-IIINT16U1.1BorlandC/C++編譯器為例,為80x86μC/OSBYTE,WORD,LONGμC/OSμC/OS-IIWORD3216Cextern.C和.H文件中定義。這種重復(fù)#ifdef#ifdef#define#definexxx_EXT#definexxx_EXT.Hxxx_EXTxxx.C#define#define#includexxx_EXT已經(jīng)定義。所以編譯器給每個(gè)全局變量分配內(nèi)存空間,而當(dāng)編譯器處理其他.C文件時(shí),uC/OS_II.H,其中包括以下定義:#ifdef#ifdefOS_GLOBALS#defineOS_EXT#defineOS_EXTOS_EXTOS_EXTOS_EXT#define#define#includeOS_GLOBALOS_EXTextern。externexternexternextern到。9.03.02#define OS_CRITICAL_METHOD==#define OS_CRITICAL_METHOD==#defineOS_ENTER_CRITICAL()asm{PUSHF;#defineOS_EXIT_CRITICAL()asmPOPFOS_CRITICAL_METHOD==OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()PC.C文件和PC.H文件(在\SOFTWARE\BLOCKS\PC\SOURCE下)是筆者在范例中使PCμC/OS-II(即μC/OS)不同,筆者希望集PC_為前綴。B800:0000以把#defineconstantDISP_BASE0xB8000xB000。(1)(0)中#defienconstantsPC.C Clearthescreen Clearasinglerow(orline) DisyasingleASCIIcharacteranywhereonthescreen DisyanASCIIstringanywhereonthescreenC的82C4定時(shí)器2PC_ElapedStar()和PC_ElapsdStop(P_ElapseInit()C_ElapsdStop(個(gè)函數(shù)不具備重入性所以,須,不要多個(gè)任同時(shí)調(diào)這兩個(gè)函數(shù)。表1.4說明了何測量P_DisChar()執(zhí)時(shí)間。注,時(shí)間以u(píng)S為位的。INT16UINT16U..PC_DispChar(40,24,‘A’,time=譯其他單線程的程序一樣編譯和用戶程序。所生成的.EXE程序可以在DOS下裝載和運(yùn)DOSμC/OS-IIDOS。調(diào)用都會(huì)使DOS環(huán)境被破壞,從而導(dǎo)致DOS或WINDOWS95下的DOS窗口。MM-DD-YYHH:MM:SS,19BorlandC/C++gettime()getdateDOSCPC_GetKey()精確地為20.000Hz。筆者決定將時(shí)鐘節(jié)拍設(shè)得更快一些,用的是200Hz(實(shí)際是上是標(biāo)頻率,PC_SetTickRate()18.2Hz,82C54。PC_VectGet()PC_VectSet()很容易改寫,以適用于其它編譯器。的??蓤?zhí)行代碼可以在每個(gè)范例的OBJ子下找到。實(shí)際上這些代碼是在BorlandIDE(IntegratedDevelopmentEnvironment1.1表 CodeCode : :TreatenumsasAdvancedcodeAssumeSSEquals :DefaultforAdvancedcodeFloating :Instruction :GenerateunderbarsDebuginfoinOBJsFastfloatingpoint GlobalregisterallocationInvariantcodemotionInductionvariablesLoopoptimizationSuppressredundantloadsCopypropagationDeadcodeeliminationJumpoptimizationIn-lineintrinsicRegistervariables Commonsubexpressions OptimizegloballyOptimizefor BorlandC/C++C:\CPP下,如果用戶的編譯器是在不同的Options/DirectoriesIDEOS_???_EN。第一個(gè)范例可以在\SOFTWARE\uCOS_II\EX1_x86L下找到,它有13個(gè)任務(wù)(包括μC/OS-IIμC/OS-IICPU9main()DOS[L1.5(1)]。DOSμC/OS-IIOSInit[L1.5(2CPU程序L1.5voidvoidmain{PC_DispClrScr(DISP_FGND_WHITE+PC_VectSet(uCOS,RandomSem=(void(void*)&TaskStartStk[TASK_STK_SIZE-1],}DOSPC_DOSSaveReturn()[L1.5(3)]來保存的。這使得用戶可以返回到?jīng)]有運(yùn)行μC/OS-II以前的DOS環(huán)境。跟隨L1.6中的程序可以看到PC_DOSSaveReturn()做了很多事情。PC_DOSSaveReturn(首先設(shè)置PC_ExitFlag為FALSE[L1.6(1)]DOSOSTickDOSCtr1[L1.6(2)],因?yàn)镺STickISR(0OSTickISR1255。然后,PC_DOSSaveReturn()DOS的時(shí)鐘節(jié)拍處理(tickhandler)存入一個(gè)自由向量表入口中[L1.6(3)-(4)]μC/OS-IIPC_DOSSaveReturn()調(diào)jmp()[L1.6(5)],它將處理器狀態(tài)(即所有寄存器的值)PC_JumpBuf構(gòu)之中。保存處理器的全部寄存器使得程序返回到PC_DOSSaveReturn()并且在調(diào)用setjmp()PC_ExitFlagFALSE[L1.6(1)]。PC_DOSSaveReturn()跳if狀態(tài)語句[L1.6(6)–(9)]回到main()DOS,可以調(diào)用PC_DOSReturn()(程序L1.7),它設(shè)置PC_ExitFlag為TRUE,并且執(zhí)行l(wèi)ongjmp()語PC_ExitFlagTRUEifPC_DOSSaveReturn()將時(shí)鐘節(jié)拍改為18.2Hz[L1.6(6PC時(shí)鐘節(jié)拍中斷服務(wù)[L1.6(7)],清屏幕[L1.6(8)],通exit(0)DOS[L1.6(9)]。voidvoidPC_DOSSaveReturn{PC_ExitFlag=OSTickDOSCtrPC_TickISRPC_TickISR=PC_VectSet(VECT_DOS_CHAIN,if(PC_ExitFlag==TRUE){PC_VectSet(VECT_TICK,PC_DispClrScr(DISP_FGND_WHITE+}}程序L1.7設(shè)置返回DOSvoidvoidPC_DOSReturn{PC_ExitFlag=longjmp(PC_JumpBuf,}現(xiàn)在回到main()這個(gè)函數(shù),在程序L1.5中,main()調(diào)用PC_VectSet()來設(shè)0x80(128DOSBIOS1,意思是在某一時(shí)刻只有一個(gè)任務(wù)可以調(diào)用隨機(jī)數(shù)產(chǎn)生函數(shù)。立其它任務(wù),必須保證用戶的任務(wù)代碼全局變量OSStatRdy和延時(shí)程序[即調(diào)用已經(jīng)到了數(shù)據(jù)。例1中的主要工作由TaskStart()來完成。TaskStart()函數(shù)的示意代碼如程序18.2Hz200Hz[L1.8(3)]。在處理器改變中斷向量時(shí)以及系統(tǒng)沒有完全初始化前,當(dāng)然不希望有中斷打入!注意main()這個(gè)函數(shù)(見程序L1.5)在系統(tǒng)初始化的時(shí)候并μC/OS-IIvoidvoidTaskStart(void{Preventcompilerwarningbyassigning‘data’to ybanneridentifyingthisasEXAMPLEPC_VectSet(0x08,InitializethestatistictaskbycallingCreate10identicalfor(;;) ythenumberoftaskscreated; ythe%ofCPUused; ythenumberoftaskswitchesin1second; yuC/OS-II’sversionnumberIf(keywaspressed)if(keypressedwastheESCAPEkey){}}Delayfor1}}}沒有別的任務(wù)可以執(zhí)行,它只能執(zhí)行空閑任務(wù)(μC/OS-II??臻e任務(wù)是一個(gè)無最大值。而當(dāng)用戶再增加其他應(yīng)用代碼時(shí),空閑任務(wù)就不會(huì)占用那樣多的CPU時(shí)間。(TRUE[L1.9(5)]μC/OS-IICPUvoidvoidOSStatInit{ =OSIdleCtrMax= =}DOS程序L1.10給出了任務(wù)的代碼任務(wù)一開始調(diào)用OSSemPend()獲取信號(hào)量RandomSemL1.10(1)(的庫函數(shù)random()來獲得一個(gè)隨機(jī)數(shù)[程序L1.10(2)],此處設(shè)random()函數(shù)是不200102000voidvoidTask(void{UBYTEx;UBYTEUBYTEfor(;;)OSSemPend(RandomSem,0,x=y=PC_DispChar(x,y+5,*(char*)data, }}作(OSTaskCreateExt()建立任務(wù)—譯者注。當(dāng)用戶不知道應(yīng)擴(kuò)展,一般多分配10%,25%或者。如果系統(tǒng)對(duì)穩(wěn)定性要求高,則應(yīng)該多一倍以上。的。同時(shí)要OSTaskCreateExt()進(jìn)行堆棧操作是一項(xiàng)很費(fèi)時(shí)的工作,而且取決于uCOS-圖F μC/OS-IIstackL1.11一,main()函數(shù)調(diào)用PC_ElapsedInit()[程序清單L1.11(1)]來初始化定時(shí)器記錄OSTaskStkChk()的執(zhí)行時(shí)間。第二,所有的任務(wù)都使用OSTaskCreateExt()函數(shù)來建立任務(wù)OSTaskCreat(程序L1.11例2中的Main()函數(shù)voidvoidmain{PC_DispClrScr(DISP_FGND_WHITE+PC_VectSet(uCOS,PC_VectSet(uCOS,(void*)0,(voidOS_TASK_OPT_STK_CHK|}除了OSTaskCreate()函數(shù)的四個(gè)參數(shù)外,OSTaskCreateExt()還需要五個(gè)參數(shù)(一共9個(gè)ID,一個(gè)指向任務(wù)堆棧棧底的指針,堆棧的大?。ㄒ远褩卧獮閱挝?,80X86為字TCBuCOS-II2TCB程序L1.12列出了TaskStart()的偽碼。前五項(xiàng)操作和例1中相同。TaskStart()建立了兩個(gè)郵箱,分別提供給任務(wù)4和任務(wù)5[程序L1.12(1)]。除此之外,還建立了一程序L1.12TaskStart()的偽碼。voidvoidTaskStart(void{Preventcompilerwarningbyassigning‘data’to yabannerandnon-changingtext;InstalluC/OS-II’stickhandler;Changethetickrateto200Hz;Initializethestatisticstask;Create2mailboxeswhichareusedbyTask#4andCreateataskthatwilldis ythedateandtimeonthescreen;(2)Create5applicationtasks;for(;;) y#tasksrunning; yCPUusagein y#contextswitchesperseconds;Clearthecontextswitchcounter; yuC/OS-II’sIf(Keywaspressed)if(KeypressedwastheESCAPEkey){ReturntoDOS;}}Delayfor1}}序L1.13(1)–(2)],并與堆棧大小一起顯示出來。注意所有堆棧的大小都是以字節(jié)為單位的。任務(wù)1每秒執(zhí)行10次[程序L1.13(3)](間隔100msvoidTask1(void{OS_STK_DATAvoidTask1(void{OS_STK_DATApdata=for(;;)for(i=0;i<7;i++)err=time=if(err==OS_NO_ERR)sprintf(s,sprintf(s,+,PC_DispStr(19,12+i,s,}}OSTimeDlyHMSM(0,0,0,}}程序L1.14所示的任務(wù)2在屏幕上顯示一個(gè)順時(shí)針旋轉(zhuǎn)的指針(用橫線,斜線等字符表示—譯者注200msvoidTask2(void{datavoidTask2(void{data=data;for(;;){PC_DispChar(70,15,'|',DISP_FGND_WHITE+}+'-++}任務(wù)3(程序L1.15)也顯示了與任務(wù)2相同的一個(gè)旋轉(zhuǎn)指針但是旋轉(zhuǎn)的方向不同。程序L1.15任務(wù)voidvoidTask3(void{ INT16Ui;data=for(I=0;i<499;i++)dummy[i]=}for(;;)PC_DispChar(70,16,'|',DISP_FGND_WHITE+PC_DispChar(70,16,'\\',DISP_FGND_WHITE+PC_DispChar(70,16,'-',DISP_FGND_WHITE+PC_DispChar(70,16,'/',DISP_FGND_WHITE+}}任務(wù)4(程序L1.16)向任務(wù)5發(fā)送消息并等待確認(rèn)[程序L1.16(1)]。發(fā)送的消ASCII碼加1再發(fā)送[程序L1.16(3)],結(jié)果是不斷的傳送“ABCDEFG.程序L1.16任務(wù)voidvoidTask4(void{chartxmsg;INT8Uerr;data=data;txmsg='A';for(;;)whilewhile(txmsg<='Z')OSMboxPost(TxMbox,(void*)&txmsg);OSMboxPend(AckMbox,0,&err);}txmsg=}}當(dāng)任務(wù)5[程序L1.17]接收消息后[程序L1.17(1)](發(fā)送的字符,就將消息顯示到屏幕上[程序L1.17(2)],然后延時(shí)1秒[程序L1.17(3)],再向任務(wù)4發(fā)送程序L1.17任務(wù)voidvoidTask5(void{char*rxmsg;INT8Uerr;data=data;for(;;){rxmsg=(char*)OSMboxPend(TxMbox,0,PC_DispChar(70,18,*rxmsg,DISP_FGND_YELLOW+DISP_BGND_RED);OSTimeDlyHMSM(0,0,1,OSMboxPost(AckMbox,(void}}程序L1.18時(shí)鐘顯示任voidvoidTaskClk(void{Structtimenow;Structdatetoday;data=data;for(;;){PC_DispStr(0,24,s,DISP_FGND_BLUE+DISP_BGND_CYAN);}}(OSTaskwHook()main()函數(shù)[程序L1.19]和例2中的相不多,不同的是在用戶定義的TCB擴(kuò)展數(shù)據(jù)結(jié)構(gòu)中可以保存每個(gè)任務(wù)的名稱[程序L1.19(1)](擴(kuò)展結(jié)構(gòu)的在INCLUDES.H中定義,也可參看程序L1.20。筆者定義了30個(gè)字節(jié)來存放任務(wù)名(包括空格)[程序程序L1.19例3的main()函voidvoidmain{PC_DispClrScr(DISP_FGND_WHITE+PC_VectSet(uCOS,OSCtxSw);(void*)0,}typedefstruct}typedefstruct}程序L1.21TaskStart()的偽碼voidvoidTaskStart(void{Preventcompilerwarningbyassigning‘data’to yabannerandnon-changingtext;InstalluC/OS-II’stickhandler;Changethetickrateto200Hz;Initializethestatisticstask;CreateamessageCreateataskthatwillythedateandtimeontheCreate5applicationtaskswithanamestoredintheTCBfor(;;) y#tasksrunning; yCPUusagein y#contextswitchesperseconds;Clearthecontextswitchcounter; yuC/OS-II’sIf(Keywaspressed)if(KeypressedwastheESCAPEkey){ReturntoDOS;}}Delayfor1}}程序L1.22任務(wù)1voidvoidTask1(void{charone=chartwo='2';charthree=data=data;for(;;){OSQPost(MsgQueue,(voidOSTimeDlyHMSM(0,0,1,OSQPost(MsgQueue,(void*)&two);OSTimeDlyHMSM(0,0,0,500);OSQPost(MsgQueue,(voidOSTimeDlyHMSM(0,0,1,}}程序L1.23任務(wù)2voidvoidTask2(void{INT8U*msg;INT8Udata=data;for(;;){msg=(INT8U*)OSQPend(MsgQueue,0,PC_DispChar(70,14,*msg, OSTimeDlyHMSM(0,0,0,}}任務(wù)3同樣處于等待消息的掛起狀態(tài),但是它設(shè)定了等待結(jié)束時(shí)間250mSL1.24(1)]。如果有消息來到,任務(wù)3將顯示消息號(hào)[程序L1.24(3)],如果超過了等待時(shí)間,任務(wù)3就顯示“T(意為timeout)[程序L1.24(2)]。voidvoidTask3(void{INT8U*msg;INT8Udata=data;for(;;){msg=(INT8U*)OSQPend(MsgQueue,OS_TICKS_PER_SEC/4, If(err==OS_TIMEOUT)}else }}}任務(wù)4的操作只是從郵箱發(fā)送[程序L1.25(1)]和接收[程序L1.25(2)],這使得用戶可以測量任務(wù)在自己PC上執(zhí)行的時(shí)間任務(wù)4每10mS執(zhí)行一次[程序L1.25(3)]程序L1.25任務(wù)4voidvoidTask4(void{OS_EVENTdata=mbox=OSMboxCreate((void*)0);for(;;){OSMboxPost(mbox,(voidOSMboxPend(mbox,0,OSTimeDlyHMSM(0,0,0,}}CPU。程序L1.26任務(wù)5voidvoidTas

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論