ucOS-II范例分析_01_第1頁
ucOS-II范例分析_01_第2頁
ucOS-II范例分析_01_第3頁
ucOS-II范例分析_01_第4頁
ucOS-II范例分析_01_第5頁
已閱讀5頁,還剩93頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、嵌入式操作系統ucOS-II分析ucOS-II應用程序基本結構void task ( void* pdata )INT8U err;InitTimer(); / 可選For( ; ) / 你的應用程序代碼 . OSTimeDly(1); / 可選一些重要的ucOS-II API)任務類)消息類)同步類)時間類)臨界區(qū)與事件類任務類和時間類是必須要首先掌握的兩種類型的API )OSTaskCreate函數函數 n這個函數應該至少在main函數內調用一次,在OSInit函數調用之后調用,以創(chuàng)建一個任務。n系統首先從TCB空閑列表內申請一個空的TCB指針,然后根據用戶給出的參數初始化任務堆棧,并在內

2、部的任務就緒表內標記該任務為就緒狀態(tài)。最后返回,這樣一個任務就創(chuàng)建成功了。 )OSTaskSuspend函數函數 n將指定的任務掛起。如果掛起的是當前任務,會引發(fā)系統執(zhí)行任務切換先導函數OSShed來進行一次任務切換。 n這個函數只有一個優(yōu)先級參數,在系統內部,優(yōu)先級除了表示一個任務執(zhí)行的先后次序外,還起著區(qū)分每一個任務的作用,即優(yōu)先級也是任務的ID。所以uCOS-II不允許出現相同優(yōu)先級的任務。 )OSTaskResume函數函數 n將指定的已經掛起的任務恢復成就緒狀態(tài)。如果恢復任務的優(yōu)先級高于當前任務,那么還會引發(fā)一次任務切換。 n參數類似OSTaskSuspend函數,為指定任務的優(yōu)先級

3、。需要特別說明是,本函數并不要求和OSTaskSuspend函數成對使用。 )OS_ENTER_CRITICAL宏宏 n分析一下OS_CPU.H文件,它涉及特定CPU的實現。一般都被替換為一條或者幾條嵌入式匯編代碼。其實,它就是關中斷。 n只要任務不主動放棄CPU使用權,別的任務就沒有占用CPU的機會,這個任務就是獨占了。進入臨界區(qū)后,這個應宏盡量少用,它會破壞系統的一些服務,尤其是時間服務。并使系統對外界響應性能降低。 )OS_EXIT_CRITICAL宏宏 n與OS_ENTER_CRITICAL配套使用的一個宏,在系統手冊說明里它是退出臨界區(qū),其實就是重新開中斷。n它必須和OS_ENTER

4、_CRITICAL成對出現,否則會帶來意想不到的后果,如系統會崩潰。我們應盡量少用這兩個宏調用,因為他們的確會破壞系統的多任務性能。 )OSTimeDly函數函數 n這是調用最多的一個函數,它的功能是先掛起當前任務,然后進行任務切換,在指定的時間到來之后,將當前任務恢復為就緒狀態(tài),但是并不一定運行,如果恢復后是優(yōu)先級最高的就緒任務話,那么就運行之。n可以將任務延時一定時間后再執(zhí)行它,依靠時鐘機制進行任務切換,暫時放棄CPU的使用權,但多任務性能會降低。ucOS-II范例的源碼分析INCLUDES.H nucOS-II中所有的 *.C 文件都包括了以下定義:#include includes.h

5、“n唯一的缺點是INCLUDES.H中許多頭文件在一些*.C文件的編譯中是不需要的。雖然逐個編譯這些文件要花費額外的時間,但代碼的可移植性卻增加了。 不依賴于編譯的數據類型 可移植型數據類型的程序可移植型數據類型的程序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” 當編譯器處理uC

8、OS_II.C時,它使uCOS_II.H變成如下所示,因為OS_EXT被設置為空。編譯器就會將這些全局變量分配到內存中。 nINT32U OSIdleCtr;nINT32U OSIdleCtrRun;nINT32U OSIdleCtrMax;當編譯器處理其他.C文件時,頭文件變成了如下的樣子,因為OS_GLOBAL沒有定義,所以OS_EXT被定義為extern。 nextern INT32U OSIdleCtr;nextern INT32U OSIdleCtrRun;nextern INT32U OSIdleCtrMax;在這種情況下,不產生內存分配,而任何 .C文件都可以使用這些變量。這樣的

