【问题标题】:MBED RTOS convert Float to String/Char arrayMBED RTOS 将浮点数转换为字符串/字符数组
【发布时间】:2017-04-18 20:45:47
【问题描述】:

我正在尝试将浮点数转换为字符串以通过串行连接发送。 我使用过 sprintf 并且以前工作过,但我现在正在运行 mbed RTOS,当到达 sprintf 行时它会挂起。

下面是代码在 while 循环中停止的行,我从端口中的 mbed 模拟收集数据并需要通过串行显示它。

sprintf (buffer, ",%.2f,%.2f,%.2f,%.2f", sData1[0], sData1[1], sData1[2], sData1[3]);

我已经使用 c_str() 在 RTOS 下成功地将字符串转换回浮点数。

有没有类似 c_str() 的东西可以不使用 sprintf 方法从浮点数转换成字符串?

【问题讨论】:

  • 我们不知道buffer 是否大到足以容纳生成的字符串。请发布 buffer 声明的内容。
  • @PaulMcKenzie 抱歉,错过了。它被声明为“char * buffer;”
  • 是的,但是缓冲区的大小在哪里?您不能简单地声明一个未初始化的指针并将其传递给sprintf。如果你这样做了,那么事情不起作用也就不足为奇了。也许一直以来的问题是,您摆脱了未定义的行为并相信一切正常。
  • @PaulMcKenzie 我的错误是我重新定义了大小为 250 的缓冲区并且它工作得很好。不知道我是怎么错过的,谢谢
  • 在没有 FPU 的处理器上的浮点运算速度很慢并且通常是不确定的,如果存在 FPU,RTOS 必须能够在上下文切换中支持 FPU 寄存器- 这会减慢上下文切换并需要额外的堆栈空间。通常最好避免 - 但这是一个不同的问题。

标签: c++ string floating-point rtos mbed


【解决方案1】:

printfsprintf 函数在代码方面可能非常大。嵌入式 IDE 通常提供这些函数的多个较小版本,它们不支持所有格式说明符,例如 %f。您可能必须在项目选项中选择与完整版本的 printf 链接,以便 %f 格式说明符起作用。

printfsprintf 函数也比一般函数使用更多的堆栈空间。增加程序的堆栈大小,看看是否是堆栈溢出导致sprintf 无法返回。

【讨论】:

  • 仅供参考,要查看 mbed OS 上是否发生堆栈溢出,请检查串行输出中是否存在 0x0001 错误。请参阅here 了解更多信息。
【解决方案2】:

每个线程都有自己的堆栈,默认情况下它可能比分配给单个线程进程的堆栈小得多。许多sprintf() 实现使用大量堆栈——尤其是对于浮点支持。

它可以简单地通过增加相关线程的堆栈来工作,但可能需要大量资源来解决这个问题。如果看起来两位小数就足够了,那么传输缩放 x100 的整数值会更便宜:

int val_x100( float val )
{
    int i = (int)(val * 1000) ;
    if( i % 10 >= 5 )
    {
        i = (i / 10) + 1 ;
    }
    else if( i % 10 <= -5 )
    {
        i = (i / 10) - 1 ;
    }
    else
    {
        i /= 10 ;
    }

    return i ;
}

然后:

sprintf( buffer, ",%d,%d,%d,%d", 
         val_x100( sData1[0] ), 
         val_x100( sData1[1] ), 
         val_x100( sData1[2] ), 
         val_x100( sData1[3] ) ;

【讨论】:

    猜你喜欢
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多