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

正文內(nèi)容

ucos移植性分析與應(yīng)用(完整版)

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

下一頁面
  

【正文】 本原理做了非常詳細(xì)的解釋,實(shí)時(shí)內(nèi)核讓人一目了然,簡(jiǎn)單易懂。,嵌入式系統(tǒng)中的軟件一般都固化在存儲(chǔ)器芯片(外接或CPU內(nèi)置)中,而不是存貯于磁盤等載體中。在中國(guó),嵌入式操作系統(tǒng)可分為兩大類型:一類是自主版權(quán)的操作系統(tǒng),另一類是基于Linux的操作系統(tǒng)。嵌入式系統(tǒng)所能提供的資源有限,尤其是內(nèi)存資源,所以嵌入式操作系統(tǒng)必須做到小巧以滿足嵌入式系統(tǒng)硬件的限制。如今已有幾十種商業(yè)操作系統(tǒng)可供選擇,出現(xiàn)了許多相互競(jìng)爭(zhēng)的產(chǎn)品,如Vxworks,Psos,Neculeus、Windows CE、和各種嵌入式Linux等。這時(shí)的計(jì)算機(jī)是面向具體應(yīng)用定做的,它們是一些專用指令的引擎以及與之集成在一起的I/O設(shè)備。第三章是實(shí)時(shí)操作系統(tǒng)uC/OSII的分析。裁減掉不需要的部分,使操作系統(tǒng)變得小巧、靈活,并且能滿足用戶特定操作系統(tǒng)的需要。其中,以計(jì)算機(jī)主機(jī)嵌入于應(yīng)用系統(tǒng)或設(shè)備之中為特征的嵌入式應(yīng)用更是令人矚目。后PC時(shí)代是一個(gè)真實(shí)的階段,而且是一個(gè)可以預(yù)測(cè)的時(shí)代。主要講述了本題目的背景。通過一個(gè)例子,測(cè)試所移植的uC/OSII能夠正常工作,并且反映出操作系統(tǒng)的多任務(wù)調(diào)度、任務(wù)切換等。當(dāng)新的處理器出現(xiàn),則必須為之重新寫一遍。 嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)并不是簡(jiǎn)單嵌入的操作系統(tǒng),它與通用操作系統(tǒng)有本質(zhì)區(qū)別。在這種條件下,要求負(fù)責(zé)系統(tǒng)管理的嵌入式操作系統(tǒng)具有很高的穩(wěn)定性。這一點(diǎn)就決定了它必然是一個(gè)技術(shù)密集、資金密集、不斷創(chuàng)新的知識(shí)集成系統(tǒng)。在這種趨勢(shì)下,以TCP/IP和以太網(wǎng)為代表成熟度較高的開放式網(wǎng)絡(luò)技術(shù),正逐漸地被應(yīng)用在各個(gè)自動(dòng)化系統(tǒng),連接并控制所有的設(shè)備。 uC/OSII的內(nèi)核結(jié)構(gòu) uC/OSII的任務(wù)管理uC/OSII的任務(wù)管理包括如何在用戶的應(yīng)用程序中建立任務(wù)、刪除任務(wù)、改變?nèi)蝿?wù)的優(yōu)先級(jí)、掛起和恢復(fù)任務(wù),以及獲得有關(guān)任務(wù)的信息。 uC/OSII的時(shí)間管理uC/OSII(和其它內(nèi)核一樣)要求用戶提供定時(shí)中斷來實(shí)現(xiàn)延時(shí)與超時(shí)控制等功能這個(gè)定時(shí)中斷叫做時(shí)鐘節(jié)拍,它應(yīng)該每秒發(fā)生10至100次。 uC/OSII任務(wù)間的通信與同步對(duì)于一個(gè)多任務(wù)的操作系統(tǒng)來說,任務(wù)間的同步和通信是必不可少的。 uC/OSII的內(nèi)存管理內(nèi)存管理是操作系統(tǒng)的另一項(xiàng)重要功能。對(duì)于應(yīng)用程序,uC/OSII提供一系列的函數(shù)調(diào)用,在編譯應(yīng)用程序時(shí)要將uC/OSII源文件一起編譯、鏈接,使得應(yīng)用程序與uC/OSII靜態(tài)鏈接在一起形成一個(gè)系統(tǒng)映象,這時(shí)可以稱這個(gè)映象為uC/OSII,此時(shí)它己經(jīng)作為靜態(tài)鏈接庫鏈接到應(yīng)用程序中去了。//LWIP TASK//調(diào)度最高優(yōu)先級(jí)任務(wù)開始運(yùn)行OSStart()。outb_p(LATCH8,0x40)。OSRdyTbl[]是個(gè)字符型數(shù)組,每一項(xiàng)有8位,每一位對(duì)應(yīng)一個(gè)任務(wù),如果OSRdyTb1[]有N個(gè)元素,則可容納N*8個(gè)任務(wù)。/*指針數(shù)組,每一項(xiàng)指向一個(gè)已建立任務(wù),指針數(shù)組下標(biāo)用于按優(yōu)先級(jí)檢索任務(wù)*/ 任務(wù)間通信初始化主要是對(duì)事件控制塊和消息隊(duì)列控制塊的初始化。如果用戶應(yīng)用程序打算使用統(tǒng)計(jì)任務(wù),用戶必須在初始化時(shí)建立一個(gè)任務(wù),這個(gè)任務(wù)中調(diào)用OSStatInit()。if(OSRunning=FALSE){y=OSUnMapTbl[OSRdyGrp]。為方便移植,大部分的uC/OSⅡ代碼是用C語言寫的,但仍需要用匯編語言寫一些與處理器相關(guān)的代碼,這是因?yàn)閡C/OSⅡ在讀寫處理器和寄存器時(shí)只能通過匯編語言來實(shí)現(xiàn)。中斷使得CPU可以在事件發(fā)生時(shí)才予以處理,而不必讓微處理器連續(xù)不斷地查詢((Polling)是否有事件發(fā)生。(4)處理器支持中斷,并可以產(chǎn)生定時(shí)中斷(通常在10到100HZ之間)。編譯完成后,程序可在PC機(jī)上運(yùn)行。在實(shí)模式下,這些段寄存器存放段的基地址。(2)。與優(yōu)點(diǎn)相比,多一些編譯時(shí)間還是可以接受的。 /* 帶符號(hào)16位數(shù) */typedef unsigned long INT32U。 CLI} /* 關(guān)閉中斷 */define OS_EXIT_CRITICAL() asm POPF /* 打開中斷 */endif/******************************************************************** Intel 80x86 (實(shí)模式, 大模式編譯)*******************************************************************/define OS_STK_GROWTH 1 /* 堆棧由高地址向低地址增長(zhǎng) (3)*/define uCOS 0x80 /* 中斷向量0x80用于任務(wù)切換 (4)*/define OS_TASK_SW() asm INT uCOS /* (5) *//******************************************************************* 全局變量 ********************************************************************/OS_CPU_EXT INT8U OSTickDOSCtr。Borland C/C++支持嵌入?yún)R編語句,所以加入關(guān)閉/打開中斷的語句是很方便的。80x86提供了256個(gè)軟中斷源可供選用,中斷服務(wù)程序(ISR)(也稱為例外處理過程)的入口點(diǎn)必須指向匯編函數(shù)OSCtxSw()()。OSStartHighRdy()默認(rèn)指針OSTCBHighRdy指向優(yōu)先級(jí)最高就緒任務(wù)的任務(wù)控制塊(OS_TCB)(在這之前OSTCBHighRdy已由OSStart()設(shè)置好了)。當(dāng)執(zhí)行了IRET指令后,CPU會(huì)從(SS:SP)指向的堆棧中恢復(fù)各個(gè)寄存器的值并執(zhí)行中斷前的指令。PUSHA ;保存當(dāng)前任務(wù)環(huán)境 (2)PUSH ES ;(3)PUSH DS ;(4)。 OSTCBCur = OSTCBHighRdy (7)MOV DX, WORD PTR DS:_OSTCBHighRdyMOV WORD PTR DS:_OSTCBCur+2, AXMOV WORD PTR DS:_OSTCBCur, DX。(12)IRET 。如果不使用對(duì)外接口函數(shù),請(qǐng)?jiān)陬^文件中把相應(yīng)的開關(guān)選項(xiàng)關(guān)閉,加快任務(wù)切換的速度。 。 OSTCBCurOSTCBStkPtr = SS:SP(2)MOV ES:[BX+2], SSMOV ES:[BX+0], SP。 SS:SP = OSTCBHighRdyOSTCBStkPtr。_OSIntCtxSw ENDP程序清單中部分與OSCtxSw()的代碼相同,不同之處是,第一,由于中斷已經(jīng)發(fā)生,此處不需要再保存CPU寄存器(沒有PUSHA, PUSH ES, 或PUSH DS);第二,OSIntCtxSw()需要調(diào)整堆棧指針,去掉堆棧中一些不需要的內(nèi)容,以使堆棧中只包含任務(wù)的運(yùn)行環(huán)境。該程序代碼如下所示:_OSTickISR PROC FARPUSHA 。 調(diào)用DOS時(shí)鐘中斷處理過程JMP SHORT _OSTickISR2_OSTickISR1:MOV AL, 20H 。 返回被中斷任務(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)容。OSTaskCreateExt()還需要一些其他參數(shù),但與OSTaskStkInit()沒有關(guān)系。 /* 放置向函數(shù)傳遞的參數(shù) (2) */*stk = (INT16U)FP_OFF(pdata)。 /* CX = 0xCCCC */*stk = (INT16U)0xDDDD。 /* DS =當(dāng)前CPU的 DS寄存器 (6) */return ((void *)stk)。如果確實(shí)需要突破上述限制,可以通過參數(shù)pdata向任務(wù)傳遞希望實(shí)現(xiàn)的中斷狀態(tài)。如果使用沒有PUSHA指令的8086處理器,就要使用多個(gè)PUSH指令壓入上述寄存器,且順序要與PUSHA相同。 OSTimeTickHook()函數(shù),此函數(shù)為用戶定義。μC/OSII 要用戶在使用任何服務(wù)之前先調(diào)用OSInit() [(2)]。TaskStartStk[TASK_STK_SIZE1],0)。PC_VectSet(VECT_DOS_CHAIN, PC_TickISR)。 (8)exit(0)。如果用戶想要返回到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í)行。在開始多任務(wù)之前,建立了一個(gè)叫做TaskStart()的任務(wù)[(6)],在啟動(dòng)多任務(wù)OSStart()之前用戶至少要先建立一個(gè)任務(wù),這一點(diǎn)非常重要[(7)]。然后關(guān)中斷,以改變中斷向量,讓其指向μC/OSII 的時(shí)鐘節(jié)拍處理,而后,改變時(shí)鐘節(jié)拍率,從DOS的 變?yōu)?200Hz [(3)]。Initialize the statistic task by calling ‘OSStatInit()’。}}在建立其他任務(wù)之前,必須調(diào)用OSStatInit()[(4)]來確定用戶的PC有多快,[19]。 (4)OSStatRdy = TRUE。所以O(shè)SIdleMax 是OSIdleCtr所能達(dá)到的最大值。 ,在屏幕上隨機(jī)位置顯示數(shù)字的任務(wù):void Task (void *data){UBYTE x。OSSemPost(RandomSem)。系統(tǒng)中每個(gè)任務(wù)每秒執(zhí)行200次,10 個(gè)任務(wù)每秒鐘將切換2000次[22]。 (4)OSTimeDly(1)。UBYTE err。OSIdleCtr 不可能達(dá)到那樣多的記數(shù),(如果擁護(hù)程序每秒復(fù)位一次OSIdleCtr)CPU 利用率的計(jì)算由μC/OSII 中的OSStatTask()函數(shù)來完成,這個(gè)任務(wù)每秒執(zhí)行一次。}在一開始,OSStatInit()就將自身延時(shí)了兩個(gè)時(shí)鐘節(jié)拍,這樣它就可以與時(shí)鐘節(jié)拍中斷同步[(1)]。 (1)OS_ENTER_CRITICAL()。 (5)for (。 ,建立其它任務(wù)的任務(wù)如下所示:void TaskStart (void *data){Prevent piler warning by assigning ‘data’ to itself。實(shí)際上,如果用戶要計(jì)算CPU 的利用率時(shí),也需要先 建立一個(gè)任務(wù)。 ,返回DOS的函數(shù)如下所示:void PC_DOSReturn (void){PC_ExitFlag = TRUE。PC_DOSSaveReturn()首先設(shè)置PC_ExitFlag 為FALSE[(1)],說明用戶不是要返回DOS,然后初始化OSTickDOSCtr為1[(2)],因?yàn)檫@個(gè)變量將在OSTickISR()中遞減,而0 將使得這個(gè)變量在OSTickISR()中減1 后變?yōu)?55。Setjmp(PC_JumpBuf)。 (7)}當(dāng)前DOS 環(huán)境是通過調(diào)用PC_DOSSaveReturn()[(3)]來保存的。 , main()函數(shù)如下所示:void main (void){PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK)。μC/OSII 增加了兩個(gè)內(nèi)部任務(wù):空閑任務(wù)和一個(gè)計(jì)算CPU 利用率的任務(wù),本測(cè)試程序建立了11個(gè)其它任務(wù)。Borland編譯器支持偽寄存器變量操作,可以用_DS關(guān)鍵字取得CPU DS寄存器的值,程序注釋中(6)標(biāo)記處用_DS直接把DS寄存器拷貝到堆棧中。同時(shí)還要修改OSTaskIdle()和OSTaskStat()函數(shù),在運(yùn)行時(shí)開啟中斷。同時(shí)要求堆棧指針指向空堆棧的頂端。 /* BX = 0xBBBB */*stk = (INT16U)0x0000。 /* 函數(shù)返回地址(3) */*stk = (INT16U)FP_OFF(task)。程序OSTaskStkInit()的代碼如下所示:void *OSTaskStkInit (void (*task)(void *pd), void *pdata, void *ptos, INT16U opt){INT16U *stk。如果用戶需要使用這些函數(shù),define constant OS_CPU_HOOKS_EN設(shè)為1,設(shè)為0表示不使用這些函數(shù)[15]。OUT DX, AL 。MOV AX, SEG _OSTickDOSCtr 。但由于PC環(huán)境的特殊性,時(shí)鐘節(jié)拍由硬件產(chǎn)生, ()。POP DS
點(diǎn)擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1