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

正文內容

移植μcos-ii到arm(編輯修改稿)

2025-11-12 02:59 本頁面
 

【文章內容簡介】 碼是 THUMB代碼 關中斷和開中斷是為了保護臨界段代碼。這些代碼與處理器有關,是需要移植的代碼。在 ARM處理器核中關中斷和開中斷時通過改變程序狀態(tài)寄存器 CPSR中的相應控制位實現。由于使用了軟件中斷,程序狀態(tài)寄存器 CPSR保存到程序狀態(tài)保存寄存器 SPSR中,軟件中斷退出時會將SPSR恢復到 CPSR中,所以程序只要改變程序狀態(tài)保存寄存器 SPSR中的相應的控制位就可以了。 ? 編寫 —— 軟件中斷異常服務程序 功能號 簡介 0x00 任務級任務切換函數 0x01 運行優(yōu)先級最高的任務 ,由OSStartHighRdy產生 0x02 關中斷 0x03 開中斷 0x80 任務切換到系統(tǒng)模式 0x81 任務切換到用戶模式 0x82 任務代碼是 ARM代碼 0x83 任務代碼是 THUMB代碼 void SWI_Exception(int SWI_Num, int *Regs) { ... case 0x02: // 關中斷 __asm { MRS R0,SPSR ORR R0,R0,NoInt MSR SPSR_c,R0 } OsEnterSum++。 break。 case 0x03: // 開中斷 if (OsEnterSum == 0) { __asm { MRS R0,SPSR BIC R0,R0,NoInt MSR SPSR_c,R0 } } break。 ... 每關閉一次中斷,中斷關閉計數器加 1 每調用一次開中斷函數,該計數器減 1,為0時允許打開中斷 關閉中斷 打開中斷? 編寫 —— 軟件中斷異常服務程序 功能號 簡介 0x00 任務級任務切換函數 0x01 運行優(yōu)先級最高的任務 ,由OSStartHighRdy產生 0x02 關中斷 0x03 開中斷 0x80 任務切換到系統(tǒng)模式 0x81 任務切換到用戶模式 0x82 任務代碼是 ARM代碼 0x83 任務代碼是 THUMB代碼 它們可以在任何情況下使用。它們改變程序狀態(tài)保留寄存器 SPSR的相應位段,而程序狀態(tài)保留寄存器會在軟件中斷退出時復制到程序狀態(tài)寄存器 CPSR,任務的處理器模式就改變了。 ? 編寫 —— 軟件中斷異常服務程序 功能號 簡介 0x00 任務級任務切換函數 0x01 運行優(yōu)先級最高的任務 ,由OSStartHighRdy產生 0x02 關中斷 0x03 開中斷 0x80 任務切換到系統(tǒng)模式 0x81 任務切換到用戶模式 0x82 任務代碼是 ARM代碼 0x83 任務代碼是 THUMB代碼 void SWI_Exception(int SWI_Num, int *Regs) { ... case 0x80: // 任務切換到系統(tǒng)模式 __asm { MRS R0,SPSR BIC R0,R0,0x1f ORR R0,R0,SYS32Mode MSR SPSR_c,R0 } break。 case 0x81: // 任務切換到用戶模式 __asm { MRS R0,SPSR BIC R0,R0,0x1f ORR R0,R0,USR32Mode MSR SPSR_c,R0 } break。 ... 使用內嵌匯編將處理器模式切換到用戶模式 使用內嵌匯編將處理器模式切換到系統(tǒng)模式 ? 編寫 —— 軟件中斷異常服務程序 功能號 簡介 0x00 任務級任務切換函數 0x01 運行優(yōu)先級最高的任務 ,由OSStartHighRdy產生 0x02 關中斷 0x03 開中斷 0x80 任務切換到系統(tǒng)模式 0x81 任務切換到用戶模式 0x82 任務代碼是 ARM代碼 0x83 任務代碼是 THUMB代碼 任務可以使用 ARM的兩種指令集的任意一種運行,但是任務建立時默認的只是一種指令集。如果任務使用的第一條指令與默認的指令集不同,則程序運行錯誤。所以增加兩個函數 TaskIsARM()和TaskIsTHUMB()用于改變任務建立時默認的指令集。 它們都有唯一的參數:需要改變的任務的優(yōu)先級,值得注意的是,這兩個函數必須在相應的任務建立后但還沒有運行時調用。 ? 編寫 —— 軟件中斷異常服務程序 功能號 簡介 0x00 任務級任務切換函數 0x01 運行優(yōu)先級最高的任務 ,由OSStartHighRdy產生 0x02 關中斷 0x03 開中斷 0x80 任務切換到系統(tǒng)模式 0x81 任務切換到用戶模式 0x82 任務代碼是 ARM代碼 0x83 任務代碼是 THUMB代碼 ... case 0x82: // 任務代碼是 ARM代碼 if (Regs[0] = OS_LOWEST_PRIO) { ptcb = OSTCBPrioTbl[Regs[0]]。 if (ptcb != NULL) { ptcb OSTCBStkPtr[1] amp。= ~(1 5)。 } } break。 case 0x83: // 任務代碼是 Thumb代碼 if (Regs[0] = OS_LOWEST_PRIO) { ptcb = OSTCBPrioTbl[Regs[0]]。 if (ptcb != NULL) { ptcb OSTCBStkPtr[1] |= (1 5)。 } } break。 ... 被設置的任務號一定不能大于最低優(yōu)先級任務 獲取指定任務的任務控制塊的地址 修改任務堆棧中 CPSR的值,在任務重新運行時,切換到ARM指令方式 修改任務堆棧中 CPSR的值,在任務重新運行時,切換到Thumb指令方式 ? 編寫 —— 軟件中斷異常服務程序 功能號 簡介 0x00 任務級任務切換函數 0x01 運行優(yōu)先級最高的任務 ,由OSStartHighRdy產生 0x02 關中斷 0x03 開中斷 0x80 任務切換到系統(tǒng)模式 0x81 任務切換到用戶模式 0x82 任務代碼是 ARM代碼 0x83 任務代碼是 THUMB代碼 注意 : 這兩個函數必須在相應的任務建立后但還沒有運行時調用。 如果在低優(yōu)先級的任務中創(chuàng)建高優(yōu)先級的任務就十分危險了。此時,解決的方法有三種: (1)高優(yōu)先級任務使用默認的指令集; (2)改變函數 OSTaskCreateHook()使任務默認不是處于就緒狀態(tài),建立任務后調用函數OSTaskResume()來使任務進入就緒狀態(tài); (3)建立任務時禁止任務切換,調用函數TaskIsARM()或 TaskIsTHUMB()后再允許任務切換。 ? 編寫 在 ,它們在某個特定的系統(tǒng)動作時被調用,允許執(zhí)行函數中的用戶代碼。這些函數默認是空函數,用戶根據實際情況添加相關代碼。它們分別如下表所示。 —— ? Hook( )函數 函數名 被執(zhí)行條件 OSInitHookBegin( ) 在開始執(zhí)行 OSInit( )函數時被執(zhí)行 OSInitHookEnd( ) 在 OSInit()函數結束時被執(zhí)行 OSTaskCreateHook( ) 在任務建立時被調用 OSTaskDelHook( ) 在任務刪除時被調用 OSTaskSwHook( ) 在進行任務切換時被調用 OSTaskStatHook( ) 被統(tǒng)計任務調用,每秒執(zhí)行一次 OSTCBInitHook( ) 在建立所有的 TCB后,由 OSTCBInit函數調用 OSTimeTickHook( ) 每個時鐘節(jié)拍產生后被調用 OSTaskIdleHook( ) 由空閑任務調用 移植 μC/OSII ? 編寫 在 、任務切換程序、 OS啟動時運行就緒最高優(yōu)先級任務的程序。 ? 編寫 在調用軟中斷之后,處理器切換到 ARM指令和管理模式下工作。在執(zhí)行軟件中斷服務函數之前,要提取中斷號和其它入口參數,這些通過軟件中斷接口程序完成。 —— 軟件中斷匯編接口 SoftwareInterrupt LDR SP, StackSvc STMFD SP!, {R0R3, R12, LR} MOV R1, SP MRS R3, SPSR TST R3, T_bit LDRNEH R0, [LR,2] BICNE R0, R0, 0xff00 LDREQ R0, [LR,4] BICEQ R0, R0, 0xFF000000 CMP R0, 1 LDRLO PC, =OSIntCtxSw LDREQ PC, =__OSStartHighRdy BL SWI_Exception LDMFD SP!, {R0R3, R12, PC}^ 保護被中斷的現場 將要用到的寄存器壓棧 判斷中斷前的指令集類型 從產生軟件中斷的指令中提取 中斷號 ARM Thumb 根據不同的中斷號執(zhí)行不同的程序 返回被中斷的任務 中斷號 執(zhí)行程序 0 進行任務切換 1 啟動多任務環(huán)境,運行就緒的最高優(yōu)先級任務 其它 軟件中斷服務函數 ? 編寫 μ COSII是搶占式實時操作系統(tǒng),得到運行的始終是就緒條件下最高優(yōu)先級的任務。當處于運行狀態(tài)的任務因為某種脫離就緒態(tài),或者有其它更高優(yōu)先級的任務進入就緒態(tài),那么操作系統(tǒng)內核就要運行別的就緒任務,這時需要進行任務切換。 任務切換可能發(fā)生的情況有兩種: CPU控制權,通常發(fā)生在等待某個事件或是調用系統(tǒng)延時。調用函數 OS_TASK_SW( ); ,使更高優(yōu)先級的任務進入就緒狀態(tài),內核剝奪當前任務的運行資格。即發(fā)生在中斷退出時。調用函數OSIntCtxSw( )。 —— 任務切換代碼 ? 編寫 雖然 OS_TASK_SW( )和 OSIntCtxSw( )的執(zhí)行條件不同,但是它們的功能相同,只要稍作處理就可以它們共用一段任務切換代碼。這些處理就是保證在執(zhí)行任務切換前兩者的任務現場是一致的。共同執(zhí)行的任務切換代碼是“ OSIntCtxSw” 其中 OS_TASK_SW( )是通過軟件中斷 0完成的,通過前面的分析,可以知道執(zhí)行任務切換時的現場環(huán)境如下所示,同時 R3中保存著 SPSR,它是任務中斷前 CPSR的備份。 —— 任務切換代碼 任務入棧的 其它數據 LR R12 R3 R2 R
點擊復制文檔內容
教學課件相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1