




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、UCOS-II移植ARM的讀書筆記導(dǎo)讀:昨天晚上邊看移植代碼邊記下來的筆記不知道怎么回事在保存的時候竟然不見了,關(guān)鍵是我是第一次也是正式開始移植的學(xué)習(xí)之路啊,今天在工作之前先把昨天的筆記重新回顧一下,UCOS-II的移植需要提供2,真是很郁悶,昨天晚上邊看移植代碼邊記下來的筆記不知道怎么回事在保存的時候竟然不見了。5555。一個晚上工作的結(jié)果啊,關(guān)鍵是我是第一次也是正式開始移植的學(xué)習(xí)之路啊。真是夠倒霉的。今天在工作真是很郁悶,昨天晚上邊看移植代碼邊記下來的筆記不知道怎么回事在保存的時候竟然不見了。5555。一個晚上工作的結(jié)果啊,關(guān)鍵是我是第一次也是正式開始移植的學(xué)習(xí)之路啊。真是夠倒霉的。今天在
2、工作之前先把昨天的筆記重新回顧一下,其實后來想想也許是件好事,可以讓我今天在不借助其他的幫助的情況下自己看代碼自己跟自己講一遍,其實很多看起來是倒霉看起來是灰心的事情把我們的觀點換一下那么就是一件好事。這樣的情況發(fā)生在我的身上已經(jīng)挺多次了。好啦,廢話不說,開始補(bǔ)昨天的日記UCOS-II的移植需要提供2,3個文件分別介紹如下:一:OS_CPU.H1 與編譯器有關(guān)的數(shù)據(jù)類型只是按照不同的編譯器編寫對應(yīng)的數(shù)據(jù)類型的typedef對應(yīng)于ARM7的數(shù)據(jù)類型的編寫如下typedef unsigned char BOOLEAN; /* 布爾變量 */typedef unsigned char INT8U;
3、/* 無符號8位整型變量 */typedef signed char INT8S; /* 有符號8位整型變量 */typedef unsigned short INT16U; /* 無符號16位整型變量 */typedef signed short INT16S; /* 有符號16位整型變量 */typedef unsigned int INT32U; /* 無符號32位整型變量 */typedef signed int INT32S; /* 有符號32位整型變量 */typedef float FP32; /* 單精度浮點數(shù)(32位長度) */typedef double FP64; /*
4、雙精度浮點數(shù)(64位長度) */在上面定義的各種數(shù)據(jù)類型中按照ARM7的堆棧寬度選擇INT32Utypedef INT32U OS_STK; /* 堆棧是32位寬度 */接下來一部分是為了兼容低版本UCOS的數(shù)據(jù)類型所編寫的代碼,在UCOS-II中暫不考慮2 與處理器相關(guān)的代碼先定義中斷的實現(xiàn)方式,預(yù)先設(shè)定的中斷方式有三種,在ARM7中設(shè)置為方式2 #define OS_CRITICAL_METHOD 2 /* 選擇開、關(guān)中斷的方式 */接下來的一段是我暫時還沒有完全搞懂的一部分,只知道是設(shè)定了12個軟件中斷的函數(shù),當(dāng)調(diào)用這些函數(shù)之前都會執(zhí)行對應(yīng)中斷號的事情。具體的看到后面應(yīng)該能完全搞懂軟件中
5、斷的實現(xiàn)方式,該段代碼在后面的文件中會有具體的解釋,這里暫時不看定義堆棧的生長方式,ARM7內(nèi)核支持兩種生長方式,但是ADS的C語言編譯器只支持從上往下的生長方式,因此:#define OS_STK_GROWTH 1 /* 堆棧是從上往下長的,0從下往上的生長方式 */最后幾行分別定義了用戶模式01和系統(tǒng)模式1f以及IRQ中斷禁止的指令80三個立即數(shù),方便調(diào)用。還有兩個預(yù)定義往后看應(yīng)該知道作用,暫不考慮,不是很重要。二:OS_CPU_C.C個文件中要求用戶編寫10個簡單的C函數(shù),但是只有1個函數(shù)是必要的,其余的函數(shù)必須聲明,但不一定要包含任何代碼,大致看了一下作用好像是用來調(diào)試之類的。唯一要編
6、寫的是OSTaskStkInit()OSTaskStkInit()函數(shù)的功能是初始化任務(wù)的棧結(jié)構(gòu),任務(wù)的堆棧結(jié)構(gòu)與CPU的體系結(jié)構(gòu)、編譯器有密切的關(guān)聯(lián)。從ARM的結(jié)構(gòu)可以寫出如下的棧結(jié)構(gòu):程序計數(shù)器PC,程序鏈接器LR,R12R1,R0用于傳遞第一個參數(shù)pdata,CPSR/SPSR,關(guān)中斷計數(shù)器(用于計算關(guān)中斷的次數(shù),這樣就實現(xiàn)了中斷的嵌套),返回的地址指針是指向的最后一個存入的數(shù)據(jù),而不是一個空地址。軟件中斷異常SWI服務(wù)程序C語言部分void SWI_Exception(int SWI_Num, int *Regs):參數(shù)SWI_Num對應(yīng)前面文件中定義的功能號,其中0、1號的功能在后面
7、的文件中定義,這里只定義了其他10個功能。2、3分別對應(yīng)關(guān)中斷和開中斷關(guān)中斷:MRS R0, SPSR /在軟件中斷的時候直接對程序狀態(tài)保存寄存器SPSR操作也就是對CPSR的操作ORR R0, R0, #NoInt /在匯編語言中對寄存器的對應(yīng)位置位用ORR,清零用BICMSR SPSR_c, R0 /SPSR_c表示的是只改變SPSR的控制段的8位代碼,其他三段_f,_s,_x中標(biāo)志位在_f段,其他為保留位開中斷:MRS R0, SPSR /在開中斷中基本與上面相同,只是ORR改成BIC清零BIC R0, R0, #NoIntMSR SPSR_c, R由于需要實現(xiàn)中斷嵌套,所以只有當(dāng)關(guān)中斷
8、的計數(shù)器減為0的時候才能夠開中斷,而且每次關(guān)中斷的時候該計數(shù)器都應(yīng)該加1。另外,插入?yún)R編語言時用_asm指令。80、81、82、83分別對應(yīng)系統(tǒng)模式、用戶模式、ARM指令集、THUMB指令集 系統(tǒng)模式:MRS R0, SPSRBIC R0, R0, #0x1f /先將控制模式的低5位清零ORR R0, R0, #SYS32Mode /設(shè)置成系統(tǒng)模式的1F MSR SPSR_c, R0用戶模式:MRS R0, SPSRBIC R0, R0, #0x1fORR R0, R0, #USR32Mode /設(shè)置成用戶模式的10 MSR SPSR_c, R0ARM指令集與THUMB指令集的代碼如下:ptc
9、b = OSTCBPrioTblRegs0;if (ptcb != NULL)ptcb -> OSTCBStkPtr1 &= (1 << 5);ptcb = OSTCBPrioTblRegs0;if (ptcb != NULL)ptcb -> OSTCBStkPtr1 |= (1 << 5);昨天就是看到這里,出現(xiàn)了一個意識到是不能忽悠的地方就是UCOS里面的任務(wù)控制塊OS_TCB的概念,因此今天的任務(wù)就是把這部分看看。- -一點一點來,什么不會就學(xué)什么,都不會就都學(xué)。沒有問題只要你肯努力。 _OSStartHighRdyMSR CPSR_c, #(
10、NoInt | SYS32Mode) ;MSR:在ARM中只有MSR能夠直接設(shè)置狀態(tài)寄存器CPSR或SPSR,可以是立即數(shù)或者源寄存器,NoInt是禁止中斷,SYS32Mode是系統(tǒng)模式;告訴uC/OS-II自身已經(jīng)運行LDR R4, =OSRunning ;OSRunning正在運行多任務(wù)的標(biāo)志,OSRunning是把OSRunning的地址加載到R4,R4里存的是一個地址。MOV R5, #1STRB R5, R4 ;將R5存儲到R4存的地址的變量即OSRunning中,也就是將OSRunning置1BL OSTaskSwHook ;調(diào)用鉤子函數(shù),OSTaskSwHook 是用于擴(kuò)展的,在
11、任務(wù)切換的時候執(zhí)行用戶自己定義的功能。LDR R6, =OSTCBHighRdy ;OSTCBHighRdy指向最高優(yōu)先級任務(wù)的控制塊TCB的指針!將放指針的地址放到R6中。LDR R6, R6 ;將R6地址處的數(shù)據(jù)讀出即OSTCBHighRdy的地址放到R6中B OSIntCtxSw_1 ;跳轉(zhuǎn)到OSIntCtxSw_1AREA SWIStacks, DATA, NOINIT,ALIGN=2SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;管理模式堆??臻g繼續(xù)昨天沒有看完的代碼OSIntCtxSw導(dǎo)讀:移植的工作難以分析下去,LDRR2,SP,#20;獲取PC
12、,放入R2LDRR12,SP,#16;獲取R12,/R12存的什么東西啊?MRSR0,CPSRMSRCPSR_c,#(NoInt|SYS32Mode);進(jìn)入系統(tǒng)模式并禁止中斷MOVR1,LR;R1放LR值STMFDSP!,R1-R2;保存LR,PC,將R1,R2存入SPSTMFDSP!,R4-R12;保LDR R2, SP, #20 ;獲取PC,放入R2LDR R12, SP, #16 ;獲取R12,/R12存的什么東西???MRS R0, CPSRMSR CPSR_c, #(NoInt | SYS32Mode) ;進(jìn)入系統(tǒng)模式并禁止中斷 MOV R1, LR ;R1放LR值STMFD SP!,
13、 R1-R2 ;保存LR,PC,將R1,R2存入SP STMFD SP!, R4-R12 ;保存R4-R12,將R4-12存入SP MSR CPSR_c, R0 ;再回到之前的模式LDMFD SP!, R4-R7 ;獲取R0-R3ADD SP, SP, #8 ;出棧R12,PCMSR CPSR_c, #(NoInt | SYS32Mode)STMFD SP!, R4-R7 ;保存R0-R3LDR R1, =OsEnterSum ;獲取OsEnterSumLDR R2, R1STMFD SP!, R2, R3 ;保存CPSR,OsEnterSum ;保存當(dāng)前任務(wù)堆棧指針到當(dāng)前任務(wù)的TCB LDR
14、 R1, =OSTCBCurLDR R1, R1STR SP, R1BL OSTaskSwHook ;調(diào)用鉤子函數(shù);OSPrioCur <= OSPrioHighRdyLDR R4, =OSPrioCurLDR R5, =OSPrioHighRdyLDRB R6, R5STRB R6, R4;OSTCBCur <= OSTCBHighRdyLDR R6, =OSTCBHighRdyLDR R6, R6LDR R4, =OSTCBCurSTR R6, R4OSIntCtxSw_1;獲取新任務(wù)堆棧指針LDR R4, R6 ;把OSTCBHighRdy指向最高優(yōu)先級任務(wù)的控制塊TCB的指
15、針給R4ADD SP, R4, #68 ;17寄存器:CPSR,OsEnterSum,R0-R12,LR,SPLDR LR, SP, #-8 ;取出LR放到LRMSR CPSR_c, #(NoInt | SVC32Mode) ;進(jìn)入管理模式并且保持禁止中斷MOV SP, R4 ;設(shè)置堆棧指針LDMFD SP!, R4, R5 ;CPSR,OsEnterSum。LDMFD數(shù)據(jù)出棧,放入R4,R5;恢復(fù)新任務(wù)的OsEnterSumLDR R3, =OsEnterSum ;OsEnterSum的地址存入R3STR R4, R3 ;把R4的值賦給OsEnterSumMSR SPSR_cxsf, R5
16、;恢復(fù)CPSR;在管理模式里是修改SPSRLDMFD SP!, R0-R12, LR, PC ;運行新任務(wù) ,恢復(fù)現(xiàn)場,異常處理返回- - -移植的工作難以分析下去,先來幾個UCOS的使用范例看看吧第一個范例:void main (void)PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); /* PC的清屏函數(shù),PC_DispClrScr(INT8U color),這里調(diào)用時是前景色為白色,背景色為黑色*/OSInit(); /* Initialize uC/OS-II ,初始化UCOS-II,在使用任何功能之前必須調(diào)用OSInit函數(shù),建立兩
17、個任務(wù):空閑任務(wù)所有其他任務(wù)均未就緒時運行,統(tǒng)計任務(wù)計算CPU的利用率*/PC_DOSSaveReturn(); /* Save environment to return to DOS 允許程序在正式開始多任務(wù)前,保存重要的寄存器的值,以保證UCOS能夠正常地返回DOS */PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-II's context switch vector ,用于設(shè)定中斷向量表的內(nèi)容。*/RandomSem = OSSemCreate(1); /* Random number semaphore,建立一個信號量,并制定信號量的
18、初值為1,OSSemCreate(1)返回一個指向信號量的指針,那么之后對該信號量的操作全部通過這個指針來實現(xiàn) */OSTaskCreate(TaskStart, (void *)0, &TaskStartStkTASK_STK_SIZE - 1, 0); /*至少建立一個任務(wù),TaskStart為指向該任務(wù)運行代碼的指針,第二個參數(shù)是一個指向任務(wù)初始化數(shù)據(jù)的指針,第三個是任務(wù)的堆棧棧頂,當(dāng)堆棧是從上到下,必須把堆棧高地址傳給該函數(shù),最后一個參數(shù)指定建立的任務(wù)的優(yōu)先級,數(shù)值越小優(yōu)先級越高,每個任務(wù)的優(yōu)先級都是介于062之間獨一無二的。*/OSStart(); /* Start mult
19、itasking,調(diào)用該函數(shù)將控制權(quán)交給內(nèi)核,開始運行多任務(wù) */OSStart函數(shù)會讓優(yōu)先級最高的就緒任務(wù)開始運行,即TaskStartvoid TaskStart (void *pdata)#if OS_CRITICAL_METHOD = 3 /* Allocate storage for CPU status register */OS_CPU_SR cpu_sr;#endifchar s100;INT16S key;pdata = pdata; /* Prevent compiler warning,這是這個參數(shù)是當(dāng)任務(wù)建立時傳遞過來的一個指針 */TaskStartDispInit(
20、); /* Initialize the display 初始化屏幕顯示 */OS_ENTER_CRITICAL(); /*關(guān)中斷*/PC_VectSet(0x08, OSTickISR); /* Install uC/OS-II's clock tick ISR */PC_SetTickRate(OS_TICKS_PER_SEC); /* Reprogram tick rate */OS_EXIT_CRITICAL(); /*開中斷*/OSStatInit(); /* Initialize uC/OS-II's statistics測試所使用的處理器的速度,得知處理器在運行所
21、有應(yīng)用任務(wù)時實際的CPU使用率 */TaskStartCreateTasks(); /* Create all the application tasks建立更多任務(wù),10個顯示不同字符的任務(wù),在每次建立一個新任務(wù)的時候,UCOS都會判斷新建立的任務(wù)是否比建立它們的任務(wù)優(yōu)先級更高,如果更高,這個新建立的任務(wù)將立刻開始運行。 */for (;) TaskStartDisp(); /* Update the display */if (PC_GetKey(&key) = TRUE) /* See if key has been pressed */if (key = 0x1B) /* Ye
22、s, see if it's the ESCAPE key */PC_DOSReturn(); /* Return to DOS */OSCtxSwCtr = 0; /* Clear context switch counter 每秒都將記錄任務(wù)切換次數(shù)的清零 */OSTimeDlyHMSM(0, 0, 1, 0); /* Wait one second 將自身掛起1s,1s是通過四個參數(shù)傳送的,小時,分鐘,秒,毫秒 */ static void TaskStartCreateTasks (void)INT8U i;for (i = 0; i < N_TASKS; i+) /*
23、Create N_TASKS identical tasks */TaskDatai = '0' + i; /* Each task will display its own letter */OSTaskCreate(Task, (void *)&TaskDatai, &TaskStkiTASK_STK_SIZE - 1, i + 1);導(dǎo)讀:上面的函數(shù)循環(huán)建立了十個Task任務(wù),下面是Task任務(wù)的代碼voidTask(void*pdata)INT8Ux;INT8Uy;INT8Uerr;for(;)OSSemPend(RandomSem,0,&err
24、);/*獲取信號量*/x=random(80);/*獲得隨機(jī)數(shù)x*/y=random(16);/*獲得隨機(jī)數(shù)y*/OSSemPos上面的函數(shù)循環(huán)建立了十個Task任務(wù),下面是Task任務(wù)的代碼void Task (void *pdata)INT8U x;INT8U y;INT8U err;for (;) OSSemPend(RandomSem, 0, &err); /* 獲取信號量*/x = random(80); /* 獲得隨機(jī)數(shù)x*/y = random(16); /*獲得隨機(jī)數(shù)y*/OSSemPost(RandomSem); /* 釋放信號量*/* Display the tas
25、k number on the screen */PC_DispChar(x, y + 5, *(char *)pdata, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);OSTimeDly(1); /* Delay 1 clock tick 通知ucos該任務(wù)本次運行已經(jīng)結(jié)束,可以讓其他低優(yōu)先級的任務(wù)運行了,參數(shù)1代表該任務(wù)延時1個時鐘節(jié)拍,在200Hz的情況下就是5ms */- - -范例二:void main (void)OS_STK *ptos;OS_STK *pbos;INT32U size;PC_DispClrScr(DISP_FGND_WHITE
26、); /* Clear the screen */OSInit(); /* Initialize uC/OS-II */ PC_DOSSaveReturn(); /* Save environment to return to DOS */PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-II's context switch vector */PC_ElapsedInit(); /* Initialized elapsed time measurement 初始化時間測量功能,用來精確地記錄PC_ElapsedStart()和PC_Elapsed
27、Stop()的函數(shù)調(diào)用時刻,通過這兩個時刻的差值可以很容易得到這兩個時刻之間的執(zhí)行代碼的運行時間 */ptos = &TaskStartStkTASK_STK_SIZE - 1; /* TaskStart() will use Floating-Point */pbos = &TaskStartStk0;size = TASK_STK_SIZE;OSTaskStkInit_FPE_x86(&ptos, &pbos, &size);OSTaskCreateExt(TaskStart,(void *)0,ptos,TASK_START_PRIO,TASK_S
28、TART_ID, /*任務(wù)標(biāo)志符,范例二中沒有使用它*/ pbos,size,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* 使用了OSTaskCreate的擴(kuò)展函數(shù),支持對堆棧的修改和運行時對堆棧容量的檢查。最后一個參數(shù)的設(shè)置表明允許堆棧檢查并且需要在任務(wù)建立時將堆棧清零*/OSStart(); /* Start multitasking 讓最高優(yōu)先級的任務(wù)運行即TaskStart*/TaskStart的代碼如下:void TaskStart (void *pdata)#if OS_CRITICAL_METHOD = 3 /*
29、 Allocate storage forCPU status register */OS_CPU_SR cpu_sr;#endifINT16S key;pdata = pdata; /* Prevent compiler warning */TaskStartDispInit(); /* Setup the display 初始化屏幕,在該函數(shù)內(nèi)部設(shè)定屏幕初始化的圖像*/OS_ENTER_CRITICAL(); /* 關(guān)中斷 */PC_VectSet(0x08, OSTickISR);PC_SetTickRate(OS_TICKS_PER_SEC); /* Reprogram tick ra
30、te 設(shè)定時鐘節(jié)拍大小 */OS_EXIT_CRITICAL();OSStatInit(); /* Initialize uC/OS-II's statistics 測試所使用的處理器的速度,得知處理器在運行所有應(yīng)用任務(wù)時實際的CPU使用率 */AckMbox = OSMboxCreate(void *)0); /* Create 2 message mailboxes在范例二中涉及到了消息的概念,任務(wù)4將向任務(wù)5發(fā)送消息,并且任務(wù)5會回復(fù)一個應(yīng)答消息,因此這里建立了兩個通信工具即郵箱,它允許任務(wù)或中斷向另一個任務(wù)發(fā)送指針變量*/TxMbox = OSMboxCreate(void *
31、)0);TaskStartCreateTasks(); /* Create all other tasks 創(chuàng)建所有其他的任務(wù) */for (;) TaskStartDisp(); /* Update the display 更新各項統(tǒng)計數(shù)據(jù)并顯示*/if (PC_GetKey(&key) /* See if key has been pressed */if (key = 0x1B) /* Yes, see if it's the ESCAPE key */PC_DOSReturn(); /* Yes, return to DOS */OSCtxSwCtr = 0; /* C
32、lear context switch counter */OSTimeDly(OS_TICKS_PER_SEC); /* Wait one second 掛起1s */創(chuàng)建其他六個任務(wù),暫不執(zhí)行,只是創(chuàng)建,等待CPU被放出static void TaskStartCreateTasks (void)OSTaskCreateExt(TaskClk,(void *)0,&TaskClkStkTASK_STK_SIZE - 1,TASK_CLK_PRIO,TASK_CLK_ID,&TaskClkStk0,TASK_STK_SIZE,(void *)0,OS_TASK_OPT_STK
33、_CHK | OS_TASK_OPT_STK_CLR); OSTaskCreateExt(Task1,(void *)0,&Task1StkTASK_STK_SIZE - 1,TASK_1_PRIO,TASK_1_ID,&Task1Stk0,TASK_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); OSTaskCreateExt(Task2,(void *)0,&Task2StkTASK_STK_SIZE - 1,TASK_2_PRIO,TASK_2_ID,&Task2Stk0,TAS
34、K_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);導(dǎo)讀:OSTaskCreateExt(Task3,(void*)0,&Task3StkTASK_STK_SIZE-1,TASK_3_PRIO,TASK_3_ID,&Task3Stk0,TASK_STK_SIZE,(void*)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);OSTaskCreateExtOSTaskCreateExt(Task3,(void *)0,&Task3StkTASK_STK_SIZ
35、E - 1,TASK_3_PRIO,TASK_3_ID,&Task3Stk0,TASK_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); OSTaskCreateExt(Task4,(void *)0,&Task4StkTASK_STK_SIZE-1,TASK_4_PRIO,TASK_4_ID,&Task4Stk0,TASK_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); OSTaskCreateExt(Task5,(
36、void *)0,&Task5StkTASK_STK_SIZE-1,TASK_5_PRIO,TASK_5_ID,&Task5Stk0,TASK_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); 分別看其他幾個任務(wù)的代碼如下:void Task1 (void *pdata)INT8U err;OS_STK_DATA data; /* Storage for task stack data */INT16U time; /* Execution time (in uS) */INT8U i;char s80
37、;pdata = pdata;for (;) for (i = 0; i < 7; i+) PC_ElapsedStart();err = OSTaskStkChk(TASK_START_PRIO + i, &data); /*該函數(shù)是用來檢查任務(wù)堆棧使用情況*/time = PC_ElapsedStop(); /*測量上面的OSTaskStkChk函數(shù)的運行時間,方法是將這個函數(shù)放在PC_ElapsedStart()和PC_ElapsedStop()之間即可,它會返回以ms計量的時間間隔*/if (err = OS_NO_ERR) sprintf(s, "%4ld %
38、4ld %4ld %6d",data.OSFree + data.OSUsed,data.OSFree,data.OSUsed,time);/*data是上面檢查任務(wù)堆棧使用情況的函數(shù)的第二個參數(shù),也是它的返回值之一*/PC_DispStr(19, 12 + i, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);/*把統(tǒng)計結(jié)果打印出來*/OSTimeDlyHMSM(0, 0, 0, 100); /* Delay for 100 mS 100ms掛起一次 */void Task2 (void *data)data = data;for (;) PC
39、_DispChar(70, 15, '|', DISP_FGND_YELLOW + DISP_BGND_BLUE); OSTimeDly(10);PC_DispChar(70, 15, '/', DISP_FGND_YELLOW + DISP_BGND_BLUE);OSTimeDly(10);PC_DispChar(70, 15, '-', DISP_FGND_YELLOW + DISP_BGND_BLUE); OSTimeDly(10);PC_DispChar(70, 15, '', DISP_FGND_YELLOW + DIS
40、P_BGND_BLUE); OSTimeDly(10);/*由四個字符輪流顯示的任務(wù)*/void Task3 (void *data)char dummy500;INT16U i;data = data;for (i = 0; i < 499; i+) /* Use up the stack with 'junk' */dummyi = '?'for (;) PC_DispChar(70, 16, '|', DISP_FGND_YELLOW + DISP_BGND_BLUE); OSTimeDly(20);PC_DispChar(70, 1
41、6, '', DISP_FGND_YELLOW + DISP_BGND_BLUE); OSTimeDly(20);PC_DispChar(70, 16, '-', DISP_FGND_YELLOW + DISP_BGND_BLUE); OSTimeDly(20);PC_DispChar(70, 16, '/', DISP_FGND_YELLOW + DISP_BGND_BLUE); OSTimeDly(20);void Task4 (void *data)char txmsg;INT8U err;data = data;txmsg = '
42、A'for (;) OSMboxPost(TxMbox, (void *)&txmsg); /* Send message to Task #5向郵箱TxMbox發(fā)送一個字符 */OSMboxPend(AckMbox, 0, &err); /* Wait for acknowledgement from Task #5等待應(yīng)答,第二個參數(shù)指定了等待超時的時限,單位為時鐘節(jié)拍 */txmsg+; /* Next message to send更新消息 */if (txmsg = 'Z') txmsg = 'A' /* Start new s
43、eries of messages */void Task5 (void *data)char *rxmsg;INT8U err;data = data;for (;) rxmsg = (char *)OSMboxPend(TxMbox, 0, &err); /* Wait for message from Task #4無限期等待郵箱消息 */PC_DispChar(70, 18, *rxmsg, DISP_FGND_YELLOW + DISP_BGND_BLUE);OSTimeDlyHMSM(0, 0, 1, 0); /* Wait 1 second 掛起1s */OSMboxPo
44、st(AckMbox, (void *)1); /* Acknowledge reception of msg 給郵箱AckMbox發(fā)送消息 */最后一個任務(wù)void TaskClk (void *data)char s40;導(dǎo)讀:data=data;for(;)PC_GetDateTime(s);/*得到PC當(dāng)前的日期和時間*/PC_DispStr(60,23,s,DISP_FGND_YELLOW+DISP_BGND_BLUE);OSTimeDly(OS_TICKS_PER_SEC);-data = data;for (;) PC_GetDateTime(s); /*得到PC當(dāng)前的日期和時間
45、*/PC_DispStr(60, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); OSTimeDly(OS_TICKS_PER_SEC);-范例三:在該范例中首先定義了一個用戶任務(wù)數(shù)據(jù)結(jié)構(gòu),在這個結(jié)構(gòu)中有該范例所需要的數(shù)據(jù)參數(shù),和每個任務(wù)相關(guān)的,因此定了一個該數(shù)據(jù)結(jié)構(gòu)類型的變量數(shù)組,分配給7個自建的任務(wù)另外使用了消息隊列的通訊方式,可以容納多則消息。建立消息隊列需要兩個元素即OS_EVENT的數(shù)據(jù)結(jié)構(gòu)和一串指針。void main (void)PC_DispClrScr(DISP_BGND_BLACK); /* Clear the screen */OSI
46、nit(); /* Initialize uC/OS-II */ PC_DOSSaveReturn(); /* Save environment to return to DOS */PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-II's context switch vector */PC_ElapsedInit(); /* Initialized elapsed time measurement */strcpy(TaskUserDataTASK_START_ID.TaskName, "StartTask"); OSTa
47、skCreateExt(TaskStart,(void *)0,&TaskStartStkTASK_STK_SIZE - 1,TASK_START_PRIO,TASK_START_ID,&TaskStartStk0,TASK_STK_SIZE,&TaskUserDataTASK_START_ID,/*在UCOS中,每個任務(wù)的TCB控制塊都可以保存一個用戶定義的數(shù)據(jù)結(jié)構(gòu)的指針*/0);OSStart(); /* Start multitasking */ void TaskStart (void *pdata)#if OS_CRITICAL_METHOD = 3 /* A
48、llocate storage for CPU status register */OS_CPU_SR cpu_sr;#endifINT16S key;pdata = pdata; /* Prevent compiler warning */TaskStartDispInit(); /* Setup the display */OS_ENTER_CRITICAL(); /* Install uC/OS-II's clock tick ISR */PC_VectSet(0x08, OSTickISR);PC_SetTickRate(OS_TICKS_PER_SEC); /* Reprog
49、ram tick rate */OS_EXIT_CRITICAL();OSStatInit(); /* Initialize uC/OS-II's statistics */MsgQueue = OSQCreate(&MsgQueueTbl0, MSG_QUEUE_SIZE); /* Create a message queue 建立了一個消息隊列*/TaskStartCreateTasks();for (;) TaskStartDisp(); /* Update the display */if (PC_GetKey(&key) /* See if key has b
50、een pressed */if (key = 0x1B) /* Yes, see if it's the ESCAPE key */PC_DOSReturn(); /* Yes, return to DOS */OSCtxSwCtr = 0; /* Clear the context switch counter */OSTimeDly(OS_TICKS_PER_SEC); /* Wait one second */void TaskStartCreateTasks (void)strcpy(TaskUserDataTASK_CLK_ID.TaskName, "Clock
51、Task");OSTaskCreateExt(TaskClk,(void *)0,&TaskClkStkTASK_STK_SIZE - 1,TASK_CLK_PRIO,TASK_CLK_ID,&TaskClkStk0,TASK_STK_SIZE,&TaskUserDataTASK_CLK_ID,0);strcpy(TaskUserDataTASK_1_ID.TaskName, "MsgQ Rx Task"); OSTaskCreateExt(Task1,(void *)0,&Task1StkTASK_STK_SIZE - 1,TAS
52、K_1_PRIO,TASK_1_ID,&Task1Stk0,TASK_STK_SIZE,&TaskUserDataTASK_1_ID,0);strcpy(TaskUserDataTASK_2_ID.TaskName, "MsgQ Tx Task #2"); OSTaskCreateExt(Task2,(void *)0,&Task2StkTASK_STK_SIZE - 1,TASK_2_PRIO,TASK_2_ID,&Task2Stk0,TASK_STK_SIZE,&TaskUserDataTASK_2_ID,0);strcpy(TaskUserDataTASK_3_ID.TaskName, "MsgQ Tx Task #3"); OSTaskCreateExt(Task3,(void *)0,&Task3StkTASK_STK_SIZE - 1,TASK_3_PRIO,TASK_3_ID,&Task3Stk0,TASK_STK_SIZE,&TaskUserDataTASK_3_ID,0);strcpy(TaskUserDataTASK_4_ID.TaskName, "MsgQ Tx Task #4"); OSTaskCreateExt(Task4,(vo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 買羊購銷合同范本
- 味多美工作合同范例
- 升降平臺加工合同范本
- 廚房雜件采購合同范本
- 咨政課題申報書范文
- 吊扇購銷合同范例
- 凈菜供貨合同范例
- 北京買房還是租房合同范例
- 品牌對接推廣合同范本
- 中電投合同范本
- 安徽2025年安徽醫(yī)科大學(xué)第一附屬醫(yī)院臨床醫(yī)技護(hù)理管理崗位招聘156人筆試歷年參考題庫附帶答案詳解
- 旅游景區(qū)股份合作開發(fā)協(xié)議書范本
- 2025年湖南有色金屬職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫匯編
- 2025年湖南信息職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫參考答案
- 學(xué)情分析方案及學(xué)情分析報告范文
- 《CRISPR-Cas9及基因技術(shù)》課件
- 《急性冠狀動脈綜合征》課件
- 【博觀研究院】2025年跨境進(jìn)口保健品市場分析報告
- 游戲直播平臺推廣合作協(xié)議
- 《高科技服裝與面料》課件
- 《馬克思生平故事》課件
評論
0/150
提交評論