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

正文內(nèi)容

科技學(xué)院本科畢業(yè)論文畢業(yè)設(shè)計(jì)學(xué)位論文范文模板參考資料-電能智能采集終端器設(shè)計(jì)(文件)

2024-12-27 17:28 上一頁面

下一頁面
 

【正文】 2. 軟件中斷異常 SWI 服務(wù)程序 C 語言部分 軟件中斷的 C語言處理函數(shù)代碼見 程序清單 ,其中參數(shù) SWI_Num 為功能號,而 Regs為指向堆棧中保存寄存器的值的位置。 程序清單 軟中斷代碼的 C 語言部分 void SWI_Exception(int SWI_Num, int *Regs) { OS_TCB *ptcb。 (12) case 0x80: __asm (13) { MRS R0,SPSR (14) BIC R0,R0,0x1f (15) ORR R0,R0,SYS32Mode (16) MSR SPSR_c,R0 (17) } break。=~(15)。(33) } } break。這些代碼與處理器有關(guān),是需要移植的代碼。 4. OSStartHighRdy μ C/OSII的啟動多任務(wù)環(huán)境的函數(shù)叫做 OSStart(),用戶在調(diào)用 OSStart()之前,必須已經(jīng)建立了一個(gè)或更多任務(wù)。軟中斷的 1 號功能并沒有在這里實(shí)現(xiàn)。 處理器模式轉(zhuǎn)換函數(shù) ChangeToSYSMode()和 ChangeToUSRMode()使用軟件中斷功能0x80 和 0x81 實(shí)現(xiàn),其中函數(shù) ChangeToSYSMode()(程序清單 (13)~(18))把當(dāng)前任務(wù)轉(zhuǎn)換到系統(tǒng)模式,函數(shù) ChangeToUSRMode()(程序清單 (19)~(24))把當(dāng)前任務(wù)轉(zhuǎn)換到用戶模式,它們可以在任何情況下使用。為了糾正這個(gè)錯(cuò)誤,本移植增加兩個(gè)函數(shù) TaskIsARM()和 TaskIsTHUMB()用于改變?nèi)蝿?wù)建立時(shí)默認(rèn)的指令集。函數(shù) TaskIsARM()和 TaskIsTHUMB()使用軟件中斷功能 0x82 和 0x83 實(shí)現(xiàn)。 6. ? Hook()函數(shù) μ C/OSII 有很多由用戶編寫的? Hook()函數(shù),它們在本移植中全為空函數(shù),用戶可以根據(jù)μ C/OSII 的要求修改它。如果是 Thumb 指令集狀態(tài),則通過 程序清單 (6)讀取指令,通過 程序清單 (7)取得指令中的功能號。這兩個(gè)功能不在 C語言中實(shí)現(xiàn),原因一是因?yàn)樗鼈冃枰鞔_的堆棧結(jié)構(gòu),這是 C語言不能 提供的;原因二是兩個(gè)任務(wù)切換程序本身是使用匯編編寫,且同在 這個(gè)文件中,使用匯編跳轉(zhuǎn)十分方便。由 小節(jié)可知, OS_TASK_SW()是使用 SWI 軟件中斷的 0 號功能實(shí)現(xiàn)的。這樣,如果中斷調(diào)用 OSIntCtxSw()時(shí)需要相同的堆棧結(jié)構(gòu), R3 也要保存著 SPSR,這需要中斷服務(wù)程序保證。獲取 PC (1) LDR R12,[SP,16] 。獲取 R0R3 (9) ADD SP,SP,8 。保存 CPSR,OsEnterSum (15) 。保存 R0R3 (12) LDR R1,=OsEnterSum 。保存 LR,PC (6) STMFDSP!,{R4R12} 。 程序清單 OSIntCtxSw 代碼 OSIntCtxSw 。由 程序清單 可知,此時(shí)的堆棧結(jié)構(gòu)如圖 所示。 2. OS_TASK_SW()和 OSIntCtxSw() OS_TASK_SW()是在μ C/OSII從低優(yōu)先級任務(wù)切換到最高優(yōu)先級任務(wù)時(shí)被調(diào)用的,OS_TASK_SW()總是在任務(wù)級代碼中被調(diào)用的。 然后,程序用功能號與 1 比較(程序清單 (10)),當(dāng)功能號無符號小于 1 時(shí)就是 0 了,就跳轉(zhuǎn)到任務(wù)切換函數(shù)處(程序清單 (11)),也就是 OS_TASK_SW()。 程序清單 軟件中斷代碼的匯編部分 SoftwareInterrupt LDR SP, StackSvc (1) STMFD SP!, {R0R3, R12, LR} (2) MOV R1, SP (3) MRS R3, SPSR (4) TST R3, T_bit (5) LDRNEH R0, [LR,2] (6) BICNE R0, R0, 0xff00 (7) LDREQ R0, [LR,4] (8) BICEQ R0, R0,0xFF000000 (9) CMP R0, 1 (10) LDRLO PC, =OSIntCtxSw (11) LDREQ PC, =__OSStartHighRdy (12) BL SWI_Exception (13) LDMFD SP!, {R0R3, R12, PC}^(14) 軟中斷的功能號包含在 SWI 指令中,程序通過讀取該條指令的相應(yīng)位段獲得。首先,程序判斷傳遞的參數(shù)(任務(wù)的優(yōu)先級)是否在允許的范圍內(nèi)(程序清單 (25)、 (30))。這樣,如果在低優(yōu)先級的任務(wù)中創(chuàng)建高優(yōu)先級的任務(wù)就十分危險(xiǎn)了。 前面已經(jīng)說明:任務(wù)可以使用 ARM 的兩種指令集的任意一種運(yùn)行,但是任務(wù)建立時(shí)默認(rèn)的只是一種指令集。 5. 移植增加的特定函數(shù) 根據(jù) ARM 內(nèi)核的特點(diǎn)和移植的目標(biāo),為此增加了兩個(gè)處理器模式轉(zhuǎn)換函數(shù)( ChangeToSYSMode() 、 ChangeToUSRMode() )和兩個(gè)任務(wù)初始指令集設(shè)置函數(shù)( TaskIsARM()、 TaskIsTHUMB()) 。 程序清單 OSStartHighRdy()代碼 void OS_StartHighRdy(void) { O_SStartHighRdy()。由于使用了軟件中斷,程序狀態(tài)寄存器 CPSR 保存到程序狀態(tài)保存寄存器 SPSR 中,軟件中斷退出時(shí)會將 SPSR 恢復(fù)到CPSR中,所以程序只要改變程序狀態(tài)保存寄存器 SPSR 中的相應(yīng)的控制位就可以了。 (35) } } 3. OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL() μ C/OSII 使用宏 OS_ENTER_CRITICAL()( 程序清單 (1)~(6)) 和 OS_EXIT_CRITICAL()( 程序清單 (7)~(12)) 分別關(guān)中斷和開中斷。 (29) case 0x83: if (Regs[0] = OS_LOWEST_PRIO) (30) { ptcb = OSTCBPrioTbl[Regs[0]]。 (24) case 0x82: if (Regs[0] = OS_LOWEST_PRIO) (25) { ptcb = OSTCBPrioTbl[Regs[0]]。 (5) break。對比 表 可知,軟中斷的 0、 1 號功能并沒有在這里實(shí)現(xiàn)。每個(gè)任務(wù)有獨(dú)立的 OsEnterSum,在任務(wù)切換時(shí)保存和恢復(fù)各自的 OsEnterSum。 /* 關(guān)中斷計(jì)數(shù)器 OsEnterSum*/ return (stk)。 /* r2*/ *stk = 0。 /* r6*/ *stk = 0。 /* r10*/ *stk = 0。 /* pc*/ *stk = (OS_STK) task。opt39。根據(jù) 圖 ,很容易寫出函數(shù) OSTaskStkInit()的代碼,具體代碼見 程序清單 。 置 OS_STK_GROWTH 為 1 表示堆棧從上往下長。 /* 任務(wù)切換到系統(tǒng) 模式 */ __swi(0x81) void ChangeToUSRMode(void)。 /* 任務(wù)級任務(wù)切換函數(shù) */ __swi(0x01) void _OSStartHighRdy(void)。同時(shí),這個(gè)函數(shù)也可以有參數(shù)和返回值,其傳遞規(guī)則與一般函數(shù)一樣。為了使底層接口函數(shù)與處理器狀態(tài)無關(guān),同時(shí)在任務(wù)調(diào)用相應(yīng)的函數(shù)不需要知道函數(shù)位置,本移植使用軟中斷指令 SWI 作為底層接口,使用不同的功能號區(qū)分不同的函數(shù)。 Typedef float FP32。 Typedef unsigned short INT16U。根據(jù) ADS 編譯器的特性,這些代碼如 程序清單 所示。所有的配置改變包括頭文件的增減均在 中進(jìn)行,而 定下來后不必改動(μ C/OSII 的系統(tǒng)文件需要包含的東西是固定的)。 關(guān)于頭文件 和 C/OSII 要求所有 .C 文件的都要包含頭文件 ,這樣使得用戶項(xiàng)目中的每個(gè) .C文件不用分別去考慮它實(shí)際上需要哪些頭文件。將 更名為 是遵照編譯器的慣例。 同時(shí)支持以上 4 點(diǎn)的 C語言編譯器幾乎不存在,即使存在,移植代碼往往也會使用部分匯編語言來提高移植代碼的效率。其它部分也很重要,它們在細(xì)節(jié)上影響代碼,并最終影響代碼的正確性、可靠性和健壯性。關(guān)于第 2 點(diǎn)和第 4 點(diǎn)可以參考參考文獻(xiàn) [9]。 移植 μ C/OSII 概述 要移植一個(gè)操作系統(tǒng)到一個(gè)特定的 CPU 體系結(jié)構(gòu)上并不是一件很容易的事情,它對移植者有以下要求: 1. 對目標(biāo)體系結(jié)構(gòu)要有很深了解; 2. 對 OS 原理要有較深入的了解; 3. 對所使用的編譯器要有較深入的了解; 4. 對需要移植的操作系統(tǒng)要有相當(dāng)?shù)牧私猓? 5. 對具體使用的芯片也要一定的了解。而系統(tǒng)模式除了是特權(quán)模式外,其它與用戶模式一樣,因而可選的給任務(wù)使用的模式只有用戶模式和系統(tǒng)模式。GCC 雖然支持廣泛,很多開發(fā)套件使用它作為編譯器,與 ADS 比較其編譯效率較低,這對充分發(fā)揮芯片性能很不利,所以最終使用 ADS 編譯程序和調(diào)試。主要包括中斷級任務(wù)切換的底層實(shí)現(xiàn)、任務(wù)級任務(wù)切換的底層實(shí)現(xiàn)、時(shí)鐘節(jié)拍的產(chǎn)生和處理、中斷的相關(guān) 處理部分等內(nèi)容。 4) 任務(wù)同步和通信部分 為事件處理部分,包括信號量、郵箱、郵箱隊(duì)列、事件標(biāo)志等部分;主要用于任務(wù)間的互相聯(lián)系和對臨界資源的訪問。包括任務(wù)的建立、刪除、掛起、恢復(fù)等等。 C/OSII 的組成部分 μ C/OSII可以大致分成核心、任務(wù)處理、時(shí)間處理、任務(wù)同步與通信, CPU 的移植等 5個(gè)部分。 調(diào)度工作的內(nèi)容可以分為兩部分:最高優(yōu)先級任 務(wù)的尋找和任務(wù)切換。 任務(wù)調(diào)度將在以下情況 下發(fā)生: 1) 高優(yōu)先級的任務(wù)因?yàn)樾枰撤N臨界資源,主動請求掛起,讓出處理器,此時(shí)將調(diào)度就緒狀態(tài)的低優(yōu)先級任務(wù)獲得執(zhí)行,這種調(diào)度也稱為任務(wù)級的上下文切換。 任務(wù)調(diào)度 uC/OSII 采用的是可剝奪型實(shí)時(shí)多任務(wù)內(nèi)核。釋放內(nèi)存時(shí)將該塊放回它以前所屬的分區(qū),這樣能有效解決碎片問題,同時(shí)執(zhí)行時(shí)間也是固定的。但在嵌入式實(shí)時(shí)系統(tǒng)中,多次 這樣的操作會導(dǎo)致內(nèi)存碎片,且由于內(nèi)存管理算法的原因, malloc和 free 的執(zhí)行時(shí)間也是不確定。 時(shí)間管理 uC/OSII 的時(shí)間管理是通過定時(shí)中斷來實(shí)現(xiàn)的,該定時(shí)中斷一般為 10毫秒或 100毫秒發(fā)生一次,時(shí)間頻率取決于用戶對硬件系統(tǒng)的定時(shí)器編程來實(shí)現(xiàn)。 任務(wù)管理 uC/OSII 中最多可以支持 64 個(gè)
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1