硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4292|回复: 14
收起左侧

[技术讨论] UCOSIII+STM32F03VC打印浮点数出错

[复制链接]

77

主题

691

回帖

922

积分

金牌会员

积分
922
发表于 2020-11-16 23:45:54 | 显示全部楼层 |阅读模式
大家有遇到过ucosIII加stm32f103打印浮点数出错吗?具体情况如下:1、任务堆栈已经全部8字节对其
2、在任务里面调用printf打印浮点数,通过
3、开发平台IAR7.5
4、在中断服务函数回调函数里面调用printf打印浮点数失败,数据完全是错的,但是数据格式没问题,例如printf("%.2f",data);小数点后面确实只有两位小数


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
发表于 2020-11-17 00:37:37 | 显示全部楼层
中断里面做浮点计算正常不。
回复

使用道具 举报

77

主题

691

回帖

922

积分

金牌会员

积分
922
 楼主| 发表于 2020-11-17 01:18:51 | 显示全部楼层
eric2013 发表于 2020-11-17 00:37
中断里面做浮点计算正常不。

其实这个函数不应该叫回调,该函数就会在中断服务函数里面被调用。在live watch窗口看数据是正常的,通过printf打印出来就乱了。


static float tmp = 1.0/3.0;
printf("%.2f\r\n",tmp);

在live watch窗口看,tmp确实等于0.33333,但是打印出来一会儿是0.00一会儿是其他很大的数,但是小数点后都只有两位。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
发表于 2020-11-17 01:37:22 | 显示全部楼层
我手头没有F1的板子,用H7的帮你测试了下,正常。

用的此例子:

基于V5,V6和V7的最新版uCOS-III V3.08.00程序模板,含MDK和IAR两个版本,支持uC/Probe(2020-03-19)
http://www.armbbs.cn/forum.php?m ... id=96918&fromuid=58
(出处: 硬汉嵌入式论坛)

回复

使用道具 举报

77

主题

691

回帖

922

积分

金牌会员

积分
922
 楼主| 发表于 2020-11-17 10:05:39 | 显示全部楼层
eric2013 发表于 2020-11-17 01:37
我手头没有F1的板子,用H7的帮你测试了下,正常。

用的此例子:

谢啦硬汉哥,我看看
回复

使用道具 举报

77

主题

691

回帖

922

积分

金牌会员

积分
922
 楼主| 发表于 2020-11-18 00:42:08 | 显示全部楼层
eric2013 发表于 2020-11-17 01:37
我手头没有F1的板子,用H7的帮你测试了下,正常。

用的此例子:

还是不行,放弃了。应该是C标准或者规约导致的,即使现在找到了问题,以后说不一定会在其他地方由于其他原因出现问题。目前printf函数族在中断服务函数里面涉及浮点数都是不行的,但是运算结果通过liveWatch看正常,内存里面也是正确的。
回复

使用道具 举报

77

主题

691

回帖

922

积分

金牌会员

积分
922
 楼主| 发表于 2020-11-18 16:45:50 | 显示全部楼层
eric2013 发表于 2020-11-17 01:37
我手头没有F1的板子,用H7的帮你测试了下,正常。

用的此例子:

找到问题了,CM3是双堆栈,启用OS初始化的时候只是对齐任务堆栈PSP,但是响应异常的时候使用的是MSP,这样的话MSP就有可能不是8字节对齐,存在在响应异常的时候如果需要进行双字处理,就会出错。权威指南12章也提到双字的堆栈问题,一直没关注,才吃这个亏。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
发表于 2020-11-19 09:25:27 | 显示全部楼层
庄永 发表于 2020-11-18 16:45
找到问题了,CM3是双堆栈,启用OS初始化的时候只是对齐任务堆栈PSP,但是响应异常的时候使用的是MSP,这 ...

MSP也没问题的,我们在xxx.s已经做了8字节对齐了
回复

使用道具 举报

77

主题

691

回帖

922

积分

金牌会员

积分
922
 楼主| 发表于 2020-11-19 12:03:01 | 显示全部楼层
