ARM技术论坛
直播中

河神大人

8年用户 1518经验值
擅长:电源/新能源
私信 关注
[问答]

文件Os_cpu_a.s中堆栈指针调整的原因是什么?

在文件 Os_cpu_a.s 中的函数 OSIntCtxSw 中有如下语句: ……
(1) LDR R4, [R6]
(2) ADD SP, R4, #68
;17 寄存器 CPSR,OsEnterSum,R0-R12,LR,SP
(3) LDR LR, [SP, # --8]
(4) MSR CPSR_c, #(NoInt | SVC32Mode) ;进入管理模式
(5) MOV SP, R4 & z5 w0 F$ F; D/ K
……
(6) LDMFD SP!, {R0-R12, LR, PC }^ ;运行新任务
《ARM微控制器基础与实战》404 页中解释:只所以要(1)(2)是因为"OSTCBHighRdy
—>OSTCBStkPtr 保存的是任务栈位置,而寄存器恢复后堆栈指针并不指向这,所以要调33
整新任务堆栈指针." 可是将堆栈指针调整到 "新任务入栈的其它数据(见《ARM 微控
制器基础与实战》图 6.3)"处后,除了取出了 LR 以外并没有做 什么,而当执行了(4)
后又重新将堆栈指针指向了栈顶(即第(5)句).我认为可以将(2)省去,直接将(3)改为
"LDR LR, [SP, # 60]",而当执行完(6)后,堆栈指针就自动指向了"新任务入栈的其它
数据"处.这样修改后我运行了 EX1_arm 例子,正常.
请问这利用(3)进行堆栈指针调整的原因是什么 不调整可以吗 谢谢.

回帖(3)

梅利号

2023-2-28 14:03:58
注意不同模式有不同的 SP 指针.您这样做会造成内存泄漏,长时间运行会耗尽堆栈而使程序崩溃.
举报

juju宇哥

2023-2-28 14:04:06
操作系统是替我们做脏活累活的,替我们管理内存和CPU。我们所要编写的移植代码,和CPU的管理相关的。具体的调度算法由系统来完成,而我们的任务是把系统和CPU耦合起来。
举报

江左盟

2023-2-28 14:04:16
CPU的管理相关就是将CPU的状态保存到内存中或者将内存中的CPU状态恢复到CPU中。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分