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

正文內容

嵌入式系統設計與實例開發(fā)——arm與?cos-ⅱ第五講?c(文件)

2024-09-25 11:15 上一頁面

下一頁面
 

【正文】 CB地址 LDR r5, addr_OSTCBHighRdy 。 設置新的當前任務 TCB地址 LDMFD sp!, {r4} 。 運行新的任務 76 OSCtxSw()的原型 void OSCtxSw(void) { 保存處理器寄存器 。 OSPrioCur = OSPrioHighRdy。 } 77 OS_TASK_SW ();任務級的任務切換函數( 1) OS_TASK_SW STMFD sp!, {lr} 。 保存當前的 PSR MRS r4, SPSR STMFD sp!, {r4} 。 保存 sp在被占先的任務的 TCB 。 設置新的當前任務的 TCB地址 。另外,處理器狀態(tài)字可能是 8, 16, 32甚至 64位寬,并且OSIntExit()可能會分配局部變量。 82 OSIntCtxSW的實現 83 OSIntCtxSw()的原型 void OSIntCtxSw(void) { 調整堆棧指針來去掉在調用: OSIntExit(), OSIntCtxSw()過程中壓入堆棧的多余內容 。 OSPrioCur = OSPrioHighRdy。 } 84 OSIntCtxSW ();中斷級的任務切換函數( 1) OSIntCtxSw add r7, sp, 16 。 關閉 IRQ, FIQ. msr CPSR_cxsf, r1 。 當前 PC地址是 (saved_LR 4) STMFD sp!, {r0} 。 從 FIQ堆棧中得到保存的寄存器 STMFD sp!, {r0r12} 。 保存任務當前 PSR MRS r4, SPSR STMFD sp!, {r4} 。 保存 sp 在被占先的任務的 TCB 86 OSIntCtxSW ();中斷級的任務切換函數( 3) 。 設置新的當前任務的 TCB地址 LDMFD sp!, {r4} MSR SPSR, r4 LDMFD sp!, {r4} BIC r4, r4, 0xC0 。 OS_STK Task1_Stack[STACKSIZE]={0, }。 define Task2_Prio 13 88 測試 181。SYS_Task_Stack[STACKSIZE1], SYS_Task_Prio)。Task1_Stack[STACKSIZE1], Task1_Prio )。C/OSII( 3) void Task1(void *Id) { for(。) { Uart_Printf(run task2\n)。 for (。C/OSII的開發(fā)者,移植還是有一定難度的。 ? 定義函數 OSIntCtxSw實現中斷級任務切換,用純匯編實現。C/OS 的完善 ? 固定的基于優(yōu)先級的調度,不支持時間片,使用起來不方便。 ? 只是一個實時多任務內核,沒有圖形用戶接口( GUI)、文件系統( FS)和 TCP/IP協議棧。 ? 系統時鐘中斷,沒有提供用戶使用定時器,可以借鑒 Linux的定時器加以修改。 ? 定義 OSTaskStkInit來初始化任務的堆棧。 ? 定義函數 OS_TASK_SW執(zhí)行任務切換。 } } 90 關于移植 相對于其他的嵌入式操作系統, 181。 } } void SYS_Task(void *Id) { uHALr_InstallSystemTimer()。 OSTimeDly(1000)。 // start the game // // never reached // return 0。Task2_Stack[STACKSIZE1], Task2_Prio)。 // do target (uHAL based ARM system) initialisation // OSInit()。 define Task1_Prio 12 OS_STK Task2_Stack[STACKSIZE]= {0, }。C/OSII( 1) /*任務定義 */ OS_STK SYS_Task_Stack[STACKSIZE]= {0, }。 得到新任務堆棧指針 。 OSPrioCur = OSPrioHighRdy // 改變當前程序 LDR r4, addr_OSPrioCur LDR r5, addr_OSPrioHighRdy LDRB r6, [r5] STRB r6, [r4] 。在任務堆棧上保存 PSR 和任務 PSR MRS r4, CPSR bic r4, r4, 0xC0 。 保存 LR mov lr, r7 。 從 IRQ堆棧中得到 IRQ39。FIQ_STACK mrs r1, SPSR 。 將所有處理器寄存器從新任務的堆棧中恢復出來 。 調用用戶定義的 OSTaskSwHook()。在后一種情況下,可以通過簡單的執(zhí)行一定數量的 pop(出棧)指令來實現相同的功能。 返回到新任務的上下文 LDMFD sp!, {r0r12, lr, pc} 79 中斷服務 80 關于棧指針調整 81 棧指針調整 調整堆棧指針(加一個數在堆棧指針上)來完成的。 得到新任務堆棧指針 。 OSPrioCur = OSPrioHighRdy LDR r4, addr_OSPrioCur LDR r5, addr_OSPrioHighRdy LDRBr6, [r5] STRBr6, [r4] 78 OS_TASK_SW():任務級的任務切換函數( 2) 。 保存 lr STMFD sp!, {r0r12} 。 將所有處理器寄存器從新任務的堆棧中恢復出來 。 調用用戶定義的 OSTaskSwHook()。 從棧頂獲得新的狀態(tài) MSR CPSR, r4 。 獲得堆棧指針 LDR sp, [r5] 。實際上, OSTimeTickHook()是在節(jié)拍被 ?C/OSⅡ 真正處理,并通知用戶的移植實例或應用程序之前被調用的。 ? 函數原型: void OSTaskSwHook (void) { if 0 if(OSRunning==TRUE){ /*保存擬被掛起任務的寄存器; } /*恢復擬被運行任務的寄存器; endif } 72 OSTaskStatHook ? OSTaskStatHook()每秒鐘都會被 OSTaskStat()調用一次。 OSTaskSwHook()可以直接訪問 OSTCBCur和 OSTCBHighRdy,因為它們是全局變量。當 該函數被調用的時候,它會收到指向正被刪除任務的 OS_TCB的指針,這樣它就可以訪問所有的結構成員了。 ? 當 OSTaskCreateHook()被調用的時候,它會收到指向已建立任務的OS_TCB的指針,這樣它就可以訪問所有的結構成員了。該函數允許用戶或使用移植實例的用戶擴展 ?C/OSⅡ 功能。 /* r0 */ *stk = (SUPMODE)。 /* r4 */ *stk = 3。 /* r8 */ *stk = 7。 /* r12 */ *stk = 11。 opt++。 OSTaskCreate()和 OSTaskCreateExt()會獲得該地址并將它保存到任務控制塊( OS_TCB)中。因此堆??雌饋砭拖駝偘l(fā)生過中斷并將所有的寄存器保存到堆棧中的情形一樣。 ? 置 OS_STK_GROWTH為 0表示堆棧從下往上長。 enable ints mov pc,lr 。 return IRQ bit mov pc,lr 。 current CSR mov r1, r0 。 extern void INTS_ON(void)。 typedef double FP64。 typedef signed int INT16S。 60 設置 typedef unsigned char BOOLEAN。 59 設置與處理器和編譯器相關的代碼 ? 。C/OSII中的保留任務 1作為系統任務,負責啟動定時器。 ? OSStart函數直接調用 OSStartHighRdy去執(zhí)行最高優(yōu)先級的任務,OSStart不返回。 ?專門對任務切換中 Thumb的情況作處理。 ? Thumb會給中斷級的任務切換帶來麻煩。 (4) } } OS
點擊復制文檔內容
教學課件相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1