搜索
bottom↓
回复: 7

使用sprintf格式化浮点数为0.0

[复制链接]

出590入992汤圆

发表于 2018-2-27 16:34:21 | 显示全部楼层 |阅读模式
本帖最后由 SUPER_CRJ 于 2018-2-27 16:36 编辑

如下:在STM32F1编程中使用了类似下面的函数:
        char Value[30];
        sprintf( Value,"%3.1lf",19.0);
        格式化后Value里面为0.0。但是之前是OK的,突然有一天不可以了,之前没有解决,查看网上的解决办法,说是8字节对齐,但是看了μc/OS-Ⅲ中的堆栈都是8的整数倍,怀疑是使用了:#para强制对齐造成的结果(项目其它地方使用的!)。现在要如何解决这个问题呢?我当前的方法是:sprintf( Value,"%d.%d",190/10,190%10);请问大家有没有更好的方法?

出0入0汤圆

发表于 2018-2-27 18:30:14 | 显示全部楼层
我以前碰到过类似的情况
ARM-GCC下sprintf()不支持%f格式化输出

出870入263汤圆

发表于 2018-2-27 19:53:39 | 显示全部楼层
  1. CPU_STK  *OSTaskStkInit (OS_TASK_PTR    p_task,
  2.                          void          *p_arg,
  3.                          CPU_STK       *p_stk_base,
  4.                          CPU_STK       *p_stk_limit,
  5.                          CPU_STK_SIZE   stk_size,
  6.                          OS_OPT         opt)
  7. {
  8.   CPU_STK    *p_stk;
  9.   
  10.   (void)opt;                                                  /* 'opt' is not used, prevent warning                   */
  11.   
  12.   p_stk = &p_stk_base[stk_size];                              /* Load stack pointer                                   */
  13.   p_stk = (CPU_STK *)((CPU_STK)(p_stk) & ~7u);                /* Align the stack to 8-bytes.                          */
  14.                                                               /* Registers stacked as if auto-saved on exception      */
  15.   *(--p_stk) = (CPU_STK)0x01000000uL;                         /* xPSR                                                 */
  16.   *(--p_stk) = (CPU_STK)p_task;                               /* Entry Point                                          */
  17.   *(--p_stk) = (CPU_STK)OS_TaskReturn;                        /* R14 (LR)                                             */
  18.   *(--p_stk) = (CPU_STK)0x12121212uL;                         /* R12                                                  */
  19.   *(--p_stk) = (CPU_STK)0x03030303uL;                         /* R3                                                   */
  20.   *(--p_stk) = (CPU_STK)0x02020202uL;                         /* R2                                                   */
  21.   *(--p_stk) = (CPU_STK)0x01010101uL;                         /* R1                                                   */
  22.   *(--p_stk) = (CPU_STK)p_arg;                                /* R0 : argument                                        */
  23.   *(--p_stk) = (CPU_STK)0x11111111uL;                         /* R11                                                  */
  24.   *(--p_stk) = (CPU_STK)0x10101010uL;                         /* R10                                                  */
  25.   *(--p_stk) = (CPU_STK)0x09090909uL;                         /* R9                                                   */
  26.   *(--p_stk) = (CPU_STK)0x08080808uL;                         /* R8                                                   */
  27.   *(--p_stk) = (CPU_STK)0x07070707uL;                         /* R7                                                   */
  28.   *(--p_stk) = (CPU_STK)0x06060606uL;                         /* R6                                                   */
  29.   *(--p_stk) = (CPU_STK)0x05050505uL;                         /* R5                                                   */
  30.   *(--p_stk) = (CPU_STK)0x04040404uL;                         /* R4                                                   */
  31. #if defined(__ARMVFP__)
  32.   *(--p_stk) = (CPU_STK)0xFFFFFFFDuL;                         /* EXEC_RETURN; See Note 5                              */
  33. #endif

  34.   return (p_stk);
  35. }
复制代码

出590入992汤圆

 楼主| 发表于 2018-2-27 21:44:11 | 显示全部楼层

什么意思?没有看懂,是不是要改μc/OS-Ⅲ中的这些?问题是:这个更改有什么优点和缺点?

出870入263汤圆

发表于 2018-2-27 22:50:24 | 显示全部楼层
SUPER_CRJ 发表于 2018-2-27 21:44
什么意思?没有看懂,是不是要改μc/OS-Ⅲ中的这些?问题是:这个更改有什么优点和缺点? ...

我遇到的问题跟你描述的一模一样。确实是堆栈8字节对齐问题所致!
上面代码确保了任务堆栈的8字节对齐

出0入8汤圆

发表于 2018-2-28 08:06:05 来自手机 | 显示全部楼层
我裸机下也不行

出590入992汤圆

 楼主| 发表于 2018-2-28 09:04:36 | 显示全部楼层

应该是8字节堆栈问题,我可能是之前用了#para强制对齐,才导致的,那你现在是怎么解决的呢?分享一下,让更多的人知道解决方法。

出0入0汤圆

发表于 2018-2-28 09:06:33 | 显示全部楼层
以前遇到过,要在合适的地方加8字节对齐的#para
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-7 09:51

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表