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

正文內(nèi)容

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

2024-12-07 17:28本頁面
  

【正文】 保存 CPSR,OsEnterSum (15) 。保存 R0R3 (12) LDR R1,=OsEnterSum 。獲取 R0R3 (9) ADD SP,SP,8 。保存 LR,PC (6) STMFDSP!,{R4R12} 。獲取 PC (1) LDR R12,[SP,16] 。 程序清單 OSIntCtxSw 代碼 OSIntCtxSw 。這樣,如果中斷調(diào)用 OSIntCtxSw()時需要相同的堆棧結(jié)構(gòu), R3 也要保存著 SPSR,這需要中斷服務(wù)程序保證。由 程序清單 可知,此時的堆棧結(jié)構(gòu)如圖 所示。由 小節(jié)可知, OS_TASK_SW()是使用 SWI 軟件中斷的 0 號功能實現(xiàn)的。 2. OS_TASK_SW()和 OSIntCtxSw() OS_TASK_SW()是在μ C/OSII從低優(yōu)先級任務(wù)切換到最高優(yōu)先級任務(wù)時被調(diào)用的,OS_TASK_SW()總是在任務(wù)級代碼中被調(diào)用的。這兩個功能不在 C語言中實現(xiàn),原因一是因為它們需要明確的堆棧結(jié)構(gòu),這是 C語言不能 提供的;原因二是兩個任務(wù)切換程序本身是使用匯編編寫,且同在 這個文件中,使用匯編跳轉(zhuǎn)十分方便。 然后,程序用功能號與 1 比較(程序清單 (10)),當(dāng)功能號無符號小于 1 時就是 0 了,就跳轉(zhuǎn)到任務(wù)切換函數(shù)處(程序清單 (11)),也就是 OS_TASK_SW()。如果是 Thumb 指令集狀態(tài),則通過 程序清單 (6)讀取指令,通過 程序清單 (7)取得指令中的功能號。 程序清單 軟件中斷代碼的匯編部分 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)位段獲得。 6. ? Hook()函數(shù) μ C/OSII 有很多由用戶編寫的? Hook()函數(shù),它們在本移植中全為空函數(shù),用戶可以根據(jù)μ C/OSII 的要求修改它。首先,程序判斷傳遞的參數(shù)(任務(wù)的優(yōu)先級)是否在允許的范圍內(nèi)(程序清單 (25)、 (30))。函數(shù) TaskIsARM()和 TaskIsTHUMB()使用軟件中斷功能 0x82 和 0x83 實現(xiàn)。這樣,如果在低優(yōu)先級的任務(wù)中創(chuàng)建高優(yōu)先級的任務(wù)就十分危險了。為了糾正這個錯誤,本移植增加兩個函數(shù) TaskIsARM()和 TaskIsTHUMB()用于改變?nèi)蝿?wù)建立時默認(rèn)的指令集。 前面已經(jīng)說明:任務(wù)可以使用 ARM 的兩種指令集的任意一種運行,但是任務(wù)建立時默認(rèn)的只是一種指令集。 處理器模式轉(zhuǎn)換函數(shù) ChangeToSYSMode()和 ChangeToUSRMode()使用軟件中斷功能0x80 和 0x81 實現(xiàn),其中函數(shù) ChangeToSYSMode()(程序清單 (13)~(18))把當(dāng)前任務(wù)轉(zhuǎn)換到系統(tǒng)模式,函數(shù) ChangeToUSRMode()(程序清單 (19)~(24))把當(dāng)前任務(wù)轉(zhuǎn)換到用戶模式,它們可以在任何情況下使用。 5. 移植增加的特定函數(shù) 根據(jù) ARM 內(nèi)核的特點和移植的目標(biāo),為此增加了兩個處理器模式轉(zhuǎn)換函數(shù)( ChangeToSYSMode() 、 ChangeToUSRMode() )和兩個任務(wù)初始指令集設(shè)置函數(shù)( TaskIsARM()、 TaskIsTHUMB()) 。軟中斷的 1 號功能并沒有在這里實現(xiàn)。 程序清單 OSStartHighRdy()代碼 void OS_StartHighRdy(void) { O_SStartHighRdy()。 4. OSStartHighRdy μ C/OSII的啟動多任務(wù)環(huán)境的函數(shù)叫做 OSStart(),用戶在調(diào)用 OSStart()之前,必須已經(jīng)建立了一個或更多任務(wù)。由于使用了軟件中斷,程序狀態(tài)寄存器 CPSR 保存到程序狀態(tài)保存寄存器 SPSR 中,軟件中斷退出時會將 SPSR 恢復(fù)到CPSR中,所以程序只要改變程序狀態(tài)保存寄存器 SPSR 中的相應(yīng)的控制位就可以了。這些代碼與處理器有關(guān),是需要移植的代碼。 (35) } } 3. OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL() μ C/OSII 使用宏 OS_ENTER_CRITICAL()( 程序清單 (1)~(6)) 和 OS_EXIT_CRITICAL()( 程序清單 (7)~(12)) 分別關(guān)中斷和開中斷。(33) } } break。 (29) case 0x83: if (Regs[0] = OS_LOWEST_PRIO) (30) { ptcb = OSTCBPrioTbl[Regs[0]]。=~(15)。 (24) case 0x82: if (Regs[0] = OS_LOWEST_PRIO) (25) { ptcb = OSTCBPrioTbl[Regs[0]]。 (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。 (5) break。 程序清單 軟中斷代碼的 C 語言部分 void SWI_Exception(int SWI_Num, int *Regs) { OS_TCB *ptcb。對比 表 可知,軟中斷的 0、 1 號功能并沒有在這里實現(xiàn)。 2. 軟件中斷異常 SWI 服務(wù)程序 C 語言部分 軟件中斷的 C語言處理函數(shù)代碼見 程序清單 ,其中參數(shù) SWI_Num 為功能號,而 Regs為指向堆棧中保存寄存器的值的位置。每個任務(wù)有獨立的 OsEnterSum,在任務(wù)切換時保存和恢復(fù)各自的 OsEnterSum。在調(diào)用 OS_ENTER_CRITICAL()時,它 的值增加,同時關(guān)中斷。 /* 關(guān)中斷計數(shù)器 OsEnterSum*/ return (stk)。 /* r0, 第一個參數(shù)使用 R0 傳遞 */ *stk = (USER_USING_MODE|0x00)。 /* r2*/ *stk = 0。 /* r4*/ *stk = 0。 /* r6*/ *stk = 0。 /* r8*/ *stk = 0。 /* r10*/ *stk = 0。 /* r12*/ *stk = 0。 /* pc*/ *stk = (OS_STK) task。作用是避免編譯器警告 */ stk= ptos。opt39。 opt= opt。根據(jù) 圖 ,很容易寫出函數(shù) OSTaskStkInit()的代碼,具體代碼見 程序清單 。 程序清單 定義堆棧增長方向 define OS_STK_GROWTH 1 編寫 文件 1. OSTaskStkInit() 在編寫此函數(shù)之前,必須先確定任務(wù)的堆棧結(jié)構(gòu)。 置 OS_STK_GROWTH 為 1 表示堆棧從上往下長。 /* 任務(wù)代碼是 ARM 代碼 */ __swi(0x83) void TaskIsTHUMB(INT8U prio)。 /* 任務(wù)切換到系統(tǒng) 模式 */ __swi(0x81) void ChangeToUSRMode(void)。 /* 關(guān)中斷 */ __swi(0x03) void OS_EXIT_CRITICAL(void)。 /* 任務(wù)級任務(wù)切換函數(shù) */ __swi(0x01) void _OSStartHighRdy(void)。關(guān)鍵字 __swi 的具體使用規(guī)則請參考 ADS 的編譯器手冊。同時,這個函數(shù)也可以有參數(shù)和返回值,其傳遞規(guī)則與一般函數(shù)一樣。不過,用軟中斷作為操作系統(tǒng)的底層接口就需要在 C語言中使用 SWI 指令。為了使底層接口函數(shù)與處理器狀態(tài)無關(guān),同時在任務(wù)調(diào)用相應(yīng)的函數(shù)不需要知道函數(shù)位置,本移植使用軟中斷指令 SWI 作為底層接口,使用不同的功能號區(qū)分不同的函數(shù)。 Typedef INT32U OS_STK。 Typedef float FP32。 Typedef unsigned int INT32U。 Typedef unsigned short INT16U。 Typedef unsigned char INT8U。根據(jù) ADS 編譯器的特性,這些代碼如 程序清單 所示。 編寫 1. 不依賴于編譯的數(shù)據(jù)類型 μ C/OSII不使用 C語言中的 short、 int、 long 等數(shù)據(jù)類型的定義,因為它們與處理器類 型有關(guān),隱含著不可移植性。所有的配置改變包括頭文件的增減均在 中進(jìn)行,而 定下來后不必改動(μ C/OSII 的系統(tǒng)文件需要包含的東西是固定的)。在本移植中另外增加了一個頭文件 ,我們要求所有用戶程序必須包含 ,在 中包含 和特定的頭文 件和配置項。 關(guān)于頭文件 和 C/OSII 要求所有 .C 文件的都要包含頭文件 ,這樣使得用戶項目中的每個 .C文件不用分別去考慮它實際上需要哪些頭文件。時鐘節(jié)拍中斷服務(wù)程序也沒有移植,因為其與芯片和應(yīng)用都緊密相關(guān),需要用戶自己編寫,不過可以通過 簡化用戶代碼的編寫。將 更名為 是遵照編譯器的慣例。實際上,還有一個 文件需要關(guān)注,因為每一個應(yīng)用都包含獨特的 文件。 同時支持以上 4 點的 C語言編譯器幾乎不存在,即使存在,移植代碼往往也會使用部分匯編語言來提高移植代碼的效率。根據(jù)μ C/OSII 的要求,移植μ C/OSII到一個新的體系結(jié)構(gòu)上需要提供 2 個或 3 個文件: ( C語言頭文件)、 ( C 程序源文件)及 (匯編程序源文 件),其中 在某些情況下不需要,但極其罕見。
點擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1