OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9099|回复: 28

F767板子使用UCOSIII+FPU出现浮点运算错误的问题

[复制链接]

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
发表于 2018-8-23 19:09:02 | 显示全部楼层 |阅读模式
50金钱
本帖最后由 wanyingwe 于 2018-8-23 19:18 编辑

项目采用F767芯片,使用了UCOSIII系统,实际运行中出现浮点计算数据异常的问题,后仔细排查发现输入值正常的情况下,计算结果出现了特别大的值。
后来将FPU关闭之后计算数值一切正常。
计算代码示意如下,其他值都正常,结果错的离谱。

[mw_shl_code=c,true]traj_PATH_y = q_3*powf(traj_PATH_x,3)  + q_4*powf(traj_PATH_x,4)+  q_5 *powf(traj_PATH_x,5);
                                                        traj_PATH_theta = 180.0f/Pi*atanf((traj_PATH_y - traj_PATH_y0)/((traj_PATH_x - traj_PATH_x0)));[/mw_shl_code]
每次出现错误的地方是随机的,只要是计算的数都有概率会错。
以下是几处配置的地方,不知有没有问题

1、option->target 选项中选择了use single precision
2、c/c++ 的define 中只添加STM32F767xx,USE_HAL_DRIVER
3、stm32f767xx.h中__FPU_PRESENT 设置为1

所有UCOS的任务都加入了OS_OPT_TASK_SAVE_FP选项,任务堆栈也都设置的很大,基本都是1024的。
没有用arm_math.h中的函数,只用了math.h的函数,按理讲应该只影响效率不影响结果的。

实在是搞不定了,在网上搜了好久也没有找到合理的解释。
现在怀疑两个方面的问题:
1、FPU配置的问题,不知道有没有不合适的地方;
2、UCOS运行会不会影响FPU的结果,没有找到相关的解释。

求大神指点,万分感激~~



最佳答案

