|
在 王田苗 主编的《嵌入式系统设计与实例开发》中,关于UCOS移植到44b0的OSInitCtxSw()代码
;程序里的注释是书本里的,括号里的问题是我的疑问
OSIntCtxSw
ADD R7, SP, #16 ;保存寄存器指针---(这时R7=SP+16不是已经指向了PC的地址吗?)
LDR SP, =IRQStack ;FIQ_STACK (sp重新回到栈底,用于下一次的中断保存入栈,
到这里已经不用IRQ堆指针了,传递参数的工作交给了R7)
MRS R1, SPSR ;得到暂停的SPSR
ORR R1, R1, #OxC0 ;关闭IRQ, FIQ
MSR CPSR_cxsf, R1 ;转换模式( SVC_MODE )
LDR R0, [R7, #52] ;从IRQ堆栈中得到IRQ's LR (任务 PC)---(为什么这里还要加上52?)
SUB R0, R0, #4 ;当前PC地址是(saved_LR-4 )
STMFD SP!, {R0} ;保存任务PC
STMFD SP!, {LR} ;保存LR
MOV LR, R7 ;保存FIQ堆栈ptr in LR
LDMFD LR!, {R0-R12} ;从FIQ堆栈中得到保存的寄存器
STMFD SP!, {R0-R12} ;在任务堆栈中保存寄存器
MRS R4, CPSR
BIC SP!, {R0-R12}
……
……
接下来是执行新的任务
……
……
————————————————————————————————————————————————
这里的程序,应该是把IRQ堆栈中保存的任务寄存器值取出来,再保存到任务堆栈中,然后执行新的任务。
中断发生后,依次保存的: PC(R15)、R14_IRQ、R13_IRQ、R12、R11……R0( SPSR与CPSR不是很清楚), 这时SP->R0。当执行第一句
ADD R7, SP, #16
后,由于44b0堆栈是从上往下长的, 所以R7应该指向了PC,但下面
LDR R0, [R7, #52] ;从IRQ堆栈中得到IRQ's LR (任务 PC)---(为什么这里还要加上52?)
为什么还要加上52???
是我理解错了,还是书本问题!!! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|