9、就只需在 .H 文件中定義一次就可以了。OS_ENTER_CRITICAL() 和和 OS_EXIT_CRITICAL()nOS_ENTER_CRITICAL() 關中斷;OS_EXIT_CRITICAL()開中斷。n是為了保護臨界段代碼,這些代碼與處理器有關。宏的定義在OS_CPU.H中。n關中斷會影響中斷延遲,所以要特別小心。用戶還可以用信號量來保護臨界段代碼。 基于PC的服務 nPC.C 文件和 PC.H 文件是范例中使用到的一些基于PC的服務程序。 nPC.C包括字符顯示,時間度量和其他各種服務。所有的函數都以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測試一個函數的運行花了多少時間。被測的程序代碼放在函數PC_ElapsedStart()和PC_ElapsedStop()之間來測量。在用這兩個函數之前,應該調用PC_ElapsedInit()來初始

11、化,它主要是計算運行這兩個函數本身所附加的的時間。這樣,PC_ElapsedStop()函數中返回的數值就是準確的測量結果了。這兩個函數都不具備可重入性,不要有多個任務同時調用這兩個函數。 測量PC_DisplayChar()的執(zhí)行時間(us)n測量代碼執(zhí)行時間的程序測量代碼執(zhí)行時間的程序INT16U time; PC_ElapsedInit();.PC_ElapsedStart();PC_DispChar(40, 24, A, DISP_FGND_WHITE);time = PC_ElapsedStop();應用應用 C/OS-II 的范例的范例 n用BC IDE (Integrated D

12、evelopment Environment)編譯通過,在WindowsXP 的DOS窗口下編譯運行??蓤?zhí)行代碼在每個范例的OBJ子目錄中。 IDE中編譯選項中編譯選項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中編譯選項中編譯選項nOptimizationsGlobal register allocation Invariant code motion Induction variables Loop optimization Suppress redundant loads Copy propagation Dead code elimination Jump optimization In-line intrinsic functionsIDE中編譯選項中編譯選項nRegister variables AutomaticnCommon su

14、bexpressions Optimize globallynOptimize for Speed例例1n有13個任務(包括 C/OS-II 的空閑任務和一個計算CPU利用率的任務)。TaskStart()在函數main()中建立,功能是建立其它任務并且在屏幕上顯示如下統計信息:n每秒鐘任務切換次數;CPU利用百分率;寄存器切換次數;目前日期和時間;C/OS-II的版本號;n TaskStart()還檢查是否按下ESC鍵,以決定是否返回到DOS。n其余10個任務基于相同的代碼Task();每個任務在屏幕上隨機的位置顯示一個0到9的數字。main() nmain()程序從清整個屏幕開始,為的是保

15、證屏幕上不留有以前的DOS下的顯示。n用戶在使用任何服務之前先調用OSInit() 。建立兩個任務:空閑任務和統計任務,前者在沒有其它任務處于就緒態(tài)時運行;后者計算CPU的利用率。main()程序程序nvoid main (void) PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); (1) OSInit(); (2) PC_DOSSaveReturn(); /保存當前DOS環(huán)境 (3) PC_VectSet(uCOS, OSCtxSw); /設置 CPU寄存器切換 (4) RandomSem = OSSemCreate(1); /信號量置為1

16、,在某一時刻只有一個任務可以調用隨機數產生函數 (5) OSTaskCreate(TaskStart, (void *)0, /啟動多任務OSStart()之前,用戶至少要先建立一個任務如TaskStart()(void*)&TaskStartStkTASK_STK_SIZE-1, 0); (6) OSStart(); /啟動多任務 (7)OSInit()初始化【在OS_CORE.C中定義】 void OSInit (void)#if OS_VERSION = 204 OSInitHookBegin(); /系統初始化開始接口函數#endif OS_InitMisc(); /初始化變量

17、 OS_InitRdyList(); /初始化任務就緒列表 OS_InitTCBList(); /初始化任務控制塊列表 OS_InitEventList(); /初始化事件控制塊列表 OSInit()初始化(續(xù))#if (OS_VERSION = 251) & (OS_FLAG_EN 0) & (OS_MAX_FLAGS 0) OS_FlagInit(); /事件標志結構初始化 #endif#if (OS_MEM_EN 0) & (OS_MAX_MEM_PART 0) OS_MemInit(); /內存管理初始化 #endif#if (OS_Q_EN 0) &

18、(OS_MAX_QS 0) OS_QInit(); /消息隊列初始化 #endifOS_InitTaskIdle(); /創(chuàng)建空閑任務(無條件) #if OS_TASK_STAT_EN 0 OS_InitTaskStat(); /創(chuàng)建統計任務 #endif#if OS_VERSION = 204 OSInitHookEnd(); /系統初始化結束接口函數#endif#if OS_VERSION = 270 & OS_DEBUG_EN 0 OSDebugInit();#endifOS_InitMisc()初始化變量 nOSIntNesting = 0; /清除中斷嵌套計數器 nOSLoc

