ucos在lpc3180上的移植(浮点部分)

[复制链接]
3718|0
 楼主| JINBOS 发表于 2007-1-18 15:24 | 显示全部楼层 |阅读模式
最近在ucos官网上下了ucos在lpc3180上的移植,但我发现上面的没有做VFP浮点部分的移植,因此参考了ARM公司关于VFP9上的相关资料,把这部分加了进去,<br />以下为浮点寄存器保存和恢复部分的汇编,VFP9中的另外四个控制寄存器因为禁止VFP中断,因此不用处理.仅保存一个FPSCR<br />OSFPRestore;(通过R0传参,具体可看uc/osII的书)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STMFD&nbsp;&nbsp;&nbsp;SP!,&nbsp;{R0-R1}&nbsp;;保存R0,R1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;R1,[R0]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FMXR&nbsp;FPSCR,R1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;恢复FPSCR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FLDMDBX&nbsp;R0!,{D0-D15}&nbsp;;恢复D0-D15<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDMFD&nbsp;&nbsp;&nbsp;SP!,&nbsp;{R0-R1}&nbsp;;恢复R0,R1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;PC,LR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />OSFPSave(通过R0传参,具体可看uc/osII的书)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STMFD&nbsp;&nbsp;&nbsp;SP!,&nbsp;{R0-R1}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FMRX&nbsp;R1,FPSCR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STR&nbsp;&nbsp;R1,[R0]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FSTMDBX&nbsp;R0!,{D0-D15}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDMFD&nbsp;&nbsp;&nbsp;SP!,&nbsp;{R0-R1}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;PC,LR&nbsp;&nbsp;<br />测试的时候,开多个任务,每个任务都在做Tem=sin(0)运算,最低优先级的任务如下<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tem=sin(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(Tem!=0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LED_On();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;也就是说运算错识的话将会把led点亮,首先去掉OSFPRestore和OSFPSave代码,全速运行,一些时间后LED亮了,说明运算错误了,然后把OSFPRestore和OSFPSave代码加入,全速运行,LED一直都没亮.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我觉得这应该说明是成功了.但还不敢肯定,希望高人们指点一下,或交流一下.<br />QQ:2750660
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

45

帖子

0

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