N32G43x芯片浮点数计算偶发错误

本文描述了在使用国民技术N32G435芯片进行浮点数计算时遇到的问题,分析了可能的软件实现错误、MCU配置和中断影响。解决方案是使用中断保护机制,避免浮点数运算过程中的错误。作者还强调了使用浮点数时的注意事项,如MCU负载率管理和浮点数运算的正确处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 问题现象

最近做项目时用到国产的一款芯片——国民技术的N32G435,采用32位ARM Cortex™-M4F内核,集成浮点运算单元(FPU)。在用这款芯片做浮点数计算时,却经常出现一些匪夷所思的现象,例如非负的两个浮点数相除得到了负数,两个非负浮点数相减得到一个更大的非负数。
而这款MCU是支持浮点数运算的,软件中也正常开启了浮点数运算功能(FPU)。如下图所示:
在这里插入图片描述
这种偶发问题导致了浮点数的计算结果不可靠,引发了严重的后果。

2. 分析思路

2.1 首先排查软件实现上的错误

反复排查软件实现上无误。

2.2 确认MCU是支持浮点数运算并正确配置了FPU模块

大部分情况浮点数计算结果是正确的,出错是少数情况。

2.3 排查浮点数计算出错的根本原因

MCU运行了uCOS操作系统,开了定时器中断和外部中断,在偶然浏览到这篇博客stm32F4单片机计算浮点数的时候偶发性出错的解决方法,与其中遇到的问题类似,并且都是M4的芯片,发现计算浮点数过程中, 若触发中断, 浮点数如果未能正常入栈, 导致中断结束后从栈中取出来的浮点数出现乱码, 从而导致偶发性计算错误。

3. 解决方案

使用keil独有的操作总中断函数

#define taskENTER_CRITICAL()  __disable_irq()
#define taskEXIT_CRITICAL()   __enable_irq()

在进行浮点数运算前,关总中断,计算结束后再开总中断。

taskENTER_CRITICAL();
//进行浮点数运算
//....
taskEXIT_CRITICAL();

在程序中,复制一份相同的浮点数变量,进行同样的浮点数运算,但是复制的那个变量每次进行浮点数运算时进行关中断保护。接下来就可以跑程序,等待现象复现。验证效果如下:
在这里插入图片描述
当原始的float变量浮点数运算出现错误值时,关中断保护的float变量仍然能正确运算。

4. 回顾思考

通过这次问题解决的过程,总结了几点教训:

  1. 尽量少用、不用浮点数,现在MCU虽然大部分都支持浮点数运算,但是不排除这些MCU也是存在一些bug的,涉及数学运算时能用int解决尽量别用浮点数,稳定性可靠性不及int;
  2. 要关注MCU负载率,在该项目中,使用了大量软件延时,导致MCU负载率很高,也增加了浮点数运算出错的可能性;
  3. 使用浮点数运算做好关中断保护,一定要使用浮点数时,需谨慎,做好出入栈保护,避免非应用层的运算出错。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-今晚打老虎-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值