蜗窝科技

U-boot中无法开启Cortex-A9的NEON功能

蜗窝讨论区存档 · Linux kernel技术问答 · 楼主 活出自我 · 2016-08-18 · 3 帖

本文是原「蜗窝讨论区」的历史存档(2016-08-18),来自版块「Linux kernel技术问答」,共 3 帖。讨论区已停止服务,此处仅供查阅。

活出自我 · 2016-08-18 20:56

SOC平台:ARMV7-a架构,cortex-A9,含有NEON功能,且在ARM编译器下测试通过 编译器:gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux.tar 编译参数:PLATFORM_CPPFLAGS += -mcpu=cortex-a9 -mfpu=neon 问题:在移植uboot时,无法使用float等浮点运算。

代码:


[== C++ ==]
float num1 = 3.14;
    float num2 = 0.0;
    float num3 = 0.0;
   num2 = num1 * 2.0;

    num3 = num1 + num1;

printf("\n");
printf("INFO:test neon float:\n");
printf("INFO:num1=%f\n", num1);
printf("INFO:multi func:num1 * 2.0 = %f\n", num2);
printf("INFO:plusfunc:num1+num1=%f\n", num3);

反汇编:


[== C++ ==]
 num2 = num1 * 2.0;
       num3 = num1 + num1;
printf("\n");
    ad0:    e59f0148    ldr r0,     ; c20 <board_init_f+0x194>
    ad4:    eb001da6    bl  8174 <printf>
printf("INFO:test neon float:\n");
   ad8: e59f0144    ldr r0,     ; c24 <board_init_f+0x198>
   adc: eb001da4    bl  8174 <printf>
   printf("INFO:num1=%f\n", num1);
   ae0: e3a02206    mov r2, #1610612736 ; 0x60000000
   ae4: e59f313c    ldr r3,     ; c28 <board_init_f+0x19c>
 ae8:   e59f013c    ldr r0,     ; c2c <board_init_f+0x1a0>
 aec:   eb001da0    bl  8174 <printf>
printf("INFO:multi func:num1 * 2.0 = %f\n", num2);
 af0:   e3a02206    mov r2, #1610612736 ; 0x60000000
 af4:   e59f3134    ldr r3,     ; c30 <board_init_f+0x1a4>
 af8:   e59f0134    ldr r0,     ; c34 <board_init_f+0x1a8>
 afc:   eb001d9c    bl  8174 <printf>
printf("INFO:plusfunc:num1+num1=%f\n", num3);
 b00:   e59f3128    ldr r3,     ; c30 <board_init_f+0x1a4>
 b04:   e3a02206    mov r2, #1610612736 ; 0x60000000
 b08:   e59f0128    ldr r0,     ; c38 <board_init_f+0x1ac>
 b0c:   eb001d98    bl  8174 <printf>

实际打印效果:


[== C++ ==]
INFO:test neon float:
INFO:num1=%f
INFO:multi func:num1 * 2.0 = %f
INFO:plusfunc:num1+num1=%f

wowo · 2016-08-19 09:44

你这应该是printf的问题,去uboot中检查一下printf的实现(vsnprintf_internal),看看是否有解析“%f”。

活出自我 · 2016-08-26 21:18

感谢蜗蜗大哥的耐心指导。我使用的该版本uboot确实没有对"%f"进行处理。