打印

关于MDK的sprintf问题

[复制链接]
7723|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vimman|  楼主 | 2008-1-5 17:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
mohanwei| | 2008-1-5 18:39 | 只看该作者

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

使用特权

评论回复
板凳
vimman|  楼主 | 2008-1-5 19:08 | 只看该作者

这是我的代码

typedef float    FP32;        
typedef struct{
FP32        data;
INT32U         unit;
}FP_DATA;

sprintf(buf,": %3.1f",gAppCfg.AppCompCfg.slope.data);
其中gAppCfg.AppCompCfg.slope就是一个FP_DATA成员。

使用特权

评论回复
地板
mohanwei| | 2008-1-6 13:30 | 只看该作者

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


试试这个:
int i;
float f=1.1;
char Str_Buff[100]={0};
sprintf(Str_Buff,"%3.1f",f);

如果没有问题,就绝对是你的参数有问题了,如果可以仿真,看一下“gAppCfg.AppCompCfg.slope.data”的值……

使用特权

评论回复
5
王紫豪| | 2008-1-6 13:32 | 只看该作者

buf有问题吗?

使用特权

评论回复
6
vimman|  楼主 | 2008-1-6 13:45 | 只看该作者

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

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

使用特权

评论回复
7
mohanwei| | 2008-1-6 15:43 | 只看该作者

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

使用特权

评论回复
8
vimman|  楼主 | 2008-1-7 13:12 | 只看该作者

没变化呀

使用特权

评论回复
9
vimman|  楼主 | 2008-1-13 10:49 | 只看该作者

原来和多任务有关系

系统运行后第一次切入的task如果使用到了sprintf转换浮点结果正确,如果其他task再次使用sprintf则无论什么值都会转成0.0?即使第一次切入idle task,没有用sprintf也不行;谁知道什么原因呀?就浮点不正常,急!!!

使用特权

评论回复
10
vimman|  楼主 | 2008-1-13 19:26 | 只看该作者

问题终于搞定了!

原来是任务堆栈没有对齐所致!朋友们要注意了!

使用特权

评论回复
11
linchuan1985| | 2011-9-5 16:41 | 只看该作者
怎么才能对齐。qq:472614845
谢谢

使用特权

评论回复
12
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

粉丝