




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、嵌入式操作系統(tǒng)ucOS-II分析ucOS-II應(yīng)用程序基本結(jié)構(gòu)void task ( void* pdata )INT8U err;InitTimer(); / 可選For( ; ) / 你的應(yīng)用程序代碼 . OSTimeDly(1); / 可選一些重要的ucOS-II API)任務(wù)類)消息類)同步類)時間類)臨界區(qū)與事件類任務(wù)類和時間類是必須要首先掌握的兩種類型的API )OSTaskCreate函數(shù)函數(shù) n這個函數(shù)應(yīng)該至少在main函數(shù)內(nèi)調(diào)用一次,在OSInit函數(shù)調(diào)用之后調(diào)用,以創(chuàng)建一個任務(wù)。n系統(tǒng)首先從TCB空閑列表內(nèi)申請一個空的TCB指針,然后根據(jù)用戶給出的參數(shù)初始化任務(wù)堆棧,并在內(nèi)
2、部的任務(wù)就緒表內(nèi)標(biāo)記該任務(wù)為就緒狀態(tài)。最后返回,這樣一個任務(wù)就創(chuàng)建成功了。 )OSTaskSuspend函數(shù)函數(shù) n將指定的任務(wù)掛起。如果掛起的是當(dāng)前任務(wù),會引發(fā)系統(tǒng)執(zhí)行任務(wù)切換先導(dǎo)函數(shù)OSShed來進(jìn)行一次任務(wù)切換。 n這個函數(shù)只有一個優(yōu)先級參數(shù),在系統(tǒng)內(nèi)部,優(yōu)先級除了表示一個任務(wù)執(zhí)行的先后次序外,還起著區(qū)分每一個任務(wù)的作用,即優(yōu)先級也是任務(wù)的ID。所以uCOS-II不允許出現(xiàn)相同優(yōu)先級的任務(wù)。 )OSTaskResume函數(shù)函數(shù) n將指定的已經(jīng)掛起的任務(wù)恢復(fù)成就緒狀態(tài)。如果恢復(fù)任務(wù)的優(yōu)先級高于當(dāng)前任務(wù),那么還會引發(fā)一次任務(wù)切換。 n參數(shù)類似OSTaskSuspend函數(shù),為指定任務(wù)的優(yōu)先級
3、。需要特別說明是,本函數(shù)并不要求和OSTaskSuspend函數(shù)成對使用。 )OS_ENTER_CRITICAL宏宏 n分析一下OS_CPU.H文件,它涉及特定CPU的實(shí)現(xiàn)。一般都被替換為一條或者幾條嵌入式匯編代碼。其實(shí),它就是關(guān)中斷。 n只要任務(wù)不主動放棄CPU使用權(quán),別的任務(wù)就沒有占用CPU的機(jī)會,這個任務(wù)就是獨(dú)占了。進(jìn)入臨界區(qū)后,這個應(yīng)宏盡量少用,它會破壞系統(tǒng)的一些服務(wù),尤其是時間服務(wù)。并使系統(tǒng)對外界響應(yīng)性能降低。 )OS_EXIT_CRITICAL宏宏 n與OS_ENTER_CRITICAL配套使用的一個宏,在系統(tǒng)手冊說明里它是退出臨界區(qū),其實(shí)就是重新開中斷。n它必須和OS_ENTER
4、_CRITICAL成對出現(xiàn),否則會帶來意想不到的后果,如系統(tǒng)會崩潰。我們應(yīng)盡量少用這兩個宏調(diào)用,因?yàn)樗麄兊拇_會破壞系統(tǒng)的多任務(wù)性能。 )OSTimeDly函數(shù)函數(shù) n這是調(diào)用最多的一個函數(shù),它的功能是先掛起當(dāng)前任務(wù),然后進(jìn)行任務(wù)切換,在指定的時間到來之后,將當(dāng)前任務(wù)恢復(fù)為就緒狀態(tài),但是并不一定運(yùn)行,如果恢復(fù)后是優(yōu)先級最高的就緒任務(wù)話,那么就運(yùn)行之。n可以將任務(wù)延時一定時間后再執(zhí)行它,依靠時鐘機(jī)制進(jìn)行任務(wù)切換,暫時放棄CPU的使用權(quán),但多任務(wù)性能會降低。ucOS-II范例的源碼分析INCLUDES.H nucOS-II中所有的 *.C 文件都包括了以下定義:#include includes.h
5、“n唯一的缺點(diǎn)是INCLUDES.H中許多頭文件在一些*.C文件的編譯中是不需要的。雖然逐個編譯這些文件要花費(fèi)額外的時間,但代碼的可移植性卻增加了。 不依賴于編譯的數(shù)據(jù)類型 可移植型數(shù)據(jù)類型的程序可移植型數(shù)據(jù)類型的程序Typedef unsigned char BOOLEAN;Typedef unsigned char INT8U;Typedef signed char INT8S;Typedef unsigned int INT16U;Typedef signed int INT16S;Typedef unsigned long INT32U;Typedef signed long INT3
6、2S;Typedef float FP32;Typedef double FP64;#define BYTE INT8S -|#define UBYTE INT8U -|#define WORD INT16S -| ucos-ucosII#define UWORD INT16U -|#define LONG INT32S -|#define ULONG INT32U -|全局變量 n定義全局宏的程序定義全局宏的程序#ifdef xxx_GLOBALS#define xxx_EXT#else#define xxx_EXT extern#endif.H 文件中每個全局變量都加上了xxx_EXT的前
7、綴。xxx代表模塊的名字。該模塊的.C文件中有以下定義:#define xxx_GLOBALS#include includes.huCOS_II.H中有以下定義: n#ifdef OS_GLOBALSn#define OS_EXTn#elsen#define OS_EXT externn#endif nOS_EXT INT32U OSIdleCtr;nOS_EXT INT32U OSIdleCtrRun;nOS_EXT INT32U OSIdleCtrMax;uCOS_II.C中有以下定義: n#define OS_GLOBALSn#include “includes.h” 當(dāng)編譯器處理uC
8、OS_II.C時,它使uCOS_II.H變成如下所示,因?yàn)镺S_EXT被設(shè)置為空。編譯器就會將這些全局變量分配到內(nèi)存中。 nINT32U OSIdleCtr;nINT32U OSIdleCtrRun;nINT32U OSIdleCtrMax;當(dāng)編譯器處理其他.C文件時,頭文件變成了如下的樣子,因?yàn)镺S_GLOBAL沒有定義,所以O(shè)S_EXT被定義為extern。 nextern INT32U OSIdleCtr;nextern INT32U OSIdleCtrRun;nextern INT32U OSIdleCtrMax;在這種情況下,不產(chǎn)生內(nèi)存分配,而任何 .C文件都可以使用這些變量。這樣的
9、就只需在 .H 文件中定義一次就可以了。OS_ENTER_CRITICAL() 和和 OS_EXIT_CRITICAL()nOS_ENTER_CRITICAL() 關(guān)中斷;OS_EXIT_CRITICAL()開中斷。n是為了保護(hù)臨界段代碼,這些代碼與處理器有關(guān)。宏的定義在OS_CPU.H中。n關(guān)中斷會影響中斷延遲,所以要特別小心。用戶還可以用信號量來保護(hù)臨界段代碼。 基于PC的服務(wù) nPC.C 文件和 PC.H 文件是范例中使用到的一些基于PC的服務(wù)程序。 nPC.C包括字符顯示,時間度量和其他各種服務(wù)。所有的函數(shù)都以PC_為前綴。 字符顯示 nPC_DispClrScr()Clear the
10、 screennPC_DispClrLine() Clear a single row (or line)nPC_DispChar()Display a single ASCII character anywhere on the screennPC_DispStr()Display an ASCII string anywhere on the screen時間度量 n用PC的82C54定時器2測試一個函數(shù)的運(yùn)行花了多少時間。被測的程序代碼放在函數(shù)PC_ElapsedStart()和PC_ElapsedStop()之間來測量。在用這兩個函數(shù)之前,應(yīng)該調(diào)用PC_ElapsedInit()來初始
11、化,它主要是計算運(yùn)行這兩個函數(shù)本身所附加的的時間。這樣,PC_ElapsedStop()函數(shù)中返回的數(shù)值就是準(zhǔn)確的測量結(jié)果了。這兩個函數(shù)都不具備可重入性,不要有多個任務(wù)同時調(diào)用這兩個函數(shù)。 測量PC_DisplayChar()的執(zhí)行時間(us)n測量代碼執(zhí)行時間的程序測量代碼執(zhí)行時間的程序INT16U time; PC_ElapsedInit();.PC_ElapsedStart();PC_DispChar(40, 24, A, DISP_FGND_WHITE);time = PC_ElapsedStop();應(yīng)用應(yīng)用 C/OS-II 的范例的范例 n用BC IDE (Integrated D
12、evelopment Environment)編譯通過,在WindowsXP 的DOS窗口下編譯運(yùn)行??蓤?zhí)行代碼在每個范例的OBJ子目錄中。 IDE中編譯選項(xiàng)中編譯選項(xiàng)nCode generation Model: LargeOptions: Treat enums as intsAssume SS Equals DS: Default for memory modelnAdvanced code generation Floating point: EmulationInstruction set: 80186Options: Generate underbars Debug info in
13、 OBJs Fast floating pointIDE中編譯選項(xiàng)中編譯選項(xiàng)nOptimizationsGlobal register allocation Invariant code motion Induction variables Loop optimization Suppress redundant loads Copy propagation Dead code elimination Jump optimization In-line intrinsic functionsIDE中編譯選項(xiàng)中編譯選項(xiàng)nRegister variables AutomaticnCommon su
14、bexpressions Optimize globallynOptimize for Speed例例1n有13個任務(wù)(包括 C/OS-II 的空閑任務(wù)和一個計算CPU利用率的任務(wù))。TaskStart()在函數(shù)main()中建立,功能是建立其它任務(wù)并且在屏幕上顯示如下統(tǒng)計信息:n每秒鐘任務(wù)切換次數(shù);CPU利用百分率;寄存器切換次數(shù);目前日期和時間;C/OS-II的版本號;n TaskStart()還檢查是否按下ESC鍵,以決定是否返回到DOS。n其余10個任務(wù)基于相同的代碼Task();每個任務(wù)在屏幕上隨機(jī)的位置顯示一個0到9的數(shù)字。main() nmain()程序從清整個屏幕開始,為的是保
15、證屏幕上不留有以前的DOS下的顯示。n用戶在使用任何服務(wù)之前先調(diào)用OSInit() 。建立兩個任務(wù):空閑任務(wù)和統(tǒng)計任務(wù),前者在沒有其它任務(wù)處于就緒態(tài)時運(yùn)行;后者計算CPU的利用率。main()程序程序nvoid main (void) PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); (1) OSInit(); (2) PC_DOSSaveReturn(); /保存當(dāng)前DOS環(huán)境 (3) PC_VectSet(uCOS, OSCtxSw); /設(shè)置 CPU寄存器切換 (4) RandomSem = OSSemCreate(1); /信號量置為1
16、,在某一時刻只有一個任務(wù)可以調(diào)用隨機(jī)數(shù)產(chǎn)生函數(shù) (5) OSTaskCreate(TaskStart, (void *)0, /啟動多任務(wù)OSStart()之前,用戶至少要先建立一個任務(wù)如TaskStart()(void*)&TaskStartStkTASK_STK_SIZE-1, 0); (6) OSStart(); /啟動多任務(wù) (7)OSInit()初始化【在OS_CORE.C中定義】 void OSInit (void)#if OS_VERSION = 204 OSInitHookBegin(); /系統(tǒng)初始化開始接口函數(shù)#endif OS_InitMisc(); /初始化變量
17、 OS_InitRdyList(); /初始化任務(wù)就緒列表 OS_InitTCBList(); /初始化任務(wù)控制塊列表 OS_InitEventList(); /初始化事件控制塊列表 OSInit()初始化(續(xù))#if (OS_VERSION = 251) & (OS_FLAG_EN 0) & (OS_MAX_FLAGS 0) OS_FlagInit(); /事件標(biāo)志結(jié)構(gòu)初始化 #endif#if (OS_MEM_EN 0) & (OS_MAX_MEM_PART 0) OS_MemInit(); /內(nèi)存管理初始化 #endif#if (OS_Q_EN 0) &
18、(OS_MAX_QS 0) OS_QInit(); /消息隊(duì)列初始化 #endifOS_InitTaskIdle(); /創(chuàng)建空閑任務(wù)(無條件) #if OS_TASK_STAT_EN 0 OS_InitTaskStat(); /創(chuàng)建統(tǒng)計任務(wù) #endif#if OS_VERSION = 204 OSInitHookEnd(); /系統(tǒng)初始化結(jié)束接口函數(shù)#endif#if OS_VERSION = 270 & OS_DEBUG_EN 0 OSDebugInit();#endifOS_InitMisc()初始化變量 nOSIntNesting = 0; /清除中斷嵌套計數(shù)器 nOSLoc
19、kNesting = 0; /清除調(diào)度鎖定計數(shù)器 nOSTaskCtr = 0; /任務(wù)數(shù)清零nOSRunning = FALSE; /系統(tǒng)多任務(wù)沒有執(zhí)行 nOSIdleCtr = 0L; /清除空閑任務(wù)計數(shù)器nOSCtxSwCtr = 0; /清除程序切換計數(shù)器 OS_InitRdyList()初始化任務(wù)就緒列表 nstatic void OS_InitRdyList (void) INT8U i; INT8U *prdytbl; OSRdyGrp = 0 x00; /清除任務(wù)就緒表 prdytbl = &OSRdyTbl0; /將OSRdyTbl數(shù)組全部初始化0 for (i =
20、0; i OS_RDY_TBL_SIZE; i+) *prdytbl+ = 0 x00; /把任務(wù)就緒表里面所有的項(xiàng)目全部清零 OSPrioCur = 0; /當(dāng)前運(yùn)行任務(wù)的優(yōu)先級寄存器清零 OSPrioHighRdy = 0; /將處于就緒狀態(tài)的最高優(yōu)先級的任務(wù)寄存器清零 OSTCBHighRdy = (OS_TCB *)0; /將處于就緒態(tài)的最高優(yōu)先級的任務(wù)控制塊指針寄存器清零 OSTCBCur = (OS_TCB *)0; /將當(dāng)前運(yùn)行任務(wù)的任務(wù)控制塊指針寄存器清零 OSTCBList = (OS_TCB *)0; /任務(wù)控制塊列表清零 for (i = 0; i (OS_LOWEST_
21、PRIO + 1); i+) OSTCBPrioTbli = (OS_TCB *)0; / 清除優(yōu)先級列表,這個列表存儲各個優(yōu)先級對應(yīng)的任務(wù)控制塊的地址,系統(tǒng)用它來尋找下一個要運(yùn)行的任務(wù)地址OS_InitTCBList()初始化任務(wù)控制塊列表nstatic void OS_InitTCBList (void) INT8U i; OS_TCB *ptcb1; OS_TCB *ptcb2; OS_MemClr(INT8U *)&OSTCBTbl0, sizeof(OSTCBTbl); / 清除TCB OS_MemClr(INT8U *)&OSTCBPrioTbl0, sizeof(
22、OSTCBPrioTbl); / 清除優(yōu)先級表 ptcb1 = &OSTCBTbl0; /任務(wù)控制塊列表的第一個任務(wù)塊地址給變量PTCB1 ptcb2 = &OSTCBTbl1; /任務(wù)控制塊列表的第二個任務(wù)塊地址給變量PTCB2 for (i = 0; i OSTCBNext = ptcb2;#if OS_TASK_NAME_SIZE 1 ptcb1-OSTCBTaskName0 = ?; /* Unknown name */ ptcb1-OSTCBTaskName1 = OS_ASCII_NUL;/把前一個任務(wù)控制塊的下一個任務(wù)指針指向下一個任務(wù)控制塊 #endif ptc
23、b1+; ptcb2+; ptcb1-OSTCBNext = (OS_TCB *)0; /把最后一個人物控制塊的下個指針清零 #if OS_TASK_NAME_SIZE 1 ptcb1-OSTCBTaskName0 = ?; /* Unknown name */ ptcb1-OSTCBTaskName1 = OS_ASCII_NUL;#endif OSTCBList = (OS_TCB *)0; /TCB列表初始化 OSTCBFreeList = &OSTCBTbl0; /把第一個任務(wù)控制塊的地址送給空閑任務(wù)控制塊列表 建立其它任務(wù)的任務(wù)建立其它任務(wù)的任務(wù) TaskStart() nv
24、oid TaskStart (void *data)Prevent compiler warning by assigning data to itself; Display banner identifying this as EXAMPLE #1; (1)/在屏幕頂端顯示一個標(biāo)識,說明這是例1 。 OS_ENTER_CRITICAL(); PC_VectSet(0 x08, OSTickISR); (2) PC_SetTickRate(200); (3) /關(guān)中斷,以改變中斷向量,讓其指向C/OS-II的時鐘節(jié)拍處理,然后,改變時鐘節(jié)拍為 200Hz OS_EXIT_CRITICAL();
25、 建立其它任務(wù)的任務(wù)建立其它任務(wù)的任務(wù) TaskStart()(續(xù))(續(xù))Initialize the statistic task by calling OSStatInit(); (4)Create 10 identical tasks; /建立10個同樣的任務(wù) (5) for (;) Display the number of tasks created; Display the % of CPU used; Display the number of task switches in 1 second; Display uC/OS-IIs version number If (key
26、was pressed) if (key pressed was the ESCAPE key) PC_DOSReturn(); Delay for 1 Second; 測試CPU速度 void OSStatInit (void) OSTimeDly(2); /延時兩個時鐘節(jié)拍 (1) OS_ENTER_CRITICAL(); OSIdleCtr = 0L; /32位的計數(shù)器OSIdleCtr被清0,并產(chǎn)生另一個延時,這個延時使OSStatInit()掛起 。(2) OS_EXIT_CRITICAL();/uCOS-II執(zhí)行一個無限循環(huán)的空閑任務(wù),不斷的遞增OSIdleCtr OSTimeDl
27、y(OS_TICKS_PER_SEC); (3) OS_ENTER_CRITICAL(); OSIdleCtrMax = OSIdleCtr; (4) OSStatRdy = TRUE; /COS-II將統(tǒng)計CPU的利用率 (5) OS_EXIT_CRITICAL(); 在屏幕隨機(jī)位置顯示任務(wù)號(09) void Task (void *data) UBYTE x; UBYTE y; UBYTE err; for (;) OSSemPend(RandomSem, 0, &err); /獲取信號量RandomSem ,同時禁止其他任務(wù)運(yùn)行這段代碼 (1) x = random(80);
28、/獲得一個隨機(jī)數(shù) (2) y = random(16); /獲得一個隨機(jī)數(shù) OSSemPost(RandomSem); /計算出x和y坐標(biāo)并釋放信號量 (3) PC_DispChar(x, y + 5, *(char *)data, DISP_FGND_LIGHT_GRAY);/在計算的坐標(biāo)處顯示其任務(wù)號(0-9) (4) OSTimeDly(1); /延時一個時鐘節(jié)拍,等待進(jìn)入下一次循環(huán) (5) 例1的運(yùn)行結(jié)果例例2n磁盤文件為SOFTWAREuCOS-IIEX2_x86L,它包含9個任務(wù)。加上uCOS-II本身的兩個任務(wù):空閑任務(wù)(idle task)和統(tǒng)計任務(wù),共11個任務(wù)。 n由mai
29、n()中的TaskStart()函數(shù)建立任務(wù),功能是建立其他任務(wù)并在屏幕上顯示如下的統(tǒng)計數(shù)據(jù): 每秒種任務(wù)切換的次數(shù); CPU利用率的百分比; 當(dāng)前日期和時間; uCOS_II的版本號;n使用帶擴(kuò)展功能的任務(wù)建立函數(shù)OSTaskCreateExt()和uCOS-II的堆棧檢查操作(要使用堆棧檢查操作必須用OSTaskCreateExt()建立任務(wù))。C/OS-II stack checking uCOS-II的堆棧檢查功能要求任務(wù)建立時堆棧清零。OSTaskCreateExt()可以執(zhí)行此項(xiàng)操作(設(shè)置選項(xiàng)OS_TASK_OPT_STK_CHK和OS_TASK_OPT_STK_CLR打開此項(xiàng)操作
30、)。OSTaskCreateExt()進(jìn)行堆棧清零操作是一項(xiàng)很費(fèi)時的工作,取決于堆棧的大小。執(zhí)行堆棧檢查操作的時候,uCOS-II從棧底向棧頂搜索非0元素(參看上圖),同時用一個計數(shù)器記錄0元素的個數(shù)。main() n例2的main()函數(shù)和例1的看起來差不多;n有兩點(diǎn)區(qū)別:第一,main()函數(shù)調(diào)用PC_ElapsedInit()來初始化定時器記錄OSTaskStkChk()的執(zhí)行時間。第二,所有的任務(wù)都使用OSTaskCreateExt()函數(shù)來建立(替代了OSTaskCreate()函數(shù)),這使得每一個任務(wù)都可進(jìn)行堆棧檢查。 例例2中的中的Main()函數(shù)()函數(shù) nvoid main
31、(void) PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); OSInit(); PC_DOSSaveReturn(); PC_VectSet(uCOS, OSCtxSw); PC_ElapsedInit(); (1) /對消逝時間的測量進(jìn)行初始化 OSTaskCreateExt(TaskStart, (void *)0, &TaskStartStkTASK_STK_SIZE-1, TASK_START_PRIO, TASK_START_ID, &TaskStartStk0, TASK_STK_SIZE, (void *)0,
32、 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); (2) OSStart();除了OSTaskCreate()函數(shù)的四個參數(shù)外,OSTaskCreateExt()還需要五個參數(shù):任務(wù)的ID,一個指向任務(wù)堆棧棧底的指針,堆棧的大?。ㄒ远褩卧獮閱挝?,80X86中為字),一個指向用戶定義的TCB擴(kuò)展數(shù)據(jù)結(jié)構(gòu)的指針,和一個用于指定對任務(wù)操作的變量。 TaskStart()nTaskStart()建立兩個郵箱,分別提供給任務(wù)4和任務(wù)5。n接著建立一個專門顯示時間和日期的任務(wù),隨后又建立5個不同的任務(wù)。TaskStart()的偽碼 nvoid TaskStart
33、(void *data) Prevent compiler warning by assigning data to itself; Display a banner and non-changing text; Install uC/OS-IIs tick handler; /關(guān)中斷,PC_VectSet() Change the tick rate to 200 Hz; /PC_SetTickRate() ,開中斷 Initialize the statistics task;/OSStatInit()以上幾項(xiàng)操作和例1中的相同。 TaskStart()的偽碼(續(xù))nCreate 2 ma
34、ilboxes which are used by Task #4 and #5; (1) n/ 調(diào)用TaskStartCreateTasks(void)nCreate a task that will display the date and time on the screen;(2) nCreate 5 application tasks; nfor (;) Display #tasks running; Display CPU usage in %; Display #context switches per seconds; Clear the context switch coun
35、ter; Display uC/OS-IIs version; If (Key was pressed) if (Key pressed was the ESCAPE key) Return to DOS; Delay for 1 second; 創(chuàng)建2個郵箱n通過調(diào)用2個OSMboxCreate(void *)0)函數(shù),創(chuàng)建2個郵箱。n這2個郵箱在任務(wù)4與任務(wù)5中使用。TaskStartCreateTasks(void)nstatic void TaskStartCreateTasks (void)nn OSTaskCreateExt(TaskClk, (void *)0,n &Ta
36、skClkStkTASK_STK_SIZE - 1,n TASK_CLK_PRIO, TASK_CLK_ID, &TaskClkStk0,n TASK_STK_SIZE, (void *)0,n OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);n OSTaskCreateExt(Task1, (void *)0, n &Task1StkTASK_STK_SIZE - 1,n TASK_1_PRIO, TASK_1_ID,&Task1Stk0,n TASK_STK_SIZE, (void *)0,n OS_TASK_OPT_STK_C
37、HK | OS_TASK_OPT_STK_CLR);nn OSTaskCreateExt(Task5, .);n時鐘顯示任務(wù)nTaskClk()函數(shù)用于顯示當(dāng)前日期和時間,每秒更新一次。 時鐘顯示任務(wù)程序 nvoid TaskClk (void *data) Struct time now; Struct date today; char s40; data = data; for (;) PC_GetDateTime(s); PC_DispStr(0, 24, s, DISP_FGND_BLUE + DISP_BGND_CYAN); OSTimeDly(OS_TICKS_PER_SEC);
38、任務(wù)1n任務(wù)1將檢查其他七個任務(wù)堆棧的大小,同時記錄OSTackStkChk()函數(shù)的執(zhí)行時間,并與堆棧大?。ㄋ卸褩5拇笮《际且宰止?jié)為單位)一起顯示出來。任務(wù)1每秒執(zhí)行10次(間隔100ms)。任務(wù)1程序 nvoid Task1 (void *pdata) INT8U err; OS_STK_DATA data; /任務(wù)堆棧數(shù)據(jù) INT16U time; /執(zhí)行時間(us) INT8U i; char s80; pdata = pdata; 任務(wù)1程序 (續(xù))for (;) for (i = 0; i 7; i+) PC_ElapsedStart(); (1) err = OSTaskStk
39、Chk(TASK_START_PRIO+i, &data); time = PC_ElapsedStop(); (2) if (err = OS_NO_ERR) sprintf(s, %3ld %3ld %3ld %5d, data.OSFree + data.OSUsed, data.OSFree, data.OSUsed, time); PC_DispStr(19, 12+i, s, DISP_FGND_YELLOW); OSTimeDlyHMSM(0, 0, 0, 100); (3) /延時100ms 任務(wù)2 n任務(wù)2在屏幕上顯示一個順時針旋轉(zhuǎn)的指針(用橫線,斜線等字符表示),每
40、200ms旋轉(zhuǎn)一格。 任務(wù)2程序nvoid Task2 (void *data) data = data; for (;) PC_DispChar(70, 15, |, DISP_FGND_WHITE + DISP_BGND_RED); OSTimeDly(10); PC_DispChar(70, 15, /, DISP_FGND_WHITE + DISP_BGND_RED);任務(wù)2程序 (續(xù))OSTimeDly(10); PC_DispChar(70, 15, -, DISP_FGND_WHITE + DISP_BGND_RED); OSTimeDly(10); PC_DispChar(70
41、, 15, , DISP_FGND_WHITE + DISP_BGND_RED); OSTimeDly(10); 任務(wù)3 n任務(wù)3也顯示了一個旋轉(zhuǎn)指針,但是與任務(wù)2旋轉(zhuǎn)的方向不同。任務(wù)3在堆棧中分配了一個很大的數(shù)組,將堆棧填充掉,使得OSTaskStkChk()只需花費(fèi)很少的時間來確定堆棧的利用率,尤其是當(dāng)堆棧已經(jīng)快滿的時候。任務(wù)3程序nvoid Task3 (void *data) char dummy500; INT16U i; data = data; for (I = 0; i 499; i+) dummyi = ?; 任務(wù)3程序 (續(xù))for (;) PC_DispChar(70,
42、16, |, DISP_FGND_WHITE + DISP_BGND_BLUE); OSTimeDly(20); PC_DispChar(70, 16, , DISP_FGND_WHITE + DISP_BGND_BLUE); OSTimeDly(20); PC_DispChar(70, 16, -, DISP_FGND_WHITE + DISP_BGND_BLUE); OSTimeDly(20); PC_DispChar(70, 16, /, DISP_FGND_WHITE + DISP_BGND_BLUE); OSTimeDly(20); 任務(wù)4 n任務(wù)4向任務(wù)5發(fā)送消息并等待確認(rèn)。發(fā)送的
43、消息是一個指向字符的指針。每當(dāng)任務(wù)4從任務(wù)5收到確認(rèn),就將傳遞的ASCII碼加1再發(fā)送,結(jié)果是不斷的傳送“ABCDEFG.”。任務(wù)4程序nvoid Task4 (void *data) char txmsg; INT8U err; data = data; txmsg = A;任務(wù)4程序 (續(xù))for (;) while (txmsg OSTCBExtPtr; (3) if (puser != (void *)0) (4)/如果任務(wù)分配了TCB擴(kuò)展數(shù)據(jù)結(jié)構(gòu) puser-TaskCtr+; (5)/計數(shù)器TaskCtr進(jìn)行累加以統(tǒng)計任務(wù)被切換的頻繁程度,或檢查某個任務(wù)是否在運(yùn)行。 puser-TaskExecTime= time; (6)/記錄函數(shù)從切入到切出的運(yùn)行
溫馨提示
- 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山東省安全員《C證》考試題庫
- 2025江蘇省建筑安全員-B證(項(xiàng)目經(jīng)理)考試題庫
- 南川承包魚塘合同范本
- 三年級口算題目練習(xí)集1000道
- 二年級口算題目總匯100道
- 2025年山東省建筑安全員《C證》考試題庫及答案
- 上海買車合同范本
- 醫(yī)院機(jī)器維修合同范本
- 企業(yè)委托服務(wù)合同范本
- 單位專項(xiàng)培訓(xùn)合同范本
- 地理-天一大聯(lián)考2025屆高三四省聯(lián)考(陜晉青寧)試題和解析
- 小巴掌童話課件
- 教科版六年級科學(xué)下冊全冊教學(xué)設(shè)計教案
- 部編版小學(xué)五年級下冊《道德與法治》全冊教案含教學(xué)計劃
- 運(yùn)動會活動流程中的醫(yī)療安全保障措施
- 2025公司員工試用期合同(范本)
- 初中數(shù)學(xué)新課程標(biāo)準(zhǔn)(2024年版)
- GB/T 19342-2024手動牙刷一般要求和檢測方法
- 2024年山東鐵投集團(tuán)招聘筆試參考題庫含答案解析
- 8款-組織架構(gòu)圖(可編輯)
- 美的集團(tuán)公司分權(quán)手冊
評論
0/150
提交評論