|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在文件 Os_cpu_a.s 中的函数 OSIntCtxSw 中有如下语句: …… ) P7 _# K% T4 c4 _) W$ h! A
(1) LDR R4, [R6]
! E! V3 A( a% B$ K s4 q [3 ?(2) ADD SP, R4, #68 ) F, R1 X% F. M3 Z8 L
;17 寄存器 CPSR,OsEnterSum,R0-R12,LR,SP
( a6 r' \5 l. a9 |& k! ^) O& _$ z7 E' u(3) LDR LR, [SP, # --8]
: I3 H4 W7 \# m5 ^- [4 P+ X; f# e) w9 E(4) MSR CPSR_c, #(NoInt | SVC32Mode) ;进入管理模式 ! P& {6 b" o& Q; `/ Q7 F. b2 B8 x
(5) MOV SP, R4 ! G3 U. J6 p& s; }+ S% h8 X
……
( G$ i' R3 F5 o1 ^(6) LDMFD SP!, {R0-R12, LR, PC }^ ;运行新任务 2 G, ?2 s' ]( M2 M3 O
《ARM 微控制器基础与实战》404 页中解释:只所以要(1)(2)是因为"OSTCBHighRdy
+ G5 B/ s5 E, G, G7 ]1 F—>OSTCBStkPtr 保存的是任务栈位置,而寄存器恢复后堆栈指针并不指向这,所以要调33 $ I3 L, ^& O. A2 ?
整新任务堆栈指针." 可是将堆栈指针调整到 "新任务入栈的其它数据(见《ARM 微控
8 \( J; s, X, Q+ Y6 U制器基础与实战》图 6.3)"处后,除了取出了 LR 以外并没有做 什么,而当执行了(4)
6 Z7 T G. _& V0 g& v2 p后又重新将堆栈指针指向了栈顶(即第(5)句).我认为可以将(2)省去,直接将(3)改为 # R) A$ Z4 N! G
"LDR LR, [SP, # 60]",而当执行完(6)后,堆栈指针就自动指向了"新任务入栈的其它
: ^- {$ Y* f1 G( t数据"处.这样修改后我运行了 EX1_arm 例子,正常. 2 L, p- k4 ~4 \) r; Z# c6 C
请问这利用(3)进行堆栈指针调整的原因是什么 不调整可以吗 谢谢. ) [0 ^: x1 I$ c- m/ C0 S$ a
% y" ^5 X, m2 S
|
|