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

2019-07-20 03:03发布

本帖最后由 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的结果,没有找到相关的解释。

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



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
28条回答
wanyingwe
1楼-- · 2019-07-21 19:49
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 ",double_num);
OS_EXIT_CRITICAL(); //退出临界区(开中断)
delay_ms(1000); //延时 1000ms[/mw_shl_code]
计算的时候没有关中断,就是打印的时候有加。

wanyingwe
2楼-- · 2019-07-22 00:48
 精彩回答 2  元偷偷看……
小工人
3楼-- · 2019-07-22 03:52
 精彩回答 2  元偷偷看……
wanyingwe
4楼-- · 2019-07-22 05:33
小工人 发表于 2018-8-28 09:12
惰性堆栈,原子提供的ucos工程为了使用fpu把惰性堆栈关了,关掉之后会影响中断切换的时候无法正常使用fpu ...

大侠,恕我愚钝,实在是没有找到惰性堆栈相关的资料,有没有相关的资料给分享一下,感激不尽!
小工人
5楼-- · 2019-07-22 11:30
 精彩回答 2  元偷偷看……
wanyingwe
6楼-- · 2019-07-22 17:00
小工人 发表于 2018-8-29 08:22

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

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

一周热门 更多>