OpenEdv-开源电子网

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

有人遇到过F7+UCOS的时候,任务中运算浮点数结果错误的情况吗?

[复制链接]

10

主题

32

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2020-5-13
在线时间
21 小时
发表于 2020-10-18 15:16:17 | 显示全部楼层 |阅读模式
30金钱
我出现的问题是这样的,我的F7跑了UCOSii系统,然后我有一个大约50khz外部中断,每次中断都会在里面进行浮点运算。然后我在任务中也有很多地方用到了浮点运算,但是在任务中的浮点运算,经常会出现结果不对的情况,比如0.01*0.01应该来说是等于0.001的,但是我居然计算得到一个几十万的数(其实应该是没有什么规则的)
我在网上查过,有些人说是因为F7使用了一个叫协处理器(Lazy Stackin)的东西来进行上下文保存的功能,然后我们移植UCOS的时候是需要把这个Lazy Stackin给关掉的,关掉以后就不会在进入中断的时候进行上下文保存,如果在任务中进行浮点运算的时候被中断打断,而且进入中断里还进行浮点运算,那么就会修改浮点寄存器(FPU)的值,出中断没有恢复现场,就导致FPU中的浮点值已经被改掉了,造成这种浮点计算结果错误的问题。
我不知道是不是真的是这样,所以来请教一下有没有大神遇到过这种问题,分享一下解决方法

最佳答案

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

感觉是你的F7开了D-Cache而相应SRAM又没有设置"write through"写入方式所致
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-10-18 15:16:18 | 显示全部楼层
感觉是你的F7开了D-Cache而相应SRAM又没有设置"write through"写入方式所致
回复

使用道具 举报

10

主题

32

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2020-5-13
在线时间
21 小时
 楼主| 发表于 2020-10-20 08:45:36 | 显示全部楼层
有人吗,别沉了呀
回复

使用道具 举报

10

主题

32

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2020-5-13
在线时间
21 小时
 楼主| 发表于 2020-10-20 11:59:34 | 显示全部楼层
@正点原子 原子哥,能帮忙看下吗
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7462
金钱
7462
注册时间
2015-1-15
在线时间
1367 小时
发表于 2020-10-21 10:21:33 | 显示全部楼层
使用的什么版本ucos-ii?

一分耕耘一分收获。
回复

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2019-5-13
在线时间
21 小时
发表于 2020-10-22 17:56:18 | 显示全部楼层
0.01*0.01=0.0001
回复

使用道具 举报

10

主题

32

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2020-5-13
在线时间
21 小时
 楼主| 发表于 2020-11-2 22:31:59 | 显示全部楼层
ufbycd 发表于 2020-10-23 09:58
感觉是你的F7开了D-Cache而相应SRAM又没有设置"write through"写入方式所致

请问这个write through是个什么东西呀
回复

使用道具 举报

10

主题

32

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2020-5-13
在线时间
21 小时
 楼主| 发表于 2020-11-5 14:01:23 | 显示全部楼层
我在每次需要计算浮点数的中断中加入了一段汇编代码,进入中断的时候将浮点寄存器压栈到我定义的一组变量中,出中断的时候在出栈,然后就不会再出现这种现象了
回复

使用道具 举报

11

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2017-10-29
在线时间
150 小时
发表于 2020-11-6 08:32:31 | 显示全部楼层
uCOS需要记录进出中断,他又一个记录,其实就是一个计数。进中断有一个,出中断有一个,告诉uCOS系统进了中断,因为你的这个中断的频率比uCOS的心跳频率快的多。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-29 23:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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