eric2013 发表于 2020-11-19 09:25
MSP也没问题的,我们在xxx.s已经做了8字节对齐了

我们公司自己的模板没有做,看来我们公司确一个硬汉哥这种对内核很了解的牛人。
回复

使用道具 举报

77

主题

691

回帖

922

积分

金牌会员

积分
922
 楼主| 发表于 2020-11-19 12:03:02 | 显示全部楼层
eric2013 发表于 2020-11-19 09:25
MSP也没问题的,我们在xxx.s已经做了8字节对齐了

我们公司自己的模板没有做,看来我们公司确一个硬汉哥这种对内核很了解的牛人。
回复

使用道具 举报

77

主题

691

回帖

922

积分

金牌会员

积分
922
 楼主| 发表于 2020-11-20 11:05:30 | 显示全部楼层
eric2013 发表于 2020-11-19 09:25
MSP也没问题的,我们在xxx.s已经做了8字节对齐了

硬汉哥,我仔细研究了下。启动文件已经对主堆栈进行了双字对齐:SECTION CSTACKATA:NOROOT(3),但是这样只是对主堆栈栈顶对齐,但是如果在异常响应调用函数或者在异常服务函数进行双字数据操作,入栈地址却不一定双字对齐,所以如果在执行双字数据操作的时候如果前面的语句导致双字数据处理入栈刚好双字对齐,就不会有问题,否则就会出问题。所以有时候多一条语句或者少一条语句都有可能会导致运算出错,所以为了安全,还是得按照上面的解决方案,让内核主动在进行双字运算的时候调整对齐实现双字对齐。

同理,UCOS任务目前广大网友提出的强制任务栈8字节对齐的方式好像也不大安全保证稳定的双字运算,我个人在设计研究的时候也发现过同样的系统移植,有时候可以有时候不可以,当时纳闷,现在深入研究想想是这个理,栈顶对齐不代表数据处理的是入栈的地址也刚好是双字对齐。

以上是我个人研究想法,说出来和硬汉哥和硬汉粉一起交流学习。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
发表于 2020-11-20 12:09:33 | 显示全部楼层
庄永 发表于 2020-11-20 11:05
硬汉哥,我仔细研究了下。启动文件已经对主堆栈进行了双字对齐:SECTION CSTACKATA:NOROOT(3),但是这样 ...

M内核,进入每个函数,一定是8字节对齐的,这个是ARM体系结构AAPCS的强制要求,编译器必须要处理。

而RTOS的移植,仅需用户保证首次进入任务是8字节对齐即可,后续就无需用户再操心。
回复

使用道具 举报

77

主题

691

回帖

922

积分

金牌会员

积分
922
 楼主| 发表于 2020-11-20 15:13:04 | 显示全部楼层
eric2013 发表于 2020-11-20 12:09
M内核,进入每个函数,一定是8字节对齐的,这个是ARM体系结构AAPCS的强制要求,编译器必须要处理。

而 ...

我总感觉有时候没有8字节对齐,所以出错了。我再消化下。
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2020-11-22 16:07:02 | 显示全部楼层
eric2013 发表于 2020-11-17 00:37
中断里面做浮点计算正常不。

我有个产品,在中断里面还做事件故障记录保存EEPROM,用CPU占用率高来描述性能稳定性缺陷,却被领导反驳。做了缓存机制来保存事件,在外面高优先级的任务及时写EEPROM保存故障记录。奈何又影响了产品的机制稳定性。最后领导亲自操刀,最后综合优化BUG。
Releasing your creativity
回复

使用道具 举报

77

主题

691

回帖

922

积分

金牌会员

积分
922
 楼主| 发表于 2020-11-23 21:49:53 | 显示全部楼层
廷润 发表于 2020-11-22 16:07
我有个产品,在中断里面还做事件故障记录保存EEPROM,用CPU占用率高来描述性能稳定性缺陷,却被领导反驳 ...

中断里面做写EEPROM这种需要耗时并且需要回读校验的操作确实不妥;但是通过任务同步来用任务保存数据应该是比较合适的方案呀,应该不会影响产品的机制稳定性吧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 14:02 , Processed in 0.262437 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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