|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在文件 Os_cpu_a.s 中的函数 OSIntCtxSw 中有如下语句: ……
; {, v# \9 g6 O3 |(1) LDR R4, [R6] / D1 G7 T! q4 ~* j: w
(2) ADD SP, R4, #68 ; ^9 \! g8 S v' @
;17 寄存器 CPSR,OsEnterSum,R0-R12,LR,SP {9 C/ _- U+ x) N8 y
(3) LDR LR, [SP, # --8] 4 e0 k' w5 ]5 c l5 C2 P
(4) MSR CPSR_c, #(NoInt | SVC32Mode) ;进入管理模式 5 a2 |! N2 s w3 | J T
(5) MOV SP, R4
5 M+ U* u3 S i! m! I) \% Z f) d…… 1 K* ^( B& z& w5 `6 B
(6) LDMFD SP!, {R0-R12, LR, PC }^ ;运行新任务
* O F$ Q; O- D& m4 N4 L《ARM 微控制器基础与实战》404 页中解释:只所以要(1)(2)是因为"OSTCBHighRdy $ a" @0 E: `3 ?' ~0 a. {) m
—>OSTCBStkPtr 保存的是任务栈位置,而寄存器恢复后堆栈指针并不指向这,所以要调33 9 }) ^$ V* }, e! n/ ^9 q8 b
整新任务堆栈指针." 可是将堆栈指针调整到 "新任务入栈的其它数据(见《ARM 微控
: j( c7 t* M2 i* b* [ O) c制器基础与实战》图 6.3)"处后,除了取出了 LR 以外并没有做 什么,而当执行了(4) 8 i6 p# z4 v9 B' D! y* j( y0 \
后又重新将堆栈指针指向了栈顶(即第(5)句).我认为可以将(2)省去,直接将(3)改为
# v$ L6 u( }7 v( l& w"LDR LR, [SP, # 60]",而当执行完(6)后,堆栈指针就自动指向了"新任务入栈的其它
$ O$ |% A1 h- p7 _& {! |数据"处.这样修改后我运行了 EX1_arm 例子,正常. ' ?. F, ^" ]$ q& m3 ~4 F2 p! X; t
请问这利用(3)进行堆栈指针调整的原因是什么 不调整可以吗 谢谢. ' o' W1 O5 W, B6 ^+ e7 ~ C
6 E- y8 n. y" ]: E1 R/ t1 j
|
|