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

正文內(nèi)容

ucos移植性分析與應(yīng)用(文件)

2025-07-13 23:42 上一頁面

下一頁面
 

【正文】 I中,由于中斷的產(chǎn)生可能會引起任務(wù)切換,在中斷服務(wù)程序的最后會調(diào)用OSIntExit()函數(shù)檢查任務(wù)就緒狀態(tài),如果需要進(jìn)行任務(wù)切換,將調(diào)用OSIntCtxSw()。 。 (Unment if OS_CRITICAL_METHOD is 2, see )。 OSTCBCurOSTCBStkPtr = SS:SP(2)MOV ES:[BX+2], SSMOV ES:[BX+0], SP。 OSTCBCur = OSTCBHighRdy (4)MOV DX, WORD PTR DS:_OSTCBHighRdyMOV WORD PTR DS:_OSTCBCur+2, AXMOV WORD PTR DS:_OSTCBCur, DX。 SS:SP = OSTCBHighRdyOSTCBStkPtr。(8)POPA 。_OSIntCtxSw ENDP程序清單中部分與OSCtxSw()的代碼相同,不同之處是,第一,由于中斷已經(jīng)發(fā)生,此處不需要再保存CPU寄存器(沒有PUSHA, PUSH ES, 或PUSH DS);第二,OSIntCtxSw()需要調(diào)整堆棧指針,去掉堆棧中一些不需要的內(nèi)容,以使堆棧中只包含任務(wù)的運(yùn)行環(huán)境。PC時(shí)鐘節(jié)拍的中斷向量為0x08,μC/OSII將此向量截取,指向了μC/OS的中斷服務(wù)函數(shù)OSTickISR(),而原先的中斷向量保存在中斷129(0x81)中。該程序代碼如下所示:_OSTickISR PROC FARPUSHA 。 標(biāo)示 uC/OSII 進(jìn)入中斷。 調(diào)用DOS時(shí)鐘中斷處理過程JMP SHORT _OSTickISR2_OSTickISR1:MOV AL, 20H 。_OSTickISR2:CALL FAR PTR _OSTimeTick 。 返回被中斷任務(wù)_OSTickISR ENDP μC/OSII :(1)OSTaskStkInit()(2)OSTaskCreateHook()(3)OSTaskDelHook()(4)OSTaskSwHook()(5)OSTaskStatHook()(6)OSTimeTickHook()實(shí)際需要修改的只有OSTaskStkInit()函數(shù),其他五個(gè)函數(shù)需要聲明,但不一定有實(shí)際內(nèi)容。初始狀態(tài)的堆棧模擬發(fā)生一次中斷后的堆棧結(jié)構(gòu)。OSTaskCreateExt()還需要一些其他參數(shù),但與OSTaskStkInit()沒有關(guān)系。 /* 39。 /* 放置向函數(shù)傳遞的參數(shù) (2) */*stk = (INT16U)FP_OFF(pdata)。 /* SW 設(shè)置為中斷開啟 (4) */*stk = (INT16U)FP_SEG(task)。 /* CX = 0xCCCC */*stk = (INT16U)0xDDDD。 /* BP = 0x1111 */*stk = (INT16U)0x2222。 /* DS =當(dāng)前CPU的 DS寄存器 (6) */return ((void *)stk)。堆棧中緊接著是任務(wù)函數(shù)的起始地址[見程序注釋中(3)],理論上,此處應(yīng)該為任務(wù)的返回地址,但在μC/OSII中,任務(wù)函數(shù)必須為無限循環(huán)結(jié)構(gòu),不能有返回點(diǎn)。如果確實(shí)需要突破上述限制,可以通過參數(shù)pdata向任務(wù)傳遞希望實(shí)現(xiàn)的中斷狀態(tài)。所以設(shè)置SW為0x0202,在任務(wù)啟動(dòng)時(shí)開啟中斷。如果使用沒有PUSHA指令的8086處理器,就要使用多個(gè)PUSH指令壓入上述寄存器,且順序要與PUSHA相同。 OSTaskCreateHook()函數(shù),此函數(shù)為用戶定義。 OSTimeTickHook()函數(shù),此函數(shù)為用戶定義。其余10 個(gè)任務(wù)基于相同的代碼—Task(),每個(gè)任務(wù)在屏幕上隨機(jī)的位置顯示一個(gè)0 到9 的數(shù)字[16]。μC/OSII 要用戶在使用任何服務(wù)之前先調(diào)用OSInit() [(2)]。 (2)PC_DOSSaveReturn()。TaskStartStk[TASK_STK_SIZE1],0)。 ,函數(shù)PC_DOSSaveReturn()如下:void PC_DOSSaveReturn (void){PC_ExitFlag = FALSE。PC_VectSet(VECT_DOS_CHAIN, PC_TickISR)。PC_SetTickRate(18)。 (8)exit(0)。接著PC_DOSSaveReturn()調(diào)用jmp()[(5)],它將處理器狀態(tài)(即所有寄存器的值)存入被稱為PC_JumpBuf 的結(jié)構(gòu)之中。如果用戶想要返回到DOS,可以調(diào)用PC_DOSReturn()(程序清單 ),它設(shè)置PC_ExitFlag為TRUE,并且執(zhí)行l(wèi)ongjmp()語句[(2)],這時(shí)處理器將跳回 PC_DOSSaveReturn()[在調(diào)用 setjmp()之后] [(5)],此時(shí)PC_ExitFlag 為TRUE,故if語句以后的代碼將得以執(zhí)行。 (2)}現(xiàn)在回到main()這個(gè)函數(shù),在程序清單 中,main()調(diào)用PC_VectSet()來設(shè)置μCOSII 中的 CPU 寄存器切換。在開始多任務(wù)之前,建立了一個(gè)叫做TaskStart()的任務(wù)[(6)],在啟動(dòng)多任務(wù)OSStart()之前用戶至少要先建立一個(gè)任務(wù),這一點(diǎn)非常重要[(7)]。如果用戶在啟動(dòng)多任務(wù)之前要建立其它任務(wù),必須保證用戶的任務(wù)代碼監(jiān)控全局變量OSStatRdy 和延時(shí)程序 [即調(diào)用OSTimeDly()]的執(zhí)行,直到這個(gè)變量變成TRUE。然后關(guān)中斷,以改變中斷向量,讓其指向μC/OSII 的時(shí)鐘節(jié)拍處理,而后,改變時(shí)鐘節(jié)拍率,從DOS的 變?yōu)?200Hz [(3)]。 (1)OS_ENTER_CRITICAL()。Initialize the statistic task by calling ‘OSStatInit()’。Display the % of CPU used。}}在建立其他任務(wù)之前,必須調(diào)用OSStatInit()[(4)]來確定用戶的PC有多快,[19]。 (2)OS_EXIT_CRITICAL()。 (4)OSStatRdy = TRUE。當(dāng)μC/OSII 調(diào)用OSStatInit()時(shí),一個(gè)32 位的計(jì)數(shù)器OSIdleCtr被清為0 [(2)],并產(chǎn)生另一個(gè)延時(shí),這個(gè)延時(shí)使OSStatInit()掛起。所以O(shè)SIdleMax 是OSIdleCtr所能達(dá)到的最大值。 TaskN()任務(wù)OSStatInit()將返回到TaskStart()。 ,在屏幕上隨機(jī)位置顯示數(shù)字的任務(wù):void Task (void *data){UBYTE x。) {OSSemPend(RandomSem, 0, amp。OSSemPost(RandomSem)。任務(wù)一開始,調(diào)用OSSemPend()獲取信號量RandomSem[(1)](也就是禁止其他任務(wù)運(yùn)行這段代碼—譯者注),然后調(diào)用Borland C/C++的庫函數(shù)random()來獲得一個(gè)隨機(jī)數(shù)[(2)],此處設(shè)random()函數(shù)是不可重入的,所以10 個(gè)任務(wù)將輪流獲得信號量,并調(diào)用該函數(shù)。系統(tǒng)中每個(gè)任務(wù)每秒執(zhí)行200次,10 個(gè)任務(wù)每秒鐘將切換2000次[22]。隨后任務(wù)在計(jì)算的坐標(biāo)處顯示其任務(wù)號(09,任務(wù)建立時(shí)的標(biāo)識)[(4)]。 (4)OSTimeDly(1)。 (1)x = random(80)。UBYTE err。所有任務(wù)都由TaskStart()中建立,由于TaskStart()的優(yōu)先級為0(最高),新任務(wù)建立后不進(jìn)行任務(wù)調(diào)度。OSIdleCtr 不可能達(dá)到那樣多的記數(shù),(如果擁護(hù)程序每秒復(fù)位一次OSIdleCtr)CPU 利用率的計(jì)算由μC/OSII 中的OSStatTask()函數(shù)來完成,這個(gè)任務(wù)每秒執(zhí)行一次。空閑任務(wù)是一個(gè)無線的循環(huán),它不斷的遞增OSIdleCtr[(3)]。}在一開始,OSStatInit()就將自身延時(shí)了兩個(gè)時(shí)鐘節(jié)拍,這樣它就可以與時(shí)鐘節(jié)拍中斷同步[(1)]。 (3)OS_ENTER_CRITICAL()。 (1)OS_ENTER_CRITICAL()。Display uC/OSII’s version numberIf (key was pressed) {if (key pressed was the ESCAPE key) {PC_DOSReturn()。 (5)for (。 (2)PC_SetTickRate(200)。 ,建立其它任務(wù)的任務(wù)如下所示:void TaskStart (void *data){Prevent piler warning by assigning ‘data’ to itself。 TaskStart()任務(wù)TaskStart()函數(shù)的示意代碼如程序清單 所示。實(shí)際上,如果用戶要計(jì)算CPU 的利用率時(shí),也需要先 建立一個(gè)任務(wù)。此處使用向量0x80(即128),因?yàn)樗幢籇OS和BIOS 使用。 ,返回DOS的函數(shù)如下所示:void PC_DOSReturn (void){PC_ExitFlag = TRUE。因?yàn)镻C_ExitFlag 被初始化為FALSE[(1)]。PC_DOSSaveReturn()首先設(shè)置PC_ExitFlag 為FALSE[(1)],說明用戶不是要返回DOS,然后初始化OSTickDOSCtr為1[(2)],因?yàn)檫@個(gè)變量將在OSTickISR()中遞減,而0 將使得這個(gè)變量在OSTickISR()中減1 后變?yōu)?55。 (7)OS_EXIT_CRITICAL()。Setjmp(PC_JumpBuf)。 (2)PC_TickISR = PC_VectGet(VECT_TICK)。 (7)}當(dāng)前DOS 環(huán)境是通過調(diào)用PC_DOSSaveReturn()[(3)]來保存的。 (4)RandomSem = OSSemCreate(1)。 , main()函數(shù)如下所示:void main (void){PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK)。注意,此處定義了白色的字符和黑色的背景色。μC/OSII 增加了兩個(gè)內(nèi)部任務(wù):空閑任務(wù)和一個(gè)計(jì)算CPU 利用率的任務(wù),本測試程序建立了11個(gè)其它任務(wù)。 OSTaskSwHook()函數(shù),此函數(shù)為用戶定義。Borland編譯器支持偽寄存器變量操作,可以用_DS關(guān)鍵字取得CPU DS寄存器的值,程序注釋中(6)標(biāo)記處用_DS直接把DS寄存器拷貝到堆棧中。上述指令在每次進(jìn)入中斷服務(wù)程序時(shí)都會調(diào)用[見程序注釋中(5)]。同時(shí)還要修改OSTaskIdle()和OSTaskStat()函數(shù),在運(yùn)行時(shí)開啟中斷。堆棧中的SW初始化為0x0202,這將使任務(wù)啟動(dòng)后允許中斷發(fā)生;如果設(shè)為0x0002,則任務(wù)啟動(dòng)后將禁止中斷。同時(shí)要求堆棧指針指向空堆棧的頂端。 /* DI = 0x3333 */*stk = (INT16U)0x4444。 /* BX = 0xBBBB */*stk = (INT16U)0x0000。*stk = (INT16U)0xAAAA。 /* 函數(shù)返回地址(3) */*stk = (INT16U)FP_OFF(task)。未使用,此處可防止編譯器的警告 */stk = (INT16U *)ptos。程序OSTaskStkInit()的代碼如下所示:void *OSTaskStkInit (void (*task)(void *pd), void *pdata, void *ptos, INT16U opt){INT16U *stk。 傳遞參數(shù) pdata的堆棧初始化結(jié)構(gòu)請注意,圖中的堆棧結(jié)構(gòu)不是調(diào)用OSTaskStkInit()任務(wù)的,而是新創(chuàng)建任務(wù)的。如果用戶需要使用這些函數(shù),define constant OS_CPU_HOOKS_EN設(shè)為1,設(shè)為0表示不使用這些函數(shù)[15]。 標(biāo)示uC/OSII退出中斷POP DS 。OUT DX, AL 。 每11個(gè)時(shí)鐘節(jié)拍( Hz)調(diào)用DOS時(shí)鐘中斷。MOV AX, SEG _OSTickDOSCtr 。 PC中斷向量(IVT)在μC/OSII中,當(dāng)調(diào)用OSStart()啟動(dòng)多任務(wù)環(huán)境后,時(shí)鐘中斷的作用非常重要。但由于PC環(huán)境的特殊性,時(shí)鐘節(jié)拍由硬件產(chǎn)生, ()。IRET 。POP DS 。 OSPrioCur = OSPrioHighRdy (5)MOV BYTE PTR DS:_OSPrioCur, AL。 (3) 。 載入DSMOV DS, AX。 ADD SP,8 。由于在調(diào)用OSIntCtxSw()之前已經(jīng)發(fā)生了中斷,OSIntCtxSw()將默認(rèn)CPU寄存器已經(jīng)保存在被中斷
點(diǎn)擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1