S3C6410裸机调试笔记(2)

liufan   2011-11-3 20:06 楼主
今天早上在去公司的路上,我想了一下,出现昨天现象可能是主板的驱动问题,或者是系统的问题,于是想先把原机的系统重新安装一遍再说。来到公司第一件事就是重装系统,找了一个另外版本的ghost的系统镜像,10分钟后,系统搞定,马上安装IDE,JLINK,其他软件都不装。马上调试,单步走BEQ和BNE,跳转的很好,并且原先不能单步进入函数的问题也解决了,这么看来,可能是原来系统有问题。

接下来,主要就看执行__rt__entry()这个函数有没有问题了,当单步走到_fp_init()这个函数的时候,又出现了“Failed ...”错误提示,看看出问题的汇编指令,是“fmxr ….”,又是一个“f”开头的指令,多半又是浮点运算指令,马上想到ARM1176JZF-S是有矢量浮点型(VFP)协处理器单元的, 应该不会不认识这个指令吧?后在ARM官网查到这段话:

hardware VFP. When using hardware VFP, a VFP coprocessor instruction is used to initialise the floating-point status register. If you build your code for hardware VFP but the VFP coprocessor has not been enabled or is not present, the coprocessor instruction will cause an undefined instruction exception at run-time.

If your target contains a VFP coprocessor you will need ensure that it has been correctly enabled before attempting to initialise the C library. This should normally be done by assembler code in your reset handler before branching to __main().

However if your target does not contain a VFP coprocessor you will need to ensure that all the objects you are linking are built for software floating-point and not for hardware VFP. If any objects are linked in that are built for hardware VFP the linker will upgrade the entire image to hardware VFP. The linker will then include a version of _fp_init() that uses a coprocessor instruction.

To avoid this you need to be careful when specifying the CPU you are building for, for example --cpu ARM1136JF-Simplies hardware VFP whereas --cpu ARM1136J-Simplies software VFP. Also specifying a specific VFP type using --fpu will override the type specified by the CPU, for example --cpu ARM1136JF-S --fpu softvfp will build code for software VFP, however --cpu ARM1136J-S --fpu vfpv2 will build code for hardware VFP.

For more information on VFP please refer to Application Note 133 - 'Using VFP with RVDS'.

第一段话,大概说是假如要使用VFP协处理器指令,必须要初始化浮点状态寄存器,并且用户代码中也要开启VFP协处理器,否则在执行协处理指令的时候就会导致调试失败,出现错误提示。
第二段话,说是如果目标需要VFP功能,那么需要在初始化C库之前就要对VFP协处理单元进行初始化和开启,通常是在复位向量开始的地方,且在__mian()之前用汇编代码完成。
第三段话,有点模糊,希望高手翻译一下啦。
第四段话,为了避免出现这个情况出现,要小心的指定CPU的内核以及VFP,VFP类型的选择优先于CPU内核类型的选择,见下图 ,在最后面

红线是CPU内核选择。
黑线是VFP的类型选择,有如下选项:
1. auto base on cpu
2. vfpv2
3. softvfp
4. softvfp+vfpv2
5. none

例1:CUP = ARM1176JZF-S, VFP=SORFVFP, 按软浮点来编译(浪费了硬VPF)
例2:CPU = ARM1176JF-S,VFP=SOFTVFP, 按软浮点来编译
例3:CPU = ARM1176JZF-S,VFP=VFPV2, 按硬浮点来编译
例4:CPU = ARM1176JF-S,VFP=VFPV2, 按硬浮点来编译(这个配合不该出现,因为本身内核没有硬浮点单元,使用硬浮点的话运行应该会出现错误)

说明一下,我之前的编译选项是例1样子,如果按照上面的说明的话,编译出来的代码应该不会出现浮点指令,因为VFP的选择是softvfp,编译的时候,编译器会用常规指令来完成浮点的运算。但是我发现没有像上面说的,经过单步调试,我发现_fp_init()这个函数中的指令还是存在“fmxr ….”等硬浮点指令,当然,调试还是会失败!!见图1,在最后面

将配置改成了例2的配置(见图0),编译出来后,单步调试OK,_fp_init()这个函数的汇编代码见图2,已经是常规指令了,调试可以通过,并且能跳转到main()函数。这个结果和上面的我的理解刚好是相反的,不知道我对第四段的英文理解是不是对的,希望高手能指出!

经过这段调试经历,我发现当出现调试问题的时候,很大程度上是和编译条件是有一定关系的,所以如果大家出现相关的问题,不妨多朝这个方向分析分析。
至此,纠结了很长时间的一些问题,今天终于算是都按照自己的理解和和实践真相大白了,当然有些东西还需要深入的理解和实践,可能我的理解会存在一些偏差和误区,所以,希望大家能多多指点!

[ 本帖最后由 liufan 于 2011-11-3 20:52 编辑 ]
  • 未命名.JPG
  • 未命名2.JPG
  • 未命名3.JPG

回复评论 (1)

:rose: 撒花
点赞  2011-11-3 20:46
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复