UCOS中断级任务切换的小疑问
在 王田苗 主编的《嵌入式系统设计与实例开发》中,关于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, ;从IRQ堆栈中得到IRQ's LR (任务 PC)---(为什么这里还要加上52?)
SUB R0, R0, #4 ;当前PC地址是(saved_LR-4 )
STMFDSP!, {R0} ;保存任务PC
STMFDSP!, {LR} ;保存LR
MOV LR, R7 ;保存FIQ堆栈ptr in LR
LDMFDLR!, {R0-R12} ;从FIQ堆栈中得到保存的寄存器
STMFDSP!, {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, ;从IRQ堆栈中得到IRQ's LR (任务 PC)---(为什么这里还要加上52?)
为什么还要加上52???
是我理解错了,还是书本问题!!! 52 / 4 好像是13,寄存器帧的偏移,从那里开始装入下个任务的工作寄存器,忘得差不多了 mark
页:
[1]