|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
大家討論一下ucosII 的函數(shù)OSIntCtxSw |
| 作者:randomkuan 欄目:ARM技術(shù) |
ARM嵌入式系統(tǒng)基礎教材425頁任務切換代碼 OSIntCtxSw ;下面為保存任務環(huán)境 1 LDR R2, [SP, #20] ;獲取PC 2 LDR R12, [SP, #16] ;獲取R12 3 MRS R0, CPSR 4 MSR CPSR_c, #(NoInt | SYS32Mode) 5 MOV R1, LR 6 STMFD SP!, {R1-R2} ;保存LR,PC 7 STMFD SP!, {R4-R12} ;保存R4-R12 8 MSR CPSR_c, R0 9 LDMFD SP!, {R4-R7} ;獲取R0-R3 10 ADD SP, SP, #8 ;出棧R12,PC 11 MSR CPSR_c, #(NoInt | SYS32Mode) 12 STMFD SP!, {R4-R7} ;保存R0-R3 13 LDR R1, =OsEnterSum ;獲取OsEnterSum 14 LDR R2, [R1] 15 STMFD SP!, {R2, R3} ;保存CPSR,OsEnterSum ;保存當前任務堆棧指針到當前任務的TCB 16 LDR R1, =OSTCBCur 17 LDR R1, [R1] 18 STR SP, [R1] 19 BL OSTaskSwHook ;調(diào)用鉤子函數(shù) ;OSPrioCur <= OSPrioHighRdy 20 LDR R4, =OSPrioCur 21 LDR R5, =OSPrioHighRdy 22 LDRB R6, [R5] 23 STRB R6, [R4] ;OSTCBCur <= OSTCBHighRdy 24 LDR R6, =OSTCBHighRdy 25 LDR R6, [R6] 26 LDR R4, =OSTCBCur 27 STR R6, [R4] OSIntCtxSw_1 ;獲取新任務堆棧指針 28 LDR R4, [R6] ADD SP, R4, #68 ;17寄存器CPSR,OsEnterSum,R0-R12,LR,SP LDR LR, [SP, #-8] 29 MSR CPSR_c, #(NoInt | SVC32Mode) ;進入管理模式 MOV SP, R4 ;設置堆棧指針 LDMFD SP!, {R4, R5} ;CPSR,OsEnterSum ;恢復新任務的OsEnterSum LDR R3, =OsEnterSum STR R4, [R3] MSR SPSR_cxsf, R5 ;恢復CPSR LDMFD SP!, {R0-R12, LR, PC }^ ;運行新任務 問1:前三行代碼是不是運行在管理模式下,sp是不是管理模式下的堆棧指針? 2:第10行sp+8后是不是指向R2,它是怎么出棧R12,PC的? 3:第29行為什么要進入管理模式,新任務的環(huán)境不是保存在用戶模式下的任務堆棧嗎?那接下來的MOV SP, R4,R4的值為系統(tǒng)模式下的任務堆棧的指針,而sp為 |
| 2樓: | >>參與討論 |
| 作者: wuming 于 2009/3/4 21:06:47 發(fā)布:
1.處于特權(quán)模式 2.在第4行和第8行兩次輪轉(zhuǎn),得知現(xiàn)在的SP指向最開始的特權(quán)模式下的棧,棧內(nèi)的數(shù)據(jù)是r0-r3,r12,lr_svc(pc) 3.管理模式與用戶模式公用一個堆棧SP |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |