【问题标题】:Gnu - Arm Float to String ( sprintf )Gnu - Arm 浮点到字符串( sprintf )
【发布时间】:2019-11-28 11:28:49
【问题描述】:

我在 Eclipse ( lpc1769 m3 cortex ) 上使用 gnu arm。我想用 sprintf 将浮点值转换为字符串,但它不起作用。

我将 -u_printf_float 添加到链接器选项,但它不起作用。 我该如何解决?

int main(void) {

    InitBoard();

        float flt = 1.1;
        char msg[256];
        sprintf(msg , "number is %.3f ", flt);
        while (1){

            KC_UART_sendstring(LPC_UART0, msg);

            delay_ms(500);
        }
}

这是我的链接器选项

-T "C:\Users**username**\Eclipse-workspace\Test_1\ldscript\LPC17xx.ld" -Xlinker --gc-sections -L"C:\Users**username**\AppData\漫游\xPacks@gnu-mcu-eclipse\arm-none-eabi-gcc\7.2.1-1.1.5.content\arm-none-eabi\lib\thumb\v7-m" -Wl,-Map,"Test_1 .map" --specs=nano.specs -u_printf_float

【问题讨论】:

  • 它是否适用于KC_UART_sendstring(LPC_UART0, "number is 1.100 ");
  • 你怎么知道sprintf()不起作用”?
  • 程序无法执行 sprintf,如果我将 u_printf_float 添加到链接器选项,它将在此行停止。如果我评论 sprintf,它发送的数字是 1.100 与 uart。如果我删除链接器选项上的 u_printf_float,程序 didint 在 sprintf 行停止并执行 while(1),发送编号为 1.100。
  • 您是否已将打印格式指定为int_FP? (community.nxp.com/thread/44262#comment-375421)。一点安全注意事项:使用snprintf ;-)
  • 只需将其转换为双倍:sprintf(msg , "number is %.3f ", (double)flt);

标签: c eclipse arm printf


【解决方案1】:

查看LPC1769 datasheet 时,我没有看到任何FPU

那么如果没有FPU,你如何管理floats

  • 购买带有 FPU 的新芯片
  • 没有浮点数的代码
  • software FPU 但请注意,您的程序会遇到性能问题(速度、RAM)

没有浮动的代码

使用除数和除数。 Pi 只是unsigned pi_x_1000000 = 3141593;

那么如果你想计算一个圆的周长,

unsigned circumference = (pi_x_1000000 * 2 * radius) / 1000000;

注意:您的芯片可能需要 12 美元,它受到速度/RAM 的限制,并且,根据您想用它实现的目标,您可以考虑使用软件 FPU 以外的其他解决方案。在工业中,由于成本和性能问题,我们不使用浮点数。

【讨论】:

  • 它是 Cortex M3,而不是 M3F!
  • 我可以使用哪些替代品?
  • 如果微控制器没有FPU,并不代表它不能做浮点运算。浮点运算也可以在软件中完成。编译器特别支持选项-mfloat-abi=soft-mfloat-abi=softfp
  • ...而且您不需要更改代码:编译器会处理它。
  • @GuillaumeD 见gcc.gnu.org/onlinedocs/gcc/ARM-Options.html。是softfp。
猜你喜欢
  • 1970-01-01
  • 2016-01-03
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 2019-04-19
  • 1970-01-01
相关资源
最近更新 更多