|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在文件 Os_cpu_a.s 中的函数 OSIntCtxSw 中有如下语句: ……
! t; O4 {2 j6 s0 @(1) LDR R4, [R6]
: M0 I! A/ t* s( F! n% H: N9 a(2) ADD SP, R4, #68
1 m8 L$ z1 w7 e, V;17 寄存器 CPSR,OsEnterSum,R0-R12,LR,SP : i" @; d; E& B! r
(3) LDR LR, [SP, # --8]
; l. ~$ A# b' g: Y% j* U(4) MSR CPSR_c, #(NoInt | SVC32Mode) ;进入管理模式 . Z: A' I3 ^* C( l6 ~1 M
(5) MOV SP, R4 4 J- q0 ?3 o5 i: w2 J( B
……
. `2 ^' X0 B& t" h(6) LDMFD SP!, {R0-R12, LR, PC }^ ;运行新任务
/ u1 C* b q; E8 g, \《ARM 微控制器基础与实战》404 页中解释:只所以要(1)(2)是因为"OSTCBHighRdy
& V/ Z5 c: ^5 d M( u p& l& C5 o—>OSTCBStkPtr 保存的是任务栈位置,而寄存器恢复后堆栈指针并不指向这,所以要调33
8 ~4 k9 Y7 p( Y7 Y整新任务堆栈指针." 可是将堆栈指针调整到 "新任务入栈的其它数据(见《ARM 微控$ G2 C( S7 z2 w% z# z
制器基础与实战》图 6.3)"处后,除了取出了 LR 以外并没有做 什么,而当执行了(4) % `% {6 S5 D* [# [. P
后又重新将堆栈指针指向了栈顶(即第(5)句).我认为可以将(2)省去,直接将(3)改为 , S/ P5 w# ?2 P# h, p, J
"LDR LR, [SP, # 60]",而当执行完(6)后,堆栈指针就自动指向了"新任务入栈的其它4 P; q! p4 @7 X w! j- d
数据"处.这样修改后我运行了 EX1_arm 例子,正常.
* o# n; b! u: D, K! n! M6 e' X; m请问这利用(3)进行堆栈指针调整的原因是什么 不调整可以吗 谢谢. / B9 I& {% e# C; y5 U! T! B
' S3 p; O( [' Y4 a
|
|