freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

ucos移植性分析與應(yīng)用-資料下載頁

2025-06-25 23:42本頁面
  

【正文】 并且在屏幕上顯示如下統(tǒng)計(jì)信息:(1) 每秒鐘任務(wù)切換次數(shù);(2) CPU 利用百分率;(3) 任務(wù)數(shù);(4) 目前日期和時間;(5) μC/OSII 的版本號;TaskStart()還檢查是否按下ESC 鍵,以決定是否返回到DOS。其余10 個任務(wù)基于相同的代碼—Task(),每個任務(wù)在屏幕上隨機(jī)的位置顯示一個0 到9 的數(shù)字[16]。 Main()函數(shù)main()程序從清除整個屏幕開始,為的是保證屏幕上不留有以前的DOS下的顯示[(1)]。注意,此處定義了白色的字符和黑色的背景色。既然要清屏,所以可以只定義背景色而不定義前景色,但是這樣在退回DOS 之后,用戶就什么也看不見了,這也是為什么總要定義一個可見的前景色。μC/OSII 要用戶在使用任何服務(wù)之前先調(diào)用OSInit() [(2)]。它會建立兩個任務(wù):空閑任務(wù)和統(tǒng)計(jì)任務(wù),前者在沒有其它任務(wù)處于就緒態(tài)時運(yùn)行;后者計(jì)算CPU 的利用率。 , main()函數(shù)如下所示:void main (void){PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK)。 (1)OSInit()。 (2)PC_DOSSaveReturn()。 (3)PC_VectSet(uCOS, OSCtxSw)。 (4)RandomSem = OSSemCreate(1)。 (5)OSTaskCreate(TaskStart, (6)(void *)0,(void *)amp。TaskStartStk[TASK_STK_SIZE1],0)。OSStart()。 (7)}當(dāng)前DOS 環(huán)境是通過調(diào)用PC_DOSSaveReturn()[(3)]來保存的。這使得用戶可以返回到?jīng)]有運(yùn)行μC/OSII 以前的DOS 環(huán)境。 ,函數(shù)PC_DOSSaveReturn()如下:void PC_DOSSaveReturn (void){PC_ExitFlag = FALSE。 (1)OSTickDOSCtr = 8。 (2)PC_TickISR = PC_VectGet(VECT_TICK)。 (3)OS_ENTER_CRITICAL()。PC_VectSet(VECT_DOS_CHAIN, PC_TickISR)。 (4)OS_EXIT_CRITICAL()。Setjmp(PC_JumpBuf)。 (5)if (PC_ExitFlag == TRUE) {OS_ENTER_CRITICAL()。PC_SetTickRate(18)。 (6)PC_VectSet(VECT_TICK, PC_TickISR)。 (7)OS_EXIT_CRITICAL()。PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK)。 (8)exit(0)。 (9)}} 中的程序可以看到PC_DOSSaveReturn()做了很多事情。PC_DOSSaveReturn()首先設(shè)置PC_ExitFlag 為FALSE[(1)],說明用戶不是要返回DOS,然后初始化OSTickDOSCtr為1[(2)],因?yàn)檫@個變量將在OSTickISR()中遞減,而0 將使得這個變量在OSTickISR()中減1 后變?yōu)?55。然后,PC_DOSSaveReturn()將DOS 的時鐘節(jié)拍處理(tick handler)存入一個自由向量表入口中[(3)(4)],以便為μC/OSII 的時鐘節(jié)拍處理所調(diào)用。接著PC_DOSSaveReturn()調(diào)用jmp()[(5)],它將處理器狀態(tài)(即所有寄存器的值)存入被稱為PC_JumpBuf 的結(jié)構(gòu)之中。保存處理器的全部寄存器使得程序返回到PC_DOSSaveReturn()并且在調(diào)用setjmp()之后立即執(zhí)行。因?yàn)镻C_ExitFlag 被初始化為FALSE[(1)]。PC_DOSSaveReturn()跳過if 狀態(tài)語句 [(6)–(9)] 回到main()函數(shù)。如果用戶想要返回到DOS,可以調(diào)用PC_DOSReturn()(程序清單 ),它設(shè)置PC_ExitFlag為TRUE,并且執(zhí)行l(wèi)ongjmp()語句[(2)],這時處理器將跳回 PC_DOSSaveReturn()[在調(diào)用 setjmp()之后] [(5)],此時PC_ExitFlag 為TRUE,故if語句以后的代碼將得以執(zhí)行。 PC_DOSSaveReturn()將時鐘節(jié)拍改為 [(6)],恢復(fù)PC 時鐘節(jié)拍中斷服務(wù)[(7)],清屏幕[(8)],通過exit(0)返回DOS [(9)] [17]。 ,返回DOS的函數(shù)如下所示:void PC_DOSReturn (void){PC_ExitFlag = TRUE。 (1)longjmp(PC_JumpBuf, 1)。 (2)}現(xiàn)在回到main()這個函數(shù),在程序清單 中,main()調(diào)用PC_VectSet()來設(shè)置μCOSII 中的 CPU 寄存器切換。任務(wù)級的CPU 寄存器切換由80x86 INT 指令來分配向量地址。此處使用向量0x80(即128),因?yàn)樗幢籇OS和BIOS 使用。這里用了一個信號量來保護(hù)Borland C/C++庫中的產(chǎn)生隨機(jī)數(shù)的函數(shù)[(5)],之所以使用信號量保護(hù)一下,是因?yàn)椴恢肋@個函數(shù)是否具備可重入性,假設(shè)其不具備,初始化將信號量設(shè)置為1,意思是在某一時刻只有一個任務(wù)可以調(diào)用隨機(jī)數(shù)產(chǎn)生函數(shù)。在開始多任務(wù)之前,建立了一個叫做TaskStart()的任務(wù)[(6)],在啟動多任務(wù)OSStart()之前用戶至少要先建立一個任務(wù),這一點(diǎn)非常重要[(7)]。不這樣做用戶的應(yīng)用程序?qū)罎?。?shí)際上,如果用戶要計(jì)算CPU 的利用率時,也需要先 建立一個任務(wù)。μCOSII的統(tǒng)計(jì)任務(wù)要求在整個一秒鐘內(nèi)沒有任何其它任務(wù)運(yùn)行。如果用戶在啟動多任務(wù)之前要建立其它任務(wù),必須保證用戶的任務(wù)代碼監(jiān)控全局變量OSStatRdy 和延時程序 [即調(diào)用OSTimeDly()]的執(zhí)行,直到這個變量變成TRUE。這表明μC/OSII的CPU 利用率統(tǒng)計(jì)函數(shù)已經(jīng)采集到了數(shù)據(jù)[18]。 TaskStart()任務(wù)TaskStart()函數(shù)的示意代碼如程序清單 所示。TaskStart()首先在屏幕頂端顯示一個標(biāo)識,說明這是測試程序例1 [(1)]。然后關(guān)中斷,以改變中斷向量,讓其指向μC/OSII 的時鐘節(jié)拍處理,而后,改變時鐘節(jié)拍率,從DOS的 變?yōu)?200Hz [(3)]。在處理器改變中斷向量時以及系統(tǒng)沒有完全初始化前,當(dāng)然不希望有中斷打入!注意main()這個函數(shù)(見程序清單 L )在系統(tǒng)初始化的時候并沒有將中斷向量設(shè)置成μC/OSII的時鐘節(jié)拍處理程序,做嵌入式應(yīng)用時,必須在第一個任務(wù)中打開時鐘節(jié)拍中斷。 ,建立其它任務(wù)的任務(wù)如下所示:void TaskStart (void *data){Prevent piler warning by assigning ‘data’ to itself。Display banner identifying this as EXAMPLE 1。 (1)OS_ENTER_CRITICAL()。PC_VectSet(0x08, OSTickISR)。 (2)PC_SetTickRate(200)。 (3)OS_EXIT_CRITICAL()。Initialize the statistic task by calling ‘OSStatInit()’。 (4)Create 10 identical tasks。 (5)for (。) {Display the number of tasks created。Display the % of CPU used。Display the number of task switches in 1 second。Display uC/OSII’s version numberIf (key was pressed) {if (key pressed was the ESCAPE key) {PC_DOSReturn()。}}Delay for 1 Second。}}在建立其他任務(wù)之前,必須調(diào)用OSStatInit()[(4)]來確定用戶的PC有多快,[19]。 ,測試CPU速度如下所示:void OSStatInit (void){OSTimeDly(2)。 (1)OS_ENTER_CRITICAL()。OSIdleCtr = 0L。 (2)OS_EXIT_CRITICAL()。OSTimeDly(OS_TICKS_PER_SEC)。 (3)OS_ENTER_CRITICAL()。OSIdleCtrMax = OSIdleCtr。 (4)OSStatRdy = TRUE。 (5)OS_EXIT_CRITICAL()。}在一開始,OSStatInit()就將自身延時了兩個時鐘節(jié)拍,這樣它就可以與時鐘節(jié)拍中斷同步[(1)]。因此,OSStatInit()必須在時鐘節(jié)拍啟動之后調(diào)用;否則,用戶的應(yīng)用程序就會崩潰。當(dāng)μC/OSII 調(diào)用OSStatInit()時,一個32 位的計(jì)數(shù)器OSIdleCtr被清為0 [(2)],并產(chǎn)生另一個延時,這個延時使OSStatInit()掛起。此時,uCOSII沒有別的任務(wù)可以執(zhí)行,它只能執(zhí)行空閑任務(wù)(μC/OSII 的內(nèi)部任務(wù))??臻e任務(wù)是一個無線的循環(huán),它不斷的遞增OSIdleCtr[(3)]。1 秒以后,uCOSII重新開始OSStatInit(),并且將OSIdleCtr 保存在OSIdleMax 中[(4)。所以O(shè)SIdleMax 是OSIdleCtr所能達(dá)到的最大值。而當(dāng)用戶再增加其他應(yīng)用代碼時,空閑任務(wù)就不會占用那樣多的CPU 時間。OSIdleCtr 不可能達(dá)到那樣多的記數(shù),(如果擁護(hù)程序每秒復(fù)位一次OSIdleCtr)CPU 利用率的計(jì)算由μC/OSII 中的OSStatTask()函數(shù)來完成,這個任務(wù)每秒執(zhí)行一次。而當(dāng)OSStatRdy置為TRUE[(5)],表示μC/OSII將統(tǒng)計(jì)CPU 的利用率。 TaskN()任務(wù)OSStatInit()將返回到TaskStart()?,F(xiàn)在,用戶可以建立10 個同樣的任務(wù)(所有任務(wù)共享同一段代碼)。所有任務(wù)都由TaskStart()中建立,由于TaskStart()的優(yōu)先級為0(最高),新任務(wù)建立后不進(jìn)行任務(wù)調(diào)度。當(dāng)所有任務(wù)都建立完成后,TaskStart()將進(jìn)入無限循環(huán)之中,在屏幕上顯示統(tǒng)計(jì)信息,并檢測是否有ESC鍵按下,如果沒有按鍵輸入,則延時一秒開始下一次循環(huán);如果在這期間用戶按下了ESC 鍵,TaskStart()將調(diào)用PC_DOSReturn()返回DOS 系統(tǒng)[20]。 ,在屏幕上隨機(jī)位置顯示數(shù)字的任務(wù):void Task (void *data){UBYTE x。UBYTE y。UBYTE err。for (。) {OSSemPend(RandomSem, 0, amp。err)。 (1)x = random(80)。 (2)y = random(16)。OSSemPost(RandomSem)。 (3)PC_DispChar(x, y + 5, *(char *)data, DISP_FGND_LIGHT_GRAY)。 (4)OSTimeDly(1)。 (5)}}。任務(wù)一開始,調(diào)用OSSemPend()獲取信號量RandomSem[(1)](也就是禁止其他任務(wù)運(yùn)行這段代碼—譯者注),然后調(diào)用Borland C/C++的庫函數(shù)random()來獲得一個隨機(jī)數(shù)[(2)],此處設(shè)random()函數(shù)是不可重入的,所以10 個任務(wù)將輪流獲得信號量,并調(diào)用該函數(shù)。當(dāng)計(jì)算出x 和y 坐標(biāo)后[(3)],任務(wù)釋放信號量。隨后任務(wù)在計(jì)算的坐標(biāo)處顯示其任務(wù)號(09,任務(wù)建立時的標(biāo)識)[(4)]。最后,任務(wù)延時一個時鐘節(jié)拍[(5)],等待進(jìn)入下一次循環(huán)。系統(tǒng)中每個任務(wù)每秒執(zhí)行200次,10 個任務(wù)每秒鐘將切換2000次[22]。 測試結(jié)果: 測試程序運(yùn)行結(jié)果 由上圖可知該程序的運(yùn)行結(jié)果為:(1) 每秒鐘任務(wù)切換次數(shù):2202次/秒(2) CPU 利用百分率: 6%(3) 任務(wù)數(shù): 13(4) 目前日期和時間:,17:17:04(5) μC/OSII 的版本號:通過測試結(jié)果可知,移植后的uC/OSII操作系統(tǒng)能夠在PC機(jī)上正常運(yùn)行,并且可以提供比
點(diǎn)擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1