关于MDK的sprintf问题

[复制链接]
 楼主| vimman 发表于 2008-1-5 17:46 | 显示全部楼层 |阅读模式
我使用uVison3的realview MDK做开发,用到了库函数sprintf做浮点转字符串,结果发现有时候无论什么值都会被转成0.0。被转的变量是一个结构体成员,结构体由一个浮点类型和一个int类型构成,请问大家谁碰到过类似问题?
mohanwei 发表于 2008-1-5 18:39 | 显示全部楼层

怎么可能,把你那段代码贴出来看看?

  
 楼主| vimman 发表于 2008-1-5 19:08 | 显示全部楼层

这是我的代码

typedef&nbsp;float&nbsp;&nbsp;&nbsp;&nbsp;FP32;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />typedef&nbsp;struct{<br />FP32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data;<br />INT32U&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unit;<br />}FP_DATA;<br /><br />sprintf(buf,&quot;:&nbsp;%3.1f&quot;,gAppCfg.AppCompCfg.slope.data);<br />其中gAppCfg.AppCompCfg.slope就是一个FP_DATA成员。
mohanwei 发表于 2008-1-6 13:30 | 显示全部楼层

这条语句不会有什么问题,如果你的参数合法的话

<br />试试这个:<br />int&nbsp;i;<br />float&nbsp;f=1.1;<br />char&nbsp;Str_Buff[100]={0};<br />sprintf(Str_Buff,&quot;%3.1f&quot;,f);<br /><br />如果没有问题,就绝对是你的参数有问题了,如果可以仿真,看一下“gAppCfg.AppCompCfg.slope.data”的值……
王紫豪 发表于 2008-1-6 13:32 | 显示全部楼层

buf有问题吗?

  
 楼主| vimman 发表于 2008-1-6 13:45 | 显示全部楼层

仿真效果和实际运行效果一致

我仿真一下,gAppCfg.AppCompCfg.slope.data这个值确实不是0,但输出仍然是0.0;sprintf一个常数也是如此,跟了半天汇编云里雾里,看不出来问题。后来把结构体强制为8字节对齐就OK了,只知道mdk要求堆栈8字节对齐;难道sprintf跟对齐还有关系呀?
mohanwei 发表于 2008-1-6 15:43 | 显示全部楼层

改为“(float)gAppCfg.AppCompCfg.slope.data”呢?

  
 楼主| vimman 发表于 2008-1-7 13:12 | 显示全部楼层

没变化呀

  
 楼主| vimman 发表于 2008-1-13 10:49 | 显示全部楼层

原来和多任务有关系

系统运行后第一次切入的task如果使用到了sprintf转换浮点结果正确,如果其他task再次使用sprintf则无论什么值都会转成0.0?即使第一次切入idle&nbsp;task,没有用sprintf也不行;谁知道什么原因呀?就浮点不正常,急!!!
 楼主| vimman 发表于 2008-1-13 19:26 | 显示全部楼层

问题终于搞定了!

原来是任务堆栈没有对齐所致!朋友们要注意了!
linchuan1985 发表于 2011-9-5 16:41 | 显示全部楼层
怎么才能对齐。qq:472614845
谢谢
worldsing 发表于 2014-5-12 22:06 | 显示全部楼层
linchuan1985 发表于 2011-9-5 16:41
怎么才能对齐。qq:472614845
谢谢

很简单
__align(8) static OS_STK TaskStartStk[TASK_START_STK_SIZE];

强制8字节对齐

其实在CrotexM3里还应该主意double类型对齐,至少是4字节对齐,否则HardFault_Handler伺候你,

够你受的

欢迎交流Q*群:315447772
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

81

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部