|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
關(guān)于OSIntCtxSw()的問(wèn)題? |
| 作者:cloudlily 欄目:ARM技術(shù) |
在includes.h 中有關(guān)于 #define OSIntCtxSw() return 的宏定義 這是否就是說(shuō)中斷返回時(shí)不進(jìn)行任何的任務(wù)切換了???那不是成了不可剝離內(nèi)核了 另外在os_cpu_a.s中有關(guān)于OSIntCtxSw的函數(shù),我的理解是此處的OSIntCtxSw與上面includes.h 中的不是同一函數(shù),不知理解對(duì)不對(duì)。 在os_cpu_a.s中對(duì)OSIntCtxSw的調(diào)用是在SWI軟件中斷中處理的,如下1處: ;軟件中斷 SoftwareInterrupt LDR SP, StackSvc ; 重新設(shè)置堆棧指針 STMFD SP!, {R0-R3, R12, LR} ;些處是放入管理堆棧中 MOV R1, SP ; R1指向參數(shù)存儲(chǔ)位置 MRS R3, SPSR ;中斷前任務(wù)的CPSR已保存至SPSR中 TST R3, #T_bit ; 中斷前是否是Thumb狀態(tài) LDRNEH R0, [LR,#-2] ; 是: 取得Thumb狀態(tài)SWI號(hào) BICNE R0, R0, #0xff00 LDREQ R0, [LR,#-4] ; 否: 取得arm狀態(tài)SWI號(hào) BICEQ R0, R0, #0xFF000000 ; r0 = SWI號(hào),R1指向參數(shù)存儲(chǔ)位置 CMP R0, #1 ;R0=0,任務(wù)級(jí)任務(wù)切換函數(shù) LDRLO PC, =OSIntCtxSw ;1處 LDREQ PC, =__OSStartHighRdy ; SWI 0x01為第一次任務(wù)切換 BL SWI_Exception ;SWI_Exception的參數(shù)是通過(guò)R0傳送的 LDMFD SP!, {R0-R3, R12, PC}^ ;返回 StackSvc DCD (SvcStackSpace + SVC_STACK_LEGTH * 4 - 4) __swi(0x00) void OS_TASK_SW(void); /* 任務(wù)級(jí)任務(wù)切換函數(shù) */ __swi(0x01) void _OSStartHighRdy(void); /* 運(yùn)行優(yōu)先級(jí)最高的任務(wù) */ __swi(0x02) void OS_ENTER_CRITICAL(void); /* 關(guān)中斷 */ __swi(0x03) void OS_EXIT_CRITICAL(void); /* 開(kāi)中斷 */ __swi(0x40) void *GetOSFunctionAddr(int Index); /* 獲取系統(tǒng)服務(wù)函數(shù)入口 */ __swi(0x41) void *GetUsrFunctionAddr(int Index);/* 獲取自定義服務(wù)函數(shù)入口 */ __swi(0x42) void OSISRBegin(void); /* 中斷開(kāi)始處理 */ __swi(0x43) int OSISRNeedSwap(void); /* 判斷中斷是否需要切換 */ __swi(0x80) void ChangeToSYSMode(void); /* 任務(wù)切換到系統(tǒng)模式 */ __swi(0x81) void ChangeToUSRMode(void); /* 任務(wù)切換到用戶模式 */ __swi(0x82) void TaskIsARM(INT8U prio); /* 任務(wù)代碼是ARM代碼 */ __swi(0x83) void TaskIsTHUMB(INT8U prio); /* 任務(wù)代碼是THUMB */ 那就是說(shuō)此處的OSIntCtxSw實(shí)際上就是任務(wù)切換函數(shù)。 如果以上理解正確,那么SP是在管理模式中的SP,以下代碼的前三行的SP又是如何得到當(dāng)前任務(wù)的PC和R12的: OSIntCtxSw ;下面為保存任務(wù)環(huán)境 1、 LDR R2, [SP, #20] ;獲取PC,實(shí)際上是LR的值 2、 LDR R12, [SP, #16] ;獲取R12 MRS R0, CPSR MSR CPSR_c, #(NoInt | SYS32Mode) MOV R1, LR STMFD SP!, {R1-R2} ;保存LR,PC STMFD SP!, {R4-R12} ;保存R4-R12 MSR CPSR_c, R0 LDMFD SP!, {R4-R7} ;獲取R0-R3 ADD SP, SP, #8 &nb |
| 2樓: | >>參與討論 |
| 作者: hunteren 于 2006/9/19 15:46:00 發(fā)布:
關(guān)于OSIntCtxSw()的問(wèn)題 你查看中斷處理宏定義,就會(huì)知道了. |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |