|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在文件 Os_cpu_a.s 中的函数 OSIntCtxSw 中有如下语句: …… ; E8 b5 j( m. S
(1) LDR R4, [R6] 0 E! \- C) Q8 p, @9 Y# l$ Q
(2) ADD SP, R4, #68
5 M# d& U Z4 ];17 寄存器 CPSR,OsEnterSum,R0-R12,LR,SP
a% I1 ]* Q+ O& G' n. f4 x(3) LDR LR, [SP, # --8]
% R O7 E7 r2 Q+ c3 N" p1 E& u% {(4) MSR CPSR_c, #(NoInt | SVC32Mode) ;进入管理模式 / ~# E) W+ ], i) r) A
(5) MOV SP, R4 + m" w* s0 O; T" w2 R
……
$ c/ I m: w3 j$ F: e8 ^(6) LDMFD SP!, {R0-R12, LR, PC }^ ;运行新任务
- J& G+ C i1 a; `1 w) u6 ?2 S《ARM 微控制器基础与实战》404 页中解释:只所以要(1)(2)是因为"OSTCBHighRdy
, I4 |2 v4 s1 W, B4 j* K( {—>OSTCBStkPtr 保存的是任务栈位置,而寄存器恢复后堆栈指针并不指向这,所以要调33 , f" R0 q8 F2 @5 g1 U- r6 Q
整新任务堆栈指针." 可是将堆栈指针调整到 "新任务入栈的其它数据(见《ARM 微控
) e& K0 i+ I8 q- }2 k/ d# n制器基础与实战》图 6.3)"处后,除了取出了 LR 以外并没有做 什么,而当执行了(4)
1 E9 Y$ a( \1 H" a8 R后又重新将堆栈指针指向了栈顶(即第(5)句).我认为可以将(2)省去,直接将(3)改为
4 _2 `, V/ v- F$ Q/ I/ i1 v3 C& G5 G5 F"LDR LR, [SP, # 60]",而当执行完(6)后,堆栈指针就自动指向了"新任务入栈的其它8 w8 o2 M% [. P# w4 s! g2 Y
数据"处.这样修改后我运行了 EX1_arm 例子,正常. / i/ {0 H5 K6 D2 u2 x. b7 t
请问这利用(3)进行堆栈指针调整的原因是什么 不调整可以吗 谢谢.
- m; [ @* S- n% y5 C* Z
) o6 z5 l7 D# S1 ?3 \4 Q, r |
|