|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在文件 Os_cpu_a.s 中的函数 OSIntCtxSw 中有如下语句: ……
5 e0 T+ f& {, T6 R% o% r3 T+ w(1) LDR R4, [R6] 5 a' ^' O7 x9 f8 z; {! W, l
(2) ADD SP, R4, #68 / z$ Q& `2 x5 a/ N# g
;17 寄存器 CPSR,OsEnterSum,R0-R12,LR,SP
$ a( @/ }2 u; `5 I; f$ E, d( ?/ k(3) LDR LR, [SP, # --8] $ Z* E" I1 h6 v8 s
(4) MSR CPSR_c, #(NoInt | SVC32Mode) ;进入管理模式
* c" H+ H5 [5 C. @: h(5) MOV SP, R4
# u: }4 |2 W& _3 Y……
9 X# Z) F/ l7 C n$ w(6) LDMFD SP!, {R0-R12, LR, PC }^ ;运行新任务 / ]( o7 x; s$ C9 J' {- f$ \0 P& D
《ARM 微控制器基础与实战》404 页中解释:只所以要(1)(2)是因为"OSTCBHighRdy ( X1 U- M1 F) E( {$ v
—>OSTCBStkPtr 保存的是任务栈位置,而寄存器恢复后堆栈指针并不指向这,所以要调33 5 I5 ]- D/ W5 W5 a1 E2 |
整新任务堆栈指针." 可是将堆栈指针调整到 "新任务入栈的其它数据(见《ARM 微控+ ~, r# F6 a8 f/ L$ u! U
制器基础与实战》图 6.3)"处后,除了取出了 LR 以外并没有做 什么,而当执行了(4) 9 q" f* W3 O, t4 D) k$ h' K" x
后又重新将堆栈指针指向了栈顶(即第(5)句).我认为可以将(2)省去,直接将(3)改为
' u, @) k* \. Y1 q" k3 ^" u+ `1 X"LDR LR, [SP, # 60]",而当执行完(6)后,堆栈指针就自动指向了"新任务入栈的其它
( ]+ O+ a0 J- W0 w& B3 G数据"处.这样修改后我运行了 EX1_arm 例子,正常. + L3 d7 N6 \2 P& l
请问这利用(3)进行堆栈指针调整的原因是什么 不调整可以吗 谢谢. 5 l* N' k4 r3 O! ]7 r) W
+ x6 O5 Q- m, U) n
|
|