免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2988 | 回复: 0
打印 上一主题 下一主题

S3C6410移植日记之五 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-20 17:17 |只看该作者 |倒序浏览
之四讲到,简易SDbootloader完成了,也就解决了如何把程序下载到norflash中的问题,现在的首要问题是,程序下载到norflash之后,能不能顺利从norflash中启动。
重要提示:移植的第一步应该是验证编译系统是否正常工作,从参考工程中创建新的工程后,在尽可能少修改的情况下,先编译一下,看是否正常工作。在移植6410时,就在这里吃了大亏,6410工程copy子TQ2440,因为他们用的都是arm指令集,如果我只修改cpu名字,工程中其他东西都不修改的情况下,先编译一下的话,会少走很多弯路。

当然是按部就班地把设计SDbootloader时准备好的初始化文件加到工程中,然后是编译,编译时正常产生了.o,但连接时却出现了大量错误信息,几乎每个.o文件都有,报这个错误的.o文件中,有些是工程中的,有些是库里面的。
timer.o uses VFP instructions, whereas run_inram.elf does not
不明白为什么会出现这个错误,因为timer.o中只有一些寄存器初始化动作,唯一需要计算的__djy_set_delay函数也被注释掉了,是不可能需要浮点指令的,后半句更荒唐,因为run_inram.elf文件是连接后才生成的,报这个错误时run_inram.elf文件并不存在。花了很多时间去google,也没有找到解决办法。
整个工程从TQ2440拷贝过来后,所做的修改其实非常有限,如下:
1、  修改了initcpu.s及其附属文件。
2、  修改了uart.c和uart.h文件。
3、  修改了*.ld文件中的存储器配置。
4、  修改了timer.c和timer.h文件。
其他部分都没有修改,即使int.s和int.c这两个必须修改的文件都还没有修改,被修改的文件显然不可能涉及到浮点运算的。为什么好好的就不行了呢,碰到这种莫名其妙的问题,是非常懊恼的,但这就是嵌入式开发,经常会碰到一些不可能的问题,要解决问题,你就需要硬着头皮去解决它。
idea6410工程是从tq2440工程copy过来的,编译前只做了极少的改动,为什么就不行了呢?我们就从所做的改动开始,一点点恢复原貌吧,可直到完全恢复,问题依旧。
这下傻眼了,怎么办呢?google可以找到这条出错信息,试过搜索到的解决方案,均无效,这些方案基本上都是针对x86的PC机的。源程序一致了,那还有哪里不一致呢?最后想到了-mcpu选项,把该选项从arm1176jzf-s改回arm920t,再编译,OK,能通过。然后再把工程恢复为idea6410工程,仅cpu选项保持arm920t,一切正常。最后证明,
1、  编译和连接时cpu选择arm1176jzf-s,连接就不能通过。
2、  编译和连接时cpu选择arm920t,连接就顺利通过。
3、  编译时用arm920t,连接时选arm1176jzf-s,可以顺利通过。
根据以上结果,我猜测问题的原因是:编译时cpu选了带浮点单元的arm1176jzf-s,不管.o文件中是否用到了浮点数,编译器都会在.o文件中告诉连接器,该.o文件可能要使用硬件浮点,而连接器却企图连接软件浮点库,于是两者产生冲突。由于冲突是在生成run_inram.elf的过程中发生的,尽管当时run_inram.elf文件还不存在,亦报这个错误:
timer.o uses VFP instructions, whereas run_inram.elf does not
既然有了怀疑方向,那就查看gcc的手册吧,遗憾的是,没有找到解决方案。由于找不到解决办法,就先把问题搁置一下,先委屈6410,暂且当高速arm9用吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP