[ZLG-ARM] 请教周公

[复制链接]
1743|6
 楼主| machunshui 发表于 2008-1-24 08:59 | 显示全部楼层 |阅读模式
os, ps, RS, se, DSP
zlg对arm的usos,基本上看清楚了,但有一处不解:<br /><br />OSIntCtxSw_1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;获取新任务堆栈指针<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R4,&nbsp;[R6]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SP,&nbsp;R4,&nbsp;#68&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;17寄存器CPSR,OsEnterSum,R0-R12,LR,SP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LR,&nbsp;[SP,&nbsp;#-8]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSR_c,&nbsp;#(NoInt&nbsp;|&nbsp;SVC32Mode)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;进入管理模式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SP,&nbsp;R4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;设置堆栈指针<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDMFD&nbsp;&nbsp;&nbsp;SP!,&nbsp;{R4,&nbsp;R5}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;CPSR,OsEnterSum<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;恢复新任务的OsEnterSum<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R3,&nbsp;=OsEnterSum<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R4,&nbsp;[R3]<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPSR_cxsf,&nbsp;R5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;恢复CPSR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDMFD&nbsp;&nbsp;&nbsp;SP!,&nbsp;{R0-R12,&nbsp;LR,&nbsp;PC&nbsp;}^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;运行新任务<br /><br /><br />其中:<br />最后一行&nbsp;&nbsp;<br />&nbsp;LDMFD&nbsp;&nbsp;&nbsp;SP!,&nbsp;{R0-R12,&nbsp;LR,&nbsp;PC&nbsp;}^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;运行新任务<br />已经可以把LR出栈到用户模式的LR,<br /><br />但为何前面要做:<br />&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R4,&nbsp;[R6]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SP,&nbsp;R4,&nbsp;#68&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;17寄存器CPSR,OsEnterSum,R0-R12,LR,SP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LR,&nbsp;[SP,&nbsp;#-8]<br /><br />这不也是把LR恢复到系统模式(即用户模式)的LR中吗?<br /><br />
 楼主| machunshui 发表于 2008-1-24 09:24 | 显示全部楼层

我的理解肯定不对

我的理解肯定不对,但又不知此处何解?<br />
zlgarm 发表于 2008-1-24 10:14 | 显示全部楼层

回复

&nbsp;&nbsp;&quot;LDR&nbsp;&nbsp;LR,&nbsp;[SP,&nbsp;#-8]&quot;&nbsp;是取得新任务的返回地址,“LDMFD&nbsp;&nbsp;&nbsp;SP!,&nbsp;{R0-R12,&nbsp;LR,&nbsp;PC&nbsp;}^”是恢复新任务的寄存器和返回地址。NXP&nbsp;ARM7方面的东西,请到ZLG-ARM发表。<br /><br /><br />(zlgarm_zsg)&nbsp;&nbsp;
bqt 发表于 2008-1-24 11:31 | 显示全部楼层

re:

LDMFD&nbsp;&nbsp;&nbsp;SP!,&nbsp;{R0-R12,&nbsp;LR,&nbsp;PC&nbsp;}^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;运行新任务<br />这一句中的&nbsp;^&nbsp;表示将spsr同时也拷贝到cpsr,并不是恢复用户模式的LR。<br />这一句把堆栈中的LR恢复到了管理模式下的LR中,所以要在之前先把堆栈中的LR恢复到系统模式的LR中。
 楼主| machunshui 发表于 2008-1-24 11:51 | 显示全部楼层

thank you!!!!!

谢谢!!!
 楼主| machunshui 发表于 2008-1-24 11:52 | 显示全部楼层

忽视了^,再次谢谢bqt

忽视了^,再次谢谢bqt
 楼主| machunshui 发表于 2008-2-1 08:33 | 显示全部楼层

犯了低级错误

LDMFD&nbsp;&nbsp;&nbsp;SP!,&nbsp;{R0-R12,&nbsp;LR,&nbsp;PC&nbsp;}^&nbsp;&nbsp;<br />是把堆栈里的数据出栈到寄存器,然后再恢复cpsr,但此时是管理模式,LR是管理模式的LR,所以当然要先用别的手段恢复用户模式的LR了。<br /><br />正是由于要恢复CPSR,所以要用带^&nbsp;的出栈指令,但由于这条指令不能在系统模式用户模式下运用,所以就有了这样分两步走的方法.<br /><br />再次谢谢bqt
您需要登录后才可以回帖 登录 | 注册

本版积分规则

153

主题

3224

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部
0