|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在文件 Os_cpu_a.s 中的函数 OSIntCtxSw 中有如下语句: …… ) D2 I1 t5 { f2 p
(1) LDR R4, [R6]
7 E4 h5 f( j. H" J( H; k4 _(2) ADD SP, R4, #68
5 l* }/ O5 G6 F5 w4 z [2 |;17 寄存器 CPSR,OsEnterSum,R0-R12,LR,SP
2 O! O1 V* W0 v, T- H, M' R(3) LDR LR, [SP, # --8] * v$ K5 D0 I4 {3 A
(4) MSR CPSR_c, #(NoInt | SVC32Mode) ;进入管理模式
. {/ W" f* }/ r6 t) M(5) MOV SP, R4 ' ?3 ~ M8 N: E: |! Q0 a7 X2 i
…… : R2 _& r6 }+ m4 p
(6) LDMFD SP!, {R0-R12, LR, PC }^ ;运行新任务
I0 l9 G& g: S9 P; w& [《ARM 微控制器基础与实战》404 页中解释:只所以要(1)(2)是因为"OSTCBHighRdy
: u+ _3 c k7 @. d1 |# w( s9 V—>OSTCBStkPtr 保存的是任务栈位置,而寄存器恢复后堆栈指针并不指向这,所以要调33
' h o6 E2 G3 X* b3 v整新任务堆栈指针." 可是将堆栈指针调整到 "新任务入栈的其它数据(见《ARM 微控/ w2 r0 r- b- h( r. X
制器基础与实战》图 6.3)"处后,除了取出了 LR 以外并没有做 什么,而当执行了(4)
6 R. o+ [" C; P& b7 H2 F& W后又重新将堆栈指针指向了栈顶(即第(5)句).我认为可以将(2)省去,直接将(3)改为
+ X/ f2 O2 E) v4 K7 U! @"LDR LR, [SP, # 60]",而当执行完(6)后,堆栈指针就自动指向了"新任务入栈的其它
- `7 |- ^7 P" B数据"处.这样修改后我运行了 EX1_arm 例子,正常.
. s; W" \8 s3 ]5 @0 E- P- d请问这利用(3)进行堆栈指针调整的原因是什么 不调整可以吗 谢谢.
, _! J# W' Z( @
5 y- w4 V4 J2 r* m2 k- @ |
|