U-boot中无法开启Cortex-A9的NEON功能
本文是原「蜗窝讨论区」的历史存档(2016-08-18),来自版块「Linux kernel技术问答」,共 3 帖。讨论区已停止服务,此处仅供查阅。
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
你这应该是printf的问题,去uboot中检查一下printf的实现(vsnprintf_internal),看看是否有解析“%f”。
感谢蜗蜗大哥的耐心指导。我使用的该版本uboot确实没有对"%f"进行处理。
