|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在文件 Os_cpu_a.s 中的函数 OSIntCtxSw 中有如下语句: ……
$ h C) S$ c2 n" z& G(1) LDR R4, [R6]
) u: Z7 Z' [* e. O" n3 Y9 e& W* |(2) ADD SP, R4, #68 8 c1 V( B9 O+ r7 B4 N
;17 寄存器 CPSR,OsEnterSum,R0-R12,LR,SP
3 V# Q3 T6 | C" s(3) LDR LR, [SP, # --8]
9 ]5 f0 z3 g& l' z5 U" ^(4) MSR CPSR_c, #(NoInt | SVC32Mode) ;进入管理模式 H0 l9 r! `9 z/ m: `9 @3 @7 W
(5) MOV SP, R4 ' ^$ s% L* C1 S R, H. }! f' I
…… & s2 g& T1 N4 A7 {" i$ b- y% b
(6) LDMFD SP!, {R0-R12, LR, PC }^ ;运行新任务
) {3 x% I6 A! p$ R5 z) e, ~《ARM 微控制器基础与实战》404 页中解释:只所以要(1)(2)是因为"OSTCBHighRdy
! n% p- t& N2 y—>OSTCBStkPtr 保存的是任务栈位置,而寄存器恢复后堆栈指针并不指向这,所以要调33
7 j( P8 e8 k* P! N+ ^整新任务堆栈指针." 可是将堆栈指针调整到 "新任务入栈的其它数据(见《ARM 微控
6 b. c/ l# j8 |4 S3 V制器基础与实战》图 6.3)"处后,除了取出了 LR 以外并没有做 什么,而当执行了(4)
3 m, e/ ?' b @4 Q后又重新将堆栈指针指向了栈顶(即第(5)句).我认为可以将(2)省去,直接将(3)改为 ( O$ f& _ |( Q1 r
"LDR LR, [SP, # 60]",而当执行完(6)后,堆栈指针就自动指向了"新任务入栈的其它
0 z n2 p5 U: `数据"处.这样修改后我运行了 EX1_arm 例子,正常. 0 x3 C$ s3 ?9 u0 o; N
请问这利用(3)进行堆栈指针调整的原因是什么 不调整可以吗 谢谢. & l8 X6 K% a! G, g$ R% K# D$ a3 W
* O) E! L. r2 z- H* _9 m B
|
|