19、kNesting = 0; /清除調度鎖定計數器 nOSTaskCtr = 0; /任務數清零nOSRunning = FALSE; /系統多任務沒有執(zhí)行 nOSIdleCtr = 0L; /清除空閑任務計數器nOSCtxSwCtr = 0; /清除程序切換計數器 OS_InitRdyList()初始化任務就緒列表 nstatic void OS_InitRdyList (void) INT8U i; INT8U *prdytbl; OSRdyGrp = 0 x00; /清除任務就緒表 prdytbl = &OSRdyTbl0; /將OSRdyTbl數組全部初始化0 for (i =

20、0; i OS_RDY_TBL_SIZE; i+) *prdytbl+ = 0 x00; /把任務就緒表里面所有的項目全部清零 OSPrioCur = 0; /當前運行任務的優(yōu)先級寄存器清零 OSPrioHighRdy = 0; /將處于就緒狀態(tài)的最高優(yōu)先級的任務寄存器清零 OSTCBHighRdy = (OS_TCB *)0; /將處于就緒態(tài)的最高優(yōu)先級的任務控制塊指針寄存器清零 OSTCBCur = (OS_TCB *)0; /將當前運行任務的任務控制塊指針寄存器清零 OSTCBList = (OS_TCB *)0; /任務控制塊列表清零 for (i = 0; i (OS_LOWEST_

21、PRIO + 1); i+) OSTCBPrioTbli = (OS_TCB *)0; / 清除優(yōu)先級列表,這個列表存儲各個優(yōu)先級對應的任務控制塊的地址,系統用它來尋找下一個要運行的任務地址OS_InitTCBList()初始化任務控制塊列表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; /任務控制塊列表的第一個任務塊地址給變量PTCB1 ptcb2 = &OSTCBTbl1; /任務控制塊列表的第二個任務塊地址給變量PTCB2 for (i = 0; i OSTCBNext = ptcb2;#if OS_TASK_NAME_SIZE 1 ptcb1-OSTCBTaskName0 = ?; /* Unknown name */ ptcb1-OSTCBTaskName1 = OS_ASCII_NUL;/把前一個任務控制塊的下一個任務指針指向下一個任務控制塊 #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; /把第一個任務控制塊的地址送給空閑任務控制塊列表 建立其它任務的任務建立其它任務的任務 TaskStart() nv

24、oid TaskStart (void *data)Prevent compiler warning by assigning data to itself; Display banner identifying this as EXAMPLE #1; (1)/在屏幕頂端顯示一個標識,說明這是例1 。 OS_ENTER_CRITICAL(); PC_VectSet(0 x08, OSTickISR); (2) PC_SetTickRate(200); (3) /關中斷,以改變中斷向量,讓其指向C/OS-II的時鐘節(jié)拍處理,然后,改變時鐘節(jié)拍為 200Hz OS_EXIT_CRITICAL();

25、 建立其它任務的任務建立其它任務的任務 TaskStart()(續(xù))(續(xù))Initialize the statistic task by calling OSStatInit(); (4)Create 10 identical tasks; /建立10個同樣的任務 (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位的計數器OSIdleCtr被清0,并產生另一個延時,這個延時使OSStatInit()掛起 。(2) OS_EXIT_CRITICAL();/uCOS-II執(zhí)行一個無限循環(huán)的空閑任務,不斷的遞增OSIdleCtr OSTimeDl

27、y(OS_TICKS_PER_SEC); (3) OS_ENTER_CRITICAL(); OSIdleCtrMax = OSIdleCtr; (4) OSStatRdy = TRUE; /COS-II將統計CPU的利用率 (5) OS_EXIT_CRITICAL(); 在屏幕隨機位置顯示任務號(09) void Task (void *data) UBYTE x; UBYTE y; UBYTE err; for (;) OSSemPend(RandomSem, 0, &err); /獲取信號量RandomSem ,同時禁止其他任務運行這段代碼 (1) x = random(80);

28、/獲得一個隨機數 (2) y = random(16); /獲得一個隨機數 OSSemPost(RandomSem); /計算出x和y坐標并釋放信號量 (3) PC_DispChar(x, y + 5, *(char *)data, DISP_FGND_LIGHT_GRAY);/在計算的坐標處顯示其任務號(0-9) (4) OSTimeDly(1); /延時一個時鐘節(jié)拍,等待進入下一次循環(huán) (5) 例1的運行結果例例2n磁盤文件為SOFTWAREuCOS-IIEX2_x86L,它包含9個任務。加上uCOS-II本身的兩個任務:空閑任務(idle task)和統計任務,共11個任務。 n由mai

29、n()中的TaskStart()函數建立任務,功能是建立其他任務并在屏幕上顯示如下的統計數據: 每秒種任務切換的次數; CPU利用率的百分比; 當前日期和時間; uCOS_II的版本號;n使用帶擴展功能的任務建立函數OSTaskCreateExt()和uCOS-II的堆棧檢查操作(要使用堆棧檢查操作必須用OSTaskCreateExt()建立任務)。C/OS-II stack checking uCOS-II的堆棧檢查功能要求任務建立時堆棧清零。OSTaskCreateExt()可以執(zhí)行此項操作(設置選項OS_TASK_OPT_STK_CHK和OS_TASK_OPT_STK_CLR打開此項操作

30、)。OSTaskCreateExt()進行堆棧清零操作是一項很費時的工作,取決于堆棧的大小。執(zhí)行堆棧檢查操作的時候,uCOS-II從棧底向棧頂搜索非0元素(參看上圖),同時用一個計數器記錄0元素的個數。main() n例2的main()函數和例1的看起來差不多;n有兩點區(qū)別:第一,main()函數調用PC_ElapsedInit()來初始化定時器記錄OSTaskStkChk()的執(zhí)行時間。第二,所有的任務都使用OSTaskCreateExt()函數來建立(替代了OSTaskCreate()函數),這使得每一個任務都可進行堆棧檢查。 例例2中的中的Main()函數()函數 nvoid main

31、(void) PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); OSInit(); PC_DOSSaveReturn(); PC_VectSet(uCOS, OSCtxSw); PC_ElapsedInit(); (1) /對消逝時間的測量進行初始化 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()函數的四個參數外,OSTaskCreateExt()還需要五個參數:任務的ID,一個指向任務堆棧棧底的指針,堆棧的大?。ㄒ远褩卧獮閱挝唬?0X86中為字),一個指向用戶定義的TCB擴展數據結構的指針,和一個用于指定對任務操作的變量。 TaskStart()nTaskStart()建立兩個郵箱,分別提供給任務4和任務5。n接著建立一個專門顯示時間和日期的任務,隨后又建立5個不同的任務。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; /關中斷,PC_VectSet() Change the tick rate to 200 Hz; /PC_SetTickRate() ,開中斷 Initialize the statistics task;/OSStatInit()以上幾項操作和例1中的相同。 TaskStart()的偽碼(續(xù))nCreate 2 ma

