|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在文件 Os_cpu_a.s 中的函数 OSIntCtxSw 中有如下语句: …… 5 t9 @( k m1 h+ F9 `
(1) LDR R4, [R6]
9 F' J3 X4 h/ F# K(2) ADD SP, R4, #68 & q% E, d1 J2 ~ h
;17 寄存器 CPSR,OsEnterSum,R0-R12,LR,SP 5 J3 P; C$ T8 [" c; h# M
(3) LDR LR, [SP, # --8] 1 i( S* d+ H) I* V0 E4 | C
(4) MSR CPSR_c, #(NoInt | SVC32Mode) ;进入管理模式 $ X! E2 p; L( @$ X
(5) MOV SP, R4
$ [# \4 J' u+ _# v! I1 |; Z……
$ i9 b# _/ |8 E1 Z, S. \+ V(6) LDMFD SP!, {R0-R12, LR, PC }^ ;运行新任务 . e& A8 E. |- ~9 m
《ARM 微控制器基础与实战》404 页中解释:只所以要(1)(2)是因为"OSTCBHighRdy
. O6 ]( c8 f1 Y+ i5 j9 W m9 Q—>OSTCBStkPtr 保存的是任务栈位置,而寄存器恢复后堆栈指针并不指向这,所以要调33 # J( \9 h* g" q4 j2 ?1 L
整新任务堆栈指针." 可是将堆栈指针调整到 "新任务入栈的其它数据(见《ARM 微控- s. P* [# V) H2 P9 q. i. |3 d4 E% O
制器基础与实战》图 6.3)"处后,除了取出了 LR 以外并没有做 什么,而当执行了(4) 2 ~! c& `! T- Q6 j, z! ^8 S- m# R
后又重新将堆栈指针指向了栈顶(即第(5)句).我认为可以将(2)省去,直接将(3)改为
' E8 C8 U- M3 \0 i% u8 N% g+ R"LDR LR, [SP, # 60]",而当执行完(6)后,堆栈指针就自动指向了"新任务入栈的其它5 m# B9 P# @' Q' F8 F* S
数据"处.这样修改后我运行了 EX1_arm 例子,正常. $ y: f8 q4 p6 E+ X/ t
请问这利用(3)进行堆栈指针调整的原因是什么 不调整可以吗 谢谢. 9 ?: L1 v. y0 H+ J3 h2 X6 y& h
9 W+ b, J( e; j- \5 C& { |
|