huangxiaolpbany 发表于 2022-12-27 11:55:08

使用ICCAVR7.0+AVRSTUDIO4.19,Float全局变量数值变化

最近用AVR做个小东西,其中一个功能是测量输入的模拟量,目的1将AD值转为速度进行显示,目的2输出对应频率的脉冲。

定义了全局变量,用来保存AD值到速度及脉冲的比例系数;
volatile float XAD2Spd,YAD2Spd,XAD2Pul,YAD2Pul;

然后在程序开始进行比例系数的计算,因为老是出问题,所以改成了很多步骤来计算;
   FloatTemp1=(float)X1VRotRate;
   FloatTemp2=(float)XPitch;
   FloatTemp2=FloatTemp2/1000.0;
   FloatTemp2=FloatTemp2/1000.0;
   XAD2Spd=FloatTemp1*FloatTemp2*4.0*2.495/4095.0;

   FloatTemp1=(float)Y1VRotRate;
   FloatTemp2=(float)YPitch;
   FloatTemp2=FloatTemp2/1000.0;
   FloatTemp2=FloatTemp2/1000.0;
   YAD2Spd=FloatTemp1*FloatTemp2*4.0*2.495/4095.0;

      FloatTemp1=(float)X1VRotRate;
      FloatTemp2=(float)XPitch;
      FloatTemp2=FloatTemp2/1000.0;
      FloatTemp2=FloatTemp2/1000.0;
      FloatTemp3=(float)JET3Resolution;
      FloatTemp3=FloatTemp3/1000.0;
      FloatTemp4=FloatTemp1*FloatTemp2*FloatTemp3*4.0*2.495/60.0/4095.0;
      XAD2Pul=FloatTemp4;

      FloatTemp1=(float)Y1VRotRate;
      FloatTemp2=(float)YPitch;
      FloatTemp2=FloatTemp2/1000.0;
      FloatTemp2=FloatTemp2/1000.0;
      FloatTemp3=(float)JET3Resolution;
      FloatTemp3=FloatTemp3/1000.0;
      FloatTemp4=FloatTemp1*FloatTemp2*FloatTemp3*4.0*2.495/60.0/4095.0;
      YAD2Pul=FloatTemp4;   

计算出来的数值没有问题;

但是继续运行就会出问题

整个程序里面就只有将XAD2Spd,YAD2Spd,XAD2Pul,YAD2Pul赋值给别的参数,没有别的地方给这几个参数赋值
               FloatTemp1=XAD2Spd;
               XSPDValueShow=(uint)((float)XADValueShow*FloatTemp1);
               
               FloatTemp1=YAD2Spd;
               YSPDValueShow=(uint)((float)YADValueShow*FloatTemp1);

      FloatTemp1=(float)XADAvg;
      FloatTemp2=XAD2Pul;
      FloatTemp3=FloatTemp1*FloatTemp2;
      XFreq=(uint)FloatTemp3;
      
      FloatTemp1=(float)YADAvg;
      FloatTemp2=YAD2Pul;
      FloatTemp3=FloatTemp1*FloatTemp2;
      YFreq=(uint)FloatTemp3;

就是如上的程序,现在不明白是为什么了,麻烦帮忙看下,谢谢






rube 发表于 2022-12-27 14:15:23

可能是溢出,也可能与编译器有关。浮点计算占用资源多又慢,我一般都是放大成整数来运算
你用printf一步步输出来调试

极少人用avr了

huangxiaolpbany 发表于 2022-12-27 16:27:38

rube 发表于 2022-12-27 14:15
可能是溢出,也可能与编译器有关。浮点计算占用资源多又慢,我一般都是放大成整数来运算
你用printf一步步 ...
(引用自2楼)

我也是偶尔要用,很少用,AVR的东西以前用,东西还在。懒得再去学别的了。

yaoyyie2003 发表于 2022-12-27 16:39:42

话说这是十多年前在玩的。

gonboy 发表于 2023-1-3 11:39:49

用的人少,估计都不会答复了。
从现象看。是溢出

t3486784401 发表于 2023-1-3 14:50:32

一般说来是 AS4 在抽风,建议上硬件比对下。
ICC印象中浮点没那么差,除了三角函数有坑

pcl 发表于 2023-1-3 18:44:00

搭配studio只是当编辑器使用, 编译还是icc处理的, ram不足吧

huangxiaolpbany 发表于 2023-1-5 09:25:05

看了编译后的内存分布,Float分配的是4个字节。不知道是不是溢出,但是发现插不插仿真器好像有区别。
最开始是没有出问题,后面是偶尔出问题,再后来就一直出问题。(没有改动任何程序的情况下)
是ICC编译的,RAM分配到09F1,是足够的。
       09B4_YAD2Pul
       09B8_XAD2Pul
       09BC_YAD2Spd
       09C0_XAD2Spd
       09C4_Sensor4AD
这是上面所涉及的变量的内存分布。

hpdell 发表于 2023-3-1 15:25:03

huangxiaolpbany 发表于 2023-1-5 09:25
看了编译后的内存分布,Float分配的是4个字节。不知道是不是溢出,但是发现插不插仿真器好像有区别。
最开 ...
(引用自8楼)

建议是用iar-avr 编译器,啥事木有
页: [1]
查看完整版本: 使用ICCAVR7.0+AVRSTUDIO4.19,Float全局变量数值变化