|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在文件 Os_cpu_a.s 中的函数 OSIntCtxSw 中有如下语句: …… ) q2 B; y8 o+ P# R4 Q0 K: J
(1) LDR R4, [R6] , `- q6 A+ t0 U' z! P) v4 M
(2) ADD SP, R4, #68 1 r8 \: D/ r* o; @4 _
;17 寄存器 CPSR,OsEnterSum,R0-R12,LR,SP & z& W! F" H" H
(3) LDR LR, [SP, # --8] " a: T- R! m' f* ^
(4) MSR CPSR_c, #(NoInt | SVC32Mode) ;进入管理模式 * j3 [3 n/ Z1 q" U
(5) MOV SP, R4 - n; t9 ~5 k2 }6 `
…… / O3 Z6 `, }/ f: p
(6) LDMFD SP!, {R0-R12, LR, PC }^ ;运行新任务 - Q i' k' o- u1 d
《ARM 微控制器基础与实战》404 页中解释:只所以要(1)(2)是因为"OSTCBHighRdy
1 h0 J" q7 y3 z5 {5 m; M3 E—>OSTCBStkPtr 保存的是任务栈位置,而寄存器恢复后堆栈指针并不指向这,所以要调33 " q) [5 O4 l7 b& @. a* L
整新任务堆栈指针." 可是将堆栈指针调整到 "新任务入栈的其它数据(见《ARM 微控
& t. t/ o4 a/ L1 R$ u制器基础与实战》图 6.3)"处后,除了取出了 LR 以外并没有做 什么,而当执行了(4)
1 r9 \; E" I5 v: B- L后又重新将堆栈指针指向了栈顶(即第(5)句).我认为可以将(2)省去,直接将(3)改为 5 A7 y* o7 z4 ]; W/ Y( K9 p
"LDR LR, [SP, # 60]",而当执行完(6)后,堆栈指针就自动指向了"新任务入栈的其它( a3 G; u% v4 Y
数据"处.这样修改后我运行了 EX1_arm 例子,正常.
5 E( Q' b U+ T7 D请问这利用(3)进行堆栈指针调整的原因是什么 不调整可以吗 谢谢.
# i/ T$ T4 P7 H* \# F7 ^/ N
* ?, i3 B- \5 x |
|