搜档网
当前位置:搜档网 › S3C6410移植日志之五

S3C6410移植日志之五

S3C6410移植日志之五

S3C6410移植日志之五

看本文件请参考《都江堰操作系统与嵌入式系统设计》中地15章。

之四讲到,简易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用吧。

相关主题