查看完整内容[请看2#楼]

每次浮点任务应该开关中断,STM32F767ucos开发手册,ucos移植有介绍。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-6-19
在线时间
15 小时
发表于 2018-8-23 19:09:03 | 显示全部楼层
每次浮点任务应该开关中断,STM32F767ucos开发手册,ucos移植有介绍。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-8-24 01:28:39 | 显示全部楼层
F7应该是double precision
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-8-24 01:29:05 | 显示全部楼层
另外,尝试下 任务堆栈,做字节对齐。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-8-24 01:29:09 | 显示全部楼层
比如32字节对齐
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2018-8-24 07:55:59 | 显示全部楼层

F7可以设置double或者single,是只能设置double?
任务堆栈现在是8字节对齐,我再改成32字节对齐试一试吧。
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2018-8-24 07:56:37 | 显示全部楼层

多谢原子哥指点
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2018-8-24 13:17:48 | 显示全部楼层
改为32字节对齐还是不行
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-8-25 02:00:52 | 显示全部楼层
wanyingwe 发表于 2018-8-24 13:17
改为32字节对齐还是不行

实在不行,就简化代码先吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2018-8-25 09:44:49 | 显示全部楼层
正点原子 发表于 2018-8-25 02:00
实在不行,就简化代码先吧

原子哥,昨天调试发现计算的时候关中断就不出错了。
但按道理讲创建任务时候加了OS_OPT_TASK_SAVE_FP选项的,可结果来看好像浮点寄存器出入栈的时候出了问题。
不懂还有什么地方有问题的。
回复

使用道具 举报

2

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-6-19
在线时间
15 小时
发表于 2018-8-25 15:55:18 | 显示全部楼层
顶起来。。。
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2018-8-27 09:30:11 | 显示全部楼层
别沉啊,求高手来讨论一下
回复

使用道具 举报

2

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2016-9-21
在线时间
50 小时
发表于 2018-8-27 15:28:00 | 显示全部楼层
是这样的。应该和移植ucos时把 Lazy Stacking堆栈给关掉了的原因,如果想正常使用定时器中断,要把 Lazy Stacking接到里边去。我也遇到这个问题,但是还没成功解决
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2018-8-27 19:42:32 | 显示全部楼层
wwqc 发表于 2018-8-27 16:54
每次浮点任务应该开关中断,STM32F767ucos开发手册,ucos移植有介绍。

是原子的UCOS手册吗,我找了找没有找到说要关中断呢,例程中测试浮点的程序是这么写的
[mw_shl_code=c,true]double_num+=0.01f;
OS_ENTER_CRITICAL(); //进入临界区(关闭中断)
printf("double_num 的值为: %.4f\r\n",double_num);
OS_EXIT_CRITICAL(); //退出临界区(开中断)
delay_ms(1000); //延时 1000ms[/mw_shl_code]
计算的时候没有关中断,就是打印的时候有加。

回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2018-8-27 19:54:08 | 显示全部楼层
小工人 发表于 2018-8-27 15:28
是这样的。应该和移植ucos时把 Lazy Stacking堆栈给关掉了的原因,如果想正常使用定时器中断,要把 Lazy St ...

整个工程里面搜lazy只有这几个东西,官方编程手册和参考手册都没有lazy相关的介绍,不懂怎么搞啊。
1.png
回复

使用道具 举报

2

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2016-9-21
在线时间
50 小时
发表于 2018-8-28 09:12:07 | 显示全部楼层
wanyingwe 发表于 2018-8-27 19:54
整个工程里面搜lazy只有这几个东西,官方编程手册和参考手册都没有lazy相关的介绍,不懂怎么搞啊。

惰性堆栈,原子提供的ucos工程为了使用fpu把惰性堆栈关了,关掉之后会影响中断切换的时候无法正常使用fpu。如果想两个都正常使用,需要把惰性堆栈打开,并且在ucos任务切换的压栈过程里加入惰性堆栈
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2018-8-29 07:46:14 | 显示全部楼层
小工人 发表于 2018-8-28 09:12
惰性堆栈,原子提供的ucos工程为了使用fpu把惰性堆栈关了,关掉之后会影响中断切换的时候无法正常使用fpu ...

大侠,恕我愚钝,实在是没有找到惰性堆栈相关的资料,有没有相关的资料给分享一下,感激不尽!
回复

使用道具 举报

2

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2016-9-21
在线时间
50 小时
发表于 2018-8-29 08:22:01 | 显示全部楼层
C:\Users\Administrator\Desktop\QQ截图20180829081957.png
QQ截图20180829081957.png
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2018-8-29 20:54:56 | 显示全部楼层

不好意思,真是眼瞎了,找了半天浮点就没看见这个。。。
找到M7内核的参考手册,看到有如下说明:

我的理解是:lazy stacking的机制是中断时不及时入栈,检测到中断中用到浮点寄存器才会入栈,可以减少中断处理时间;
关掉这个特性的话会每次中断都会入栈,但因为是UCOS,每次都会保存到任务堆栈中,这和数据错误有什么关系呢?不很理解。

2.png
回复

使用道具 举报

2

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2016-9-21
在线时间
50 小时
发表于 2018-9-3 16:49:10 | 显示全部楼层
wanyingwe 发表于 2018-8-29 20:54
不好意思,真是眼瞎了,找了半天浮点就没看见这个。。。
找到M7内核的参考手册,看到有如下说明:

问一下,你的问题解决了吗? 尝试把 Stack_Size      EQU     0x00000400 设置大一点试试
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2018-9-3 19:47:48 | 显示全部楼层
小工人 发表于 2018-9-3 16:49
问一下,你的问题解决了吗? 尝试把 Stack_Size      EQU     0x00000400 设置大一点试试

我改到1000了都,现在临界区改为关中断方式,关临界区就好了
回复

使用道具 举报

2

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2016-9-21
在线时间
50 小时
发表于 2018-9-4 08:40:57 | 显示全部楼层
wanyingwe 发表于 2018-9-3 19:47
我改到1000了都,现在临界区改为关中断方式,关临界区就好了

就是不用临界区就好了?
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2018-9-4 09:57:06 | 显示全部楼层
小工人 发表于 2018-9-4 08:40
就是不用临界区就好了?

OS_CFG_ISR_POST_DEFERRED_EN选项设置为0,在计算的时候加临界区保护
回复

使用道具 举报

2

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
267
金钱
267
注册时间
2012-8-31
在线时间
66 小时
发表于 2018-9-14 12:47:56 | 显示全部楼层
你好 你的问题解决了吗?我也遇到了相似的问题 求教
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2016-2-23
在线时间
11 小时
发表于 2018-9-14 23:08:54 | 显示全部楼层
这个问题我在半年前遇到过,我的临时解决方法是所有的浮点数全部替换成整型处理了。
我认为这个问题的根本原因OS_CPU_A.ASM这个文件的问题,现在网上所有的这个文件都是用的cortex-m4的, WJ3S3H%YLS(CA3]BI}@0.png
这个文件包含多个函数用于任务切换,其中包括多个与浮点数寄存器堆栈有关的函数,它只支持single precision,显然stm32f767(cortex-m4)的double precision是不兼容的。

这个文件本应该是官方发布(可惜一直没发),由于本人水平有限,不懂汇编,还请高人参照数据手册实现函数,为民造福@正点原子
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2018-9-19 10:03:19 | 显示全部楼层
zhengwending 发表于 2018-9-14 12:47
你好 你的问题解决了吗?我也遇到了相似的问题 求教

暂时解决了,浮点计算代码处加关中断的方式进行保护。
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2018-9-19 10:06:00 | 显示全部楼层
小白哈哈额好 发表于 2018-9-14 23:08
这个问题我在半年前遇到过,我的临时解决方法是所有的浮点数全部替换成整型处理了。
我认为这个问题的根本 ...

遇到高手了,可能是这方面原因,F7现在用的人可能还比较少,类似的问题暴露的不够多
回复

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4367
金钱
4367
注册时间
2017-5-30
在线时间
578 小时
发表于 2019-3-6 16:56:20 | 显示全部楼层
最近也要学习这个,先放一个自己查到的资料吧,关于惰性堆栈的https://www.a_m_o_bbs.com/thread ... tml?_dsign=c955364d
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-3-20
在线时间
1 小时
发表于 2019-3-20 19:15:13 | 显示全部楼层
我也遇到同样问题,如果每个浮点任务都要这样,那项目不用做了,因为有几千个浮点运算,现在想换到FreeRTOS了,uc这个感觉这么挫,我用的429
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-5 14:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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