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

正文內(nèi)容

基于arm的嵌入式數(shù)控車床控制系統(tǒng)的開發(fā)論文-資料下載頁

2025-06-28 01:59本頁面
  

【正文】 (),OSSemQuery()。 任務、中斷服務子程序和信號量之間的關(guān)系OSSemCreate():建立一個信號量。使用信號量之前先要建立該信號量,通過用該函數(shù)來建立信號量,并賦初值。OSSen1Del():刪除一個信號量。,該函數(shù)代碼才被編譯。在刪除信號量之前,必須首先刪除操作該信號量的所有任務。OSSemPend():等待一個信號量。若信號量是有效的(信號量的計數(shù)值大于0),則信號量計數(shù)值遞減,然后程序返回“無錯”代碼,調(diào)用它的任務可以繼續(xù)往下執(zhí)行;若此時信號量無效(計數(shù)器的值是0),則調(diào)用OSSemPend()的任務要進入睡眠狀態(tài),等待另一個任務或中斷服務程序發(fā)出該信號量。OSSemPend()允許用戶定義一個最長等待時間作為它的參數(shù)(超時時限),這樣可以避免該任務無期限地等待信號量。如果該參數(shù)為0,該任務將無期限地一直等待下去。OSSemPost():發(fā)出一個信號量。它的作用是發(fā)送一個信號量,信號量計數(shù)值加1或使最高優(yōu)先級的任務由等待狀態(tài)進入就緒狀態(tài)。OSSemAccept():無等待地請求一個信號量。當一個任務請求一個信號量時,如果該信號量暫時無效,也可以讓該任務簡單地返回,而不是進入睡眠等待狀態(tài)。OSSemQuery():查詢一個信號量的當前狀態(tài),得到當前該信號量的等待任務列表和信號量當前計數(shù)值。 消息郵箱消息郵箱是μC/OSⅡ的另一種通訊機制。μC/OSⅡ提供了7個對郵箱操作的函數(shù)OSMboxCreate(),OSMboxDel(),OSMboxPend(),OSMboxPost(),OSMboxAccept(),OSMboxQuery(),OSMboxPostOpt()。 、中斷服務子程序和郵箱之間的關(guān)系典型的消息郵箱也稱作交換消息,是用一個指針型變量,通過內(nèi)核服務,一個任務或一個中斷服務程序可以把一則消息(即一個指針)放到郵箱里去。同樣,一個或多個任務可以通過內(nèi)核服務接收這則消息。發(fā)送消息的任務和接收消息的任務約定,該指針指向的內(nèi)容就是那則消息。每個郵箱有相應的正在等待消息的任務列表,要得到消息的任務會因為郵箱是空的而被掛起,且被記錄到等待消息的任務表中,直到收到消息。一般地說,內(nèi)核允許用戶定義等待超時,等待消息的時間超過了,仍然沒有收到該消息,這任務進入就緒態(tài),并返回出錯信息,報告等待超時錯誤。消息放入郵箱后,或者是把消息傳給等待消息的任務表中優(yōu)先級最高的那個任務(基于優(yōu)先級),或者是將消息傳給最先開始等待消息的任務(基于先進先出)。內(nèi)核一般提供以下郵箱服務:(1)郵箱內(nèi)消息的內(nèi)容初始化,郵箱里最初可以有,也可以沒有消息。(2)將消息放入郵箱(POST)。(3)等待有消息進入郵箱(PEND)。如果郵箱內(nèi)有消息,就接受這則消息。如果郵箱里沒有消息,則任務并不被掛起(ACCEPT),用返回代碼表示調(diào)用結(jié)果,是收到了消息還是沒有收到消息。消息郵箱也可以當作只取兩個值的信號量來用。郵箱里有消息,表示資源可以使用,而空郵箱表示資源已被其它任務占用。 μC/OSⅡ的中斷機制為了保證操作系統(tǒng)的實時性,對異步事件(如異常情況及運行結(jié)果)要立刻處理,就需要引入中斷機制。一般來說中斷是微處理器必須具有的硬件機制,用于通知CPU“某異步事件”發(fā)生。中斷一旦被識別,CPU保存部分或全部現(xiàn)場,即部分或全部寄存器的值,然后跳轉(zhuǎn)到專門的子程序,稱為中斷服務子程序。中斷使得CPU可以在事件發(fā)生的時候才予以處理,而不是讓微處理器不斷地查詢是否有事件發(fā)生。μC/OSⅡ通過兩條特殊指令:關(guān)中斷(OS_ENTER_CRITICAL)和開中斷 (OS_EXIT_CRITICAL),可以讓微處理器不響應或能夠響應中斷?;讦藽/OSⅡ的系統(tǒng)響應中斷的過程是:系統(tǒng)接受到中斷請求后,判斷如果這時CPU處于中斷允許狀態(tài),系統(tǒng)就會終止正在運行的當前任務,而按照中斷向量的指向轉(zhuǎn)而去運行中斷服務子程序;當中斷服務子程序的運行結(jié)束后,系統(tǒng)將會根據(jù)任務優(yōu)先級和任務就緒情況判斷是返回到被終止的任務繼續(xù)運行,或者轉(zhuǎn)向運行另一個具有更高優(yōu)先級別的就緒任務,原因在于μC/OSⅡ內(nèi)核本身是可剝奪的內(nèi)核。μC/OSⅡ系統(tǒng)允許中斷嵌套,即高優(yōu)先級別的中斷源的中斷請求可以中斷低優(yōu)先級別的中斷服務程序的運行。在μC/OSⅡ中,通常用一個任務來完成異步事件的處理工作,而在中斷服務程序中只是通過向任務發(fā)送消息或信號的方法去激活這個任務。 中斷服務子程序流程圖 μC/OSⅡ在LPC2220上的移植μC/OSⅡ是個代碼完全公開的實時嵌入式操作系統(tǒng),源代碼絕大部分用ANSIC語言編寫,只有少數(shù)與CPU相關(guān)的部分代碼才使用匯編語言編寫,這是因為μC/OSⅡ在讀寫處理器寄存器時只能通過匯編語言來實現(xiàn)。要使μC/OSⅡ能夠成功移植,處理器需要滿足以下條件[31]:(1)處理器的C編譯器能產(chǎn)生可重入代碼。(2)用C語言就可以打開和關(guān)閉中斷。(3)處理器支持中斷,并且能產(chǎn)生定時中斷(通常在10至1000Hz之間)。(4)處理器支持能夠容納一定量數(shù)據(jù)(可能是幾千字節(jié))的硬件堆棧。(5)處理器有將堆棧指針和其它CPU寄存器讀出和存儲到堆?;騼?nèi)存中的指令。Ⅱ軟、硬件體系結(jié)構(gòu)圖,ARM7系列的LPC2220微處理器完全滿足上述移植條件[32]。 基于μC/OSⅡ的硬件和軟件體系結(jié)構(gòu)圖根據(jù)μC/OSⅡ的要求,移植μC/OSⅡ。 define語句定義的、與處理器相關(guān)的常數(shù)、宏以及類型。 定義不依賴編譯器的數(shù)據(jù)類型μC/OSⅡ中不使用C語言中的short,int,long等數(shù)據(jù)類型定義,因為他們與處理器類型有關(guān)。而且不同的編譯器會使用不同的字節(jié)長度表示同一數(shù)據(jù)類型,相關(guān)的數(shù)據(jù)類型的定義如下:typedef unsigned char BOOLEAN。typedef unsigned char INT8U。typedef singed char INT8S。typedef unsigned short INT16U。typedef signed short INT16S。typedef unsigned int INT32U。typedef signed int INT32S。typedef float FP32。typedef double FP64。typedef INT32S OS_STK。 OS_ENTER_CRITICAL()和OS_EXIT_CREITICAL()的編寫與所有的實時內(nèi)核一樣,μC /OSⅡ需要先禁止中斷在訪問代碼的臨界段,并且在訪問完畢后重新允許中斷。這就使得μC /OSⅡ能夠保護臨界代碼免受多任務或中斷服務程序的破壞。μC /OSⅡ定義了兩個宏來禁止和允許中斷。在ARM7中,可以通過對CPSR的讀寫來禁止和使能中斷。具體實現(xiàn)代碼如下:OS_ENTER_CRITACAL(關(guān)中斷) STMFD SP!, {R0,LR} MRS R0, CPSR ORR R0, R0,(17) MSR CPSR_c, R0 LDR R0, =OsEnterSum LDR R1, [R0] ADD R1, R1,1 STR R1, [R0] LDMFD SP!, {R0,PC}OS_EXIT_CRITICAL(開中斷)  LDR R0, =OsEnterSum LDR R1, [R0] SUBS R1, R1,1 STR R1, [R0] MRS R0, CPSR BICEQ R0, R0,(17) MSREQ CPSR_c, R0 LDMFD SP!, {R0R1,PC} OS_STK_GROWTH的編寫OS_STK_GROWTH用來定義堆棧的生長方式,置OS_STK_GROWTH為0表示堆棧從下向上生長,為1表示堆棧從上向下生長。雖然ARM處理器核支持兩種生長方式,但ADS的C語言編譯器只支持從上向下的生長方式,即滿遞減堆棧,所以OS_STK_GROWTH應該置為1,代碼如下。define OS_STK_GROWTH 1 OS_TASK_SW()函數(shù)的編寫OS_TASK_SW()是一個宏,它是μC /OSⅡ從低優(yōu)先級任務切換到高優(yōu)先級時被調(diào)用的,OS_TASK_SW()總是在任務級代碼中被調(diào)用。任務切換只是簡單的將處理器的寄存器保存到將被掛起的任務的堆棧中,并且將更高優(yōu)先級的任務從堆棧中恢復出來。OS_TASK_SW()的實現(xiàn)可以通過兩種途徑:其一,用OS_TASK_SW()模擬中斷,并且中斷向量地址必須指向匯編語言函數(shù)OSCtxSw(),當任務切換時,通過執(zhí)行OS_TASK_SW()來產(chǎn)生中斷,終端服務子程序OSCtxSw()實現(xiàn)任務的切換;其二,用于特定的不提供軟件中斷機制的處理器。這種情況下,用戶需要將堆棧結(jié)構(gòu)設置成與中斷堆棧結(jié)構(gòu)一樣的結(jié)構(gòu)。OS_TASK_SW()只會簡單的調(diào)用OSCtxSw()而不是將向量指向OSCtxSw()。本文采用第二種方法,直接從OS_TASK_SW()調(diào)用OSCtxSw()完成任務的切換,而沒有采用軟中斷的方式。 μC/OSⅡ的移植要求用戶編寫10個簡單的C函數(shù):OSTaskStkInit(),OSInitHookBegin(),OSInitHookEnd(),OSTaskCreateHook(),OSTaskDelHook(),OSTaskSwHook(),OSTaskStatHook(),OSTCBIinitHook(),OSTimeATickHook(),OSTaskIdleHook()。其中惟一必要函數(shù)是OSTaskStkInit(),其他9個函數(shù)必須聲明,并不一定要包含任何代碼,在本文中這些函數(shù)為空。OSTaskStkInit():在編寫該函數(shù)之前,必須先確定任務的堆棧結(jié)構(gòu)。而任務的堆棧結(jié)構(gòu)與CPU的體系結(jié)構(gòu)、編譯器有密切的聯(lián)系。 任務堆棧結(jié)構(gòu)其中OsEnterSum不是CPU的寄存器,而是為了保存關(guān)中斷的次數(shù)而設的全局變量。這樣關(guān)中斷和開中斷就可以嵌套了。OSTaskStkInit()具體實現(xiàn)代碼如下:Os_STK *OSTaskStkInit(viod(*task)(void *pd),void*pdata,OS_STK *ptos,INT16U opt){ OS_STK *stk?!pt=opt?!?/避免編譯警告 stk=ptos?!?/或取堆棧執(zhí)針 //建立任務環(huán)境,使用滿遞減堆棧// *stk=(OS_STK)task?!?/pc *stk=(OS_STK)task?!?/lr *stk=0。 //r12 *stk=0?!?/r11 *stk=0?!?/r10 *stk=0?!?/r9 *stk=0。 //r8 *stk=0。 //r7 *stk=0?!?/r6 *stk=0?!?/r5 *stk=0。 //r4 *stk=0?!?/r3 *stk=0?!?/r2 *stk=0?!?/r1 *stk=(unsigned int)pdata?!?/r0,第一個參數(shù)是用r0傳遞 *stk=(USER_USING_MODE|0x00)?!?/spsr,允許中斷 *stk=0。 //關(guān)中斷計數(shù)器OsEnterSum Return(stk)。} μC /OSⅡ的移植要求用戶編寫的匯編語言函數(shù)有:OSStartHightRdy( ),OSCtxSw( ),OSIntCtxSw( ),OSTickISR()。這幾個函數(shù)也可以用嵌入式C語言來完成。 OSStartHighRdy函數(shù)的編寫μC/OSⅡ中啟動多任務環(huán)境的函數(shù)是OSStart()。在OSStart()多任務啟動后,OSStartHighRdy函數(shù)負責從最高優(yōu)先級任務的TCB控制塊中獲得該任務的堆棧指針SP,,通過SP依次將CPU現(xiàn)場恢復,這時系統(tǒng)就將控制權(quán)交給用戶創(chuàng)建的該任務進程,直到該任務被阻塞或者被其他更高優(yōu)先級的任務搶占CPU。該函數(shù)僅在多任務啟動時被執(zhí)行一次,即執(zhí)行最高優(yōu)先級任務,之后多任務的調(diào)度和切換由其它函數(shù)實現(xiàn)。OSStartHighRdy函數(shù)具體實現(xiàn)代碼如下:OSStartHighRdy BL OSTaskSwHooK //調(diào)用用戶定義的OSTaskSWHook LDR  R0, =OSRunning //通知μC/OS已經(jīng)啟動多任務 MOV R1,1 STRB R1,[R0] LDR R1,=OSTCBHighRdy //得到將要運行任務的堆棧指針 //SP=OSTCBHighRdyOSTCBStkPTR LDR R1, [R1] B OSCtxSw_10需要說明的是,μC /OSⅡ為了執(zhí)行簡單,堆棧指針總是存儲在任務控制塊OS_TCB的開頭。也就是說,想要恢復任務堆棧的指針,總是存儲在OS_TCB中偏移地址為0的內(nèi)存單元內(nèi)。 OSCtxSw函數(shù)的編寫OSCtxSw是任務級的任務切換函數(shù),當任務因為被阻塞而主動請求CPU調(diào)度時被執(zhí)行,由于此時的任務切換在非異常模式下進行,因此區(qū)別于中斷級別的任務切換。它的工作是先將當前任務的CPU現(xiàn)場保存到該任務堆棧中,然后獲得最高優(yōu)先級任務的堆棧指針,從該堆棧中恢復此任務的CPU現(xiàn)場,使之繼續(xù)執(zhí)行。這樣就完成了一次任務切換。 OSIntCtxSw()函數(shù)的編寫OSIntCtxSw()的功能是實現(xiàn)中斷級的任務切換。在時鐘中斷ISR(中斷服務例程)中發(fā)現(xiàn)有高優(yōu)先級任務等待的時鐘信號到來,則在中斷退出后并不返回被中斷任務,而是直接調(diào)度就緒的高優(yōu)先級任務執(zhí)行,從而能夠盡快地讓高優(yōu)先級的任務得到響應,保證系統(tǒng)的實時性能。其原理基本上與任務級的切換相同,但是由于進入中斷時已經(jīng)保存了被中斷任務的CPU現(xiàn)場,因此不用再進行類似的操作,只需對堆棧指針做相應調(diào)整。 OSTickISR()函數(shù)的編寫OSTickISR()是系統(tǒng)時鐘節(jié)拍中斷服務函數(shù)。其主要任務是負責處理
點擊復制文檔內(nèi)容
化學相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1