34、ilboxes which are used by Task #4 and #5; (1) n/ 調用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通過調用2個OSMboxCreate(void *)0)函數,創(chuàng)建2個郵箱。n這2個郵箱在任務4與任務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時鐘顯示任務nTaskClk()函數用于顯示當前日期和時間,每秒更新一次。 時鐘顯示任務程序 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、任務1n任務1將檢查其他七個任務堆棧的大小,同時記錄OSTackStkChk()函數的執(zhí)行時間,并與堆棧大小(所有堆棧的大小都是以字節(jié)為單位)一起顯示出來。任務1每秒執(zhí)行10次(間隔100ms)。任務1程序 nvoid Task1 (void *pdata) INT8U err; OS_STK_DATA data; /任務堆棧數據 INT16U time; /執(zhí)行時間(us) INT8U i; char s80; pdata = pdata; 任務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 任務2 n任務2在屏幕上顯示一個順時針旋轉的指針(用橫線,斜線等字符表示),每

40、200ms旋轉一格。 任務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);任務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); 任務3 n任務3也顯示了一個旋轉指針,但是與任務2旋轉的方向不同。任務3在堆棧中分配了一個很大的數組,將堆棧填充掉,使得OSTaskStkChk()只需花費很少的時間來確定堆棧的利用率,尤其是當堆棧已經快滿的時候。任務3程序nvoid Task3 (void *data) char dummy500; INT16U i; data = data; for (I = 0; i 499; i+) dummyi = ?; 任務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); 任務4 n任務4向任務5發(fā)送消息并等待確認。發(fā)送的

43、消息是一個指向字符的指針。每當任務4從任務5收到確認,就將傳遞的ASCII碼加1再發(fā)送,結果是不斷的傳送“ABCDEFG.”。任務4程序nvoid Task4 (void *data) char txmsg; INT8U err; data = data; txmsg = A;任務4程序 (續(xù))for (;) while (txmsg OSTCBExtPtr; (3) if (puser != (void *)0) (4)/如果任務分配了TCB擴展數據結構 puser-TaskCtr+; (5)/計數器TaskCtr進行累加以統計任務被切換的頻繁程度,或檢查某個任務是否在運行。 puser-TaskExecTime= time; (6)/記錄函數從切入到切出的運行

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論