I2C SMBUS滤波器功能损坏变量



我有一个简单的函数

#define AMB_FILTER 0.7f
int32_t fValue; (this is declared in the class header)
int32_t Ambient::filter(uint32_t raw)
{
    // If we have no preliminary fValue we don't need to calculate a filter
    if(fValue == -1)
    {
        fValue = raw;
        return fValue;
    }
    float y, yy;
    y = (1.0f - AMB_FILTER) * (float) raw;
    yy = AMB_FILTER * (float) fValue;
    fValue =  (int32_t) (y + yy);
    printf("filter raw %d y %f yy %f fValue %dn",raw, y, yy, fValue);
    return fValue; 
}

它的值是从Smbus读取的值,并返回一个用它接收到的最后值过滤的值。这是从printf语句

的输出
filter raw 454 y 136.200012 yy 317.799988 fValue 454
filter raw 454 y 136.200012 yy 317.799988 fValue 454
filter raw 454 y 136.200012 yy 317.799988 fValue 454
filter raw 455 y 136.500000 yy 317.799988 fValue 454
filter raw 455 y 136.500000 yy 317.799988 fValue 454
filter raw 455 y 136.500000 yy 317.799988 fValue 454
filter raw 455 y 136.500000 yy 317.799988 fValue 454
filter raw 455 y 136.500000 yy 317.799988 fValue 454
filter raw 454 y 136.200012 yy 317.799988 fValue 454
filter raw 455 y 136.500000 yy -731751040.000000 fValue -731750912
filter raw 455 y 136.500000 yy -512225632.000000 fValue -512225504
filter raw 455 y 136.500000 yy -358557856.000000 fValue -358557728
filter raw 455 y 136.500000 yy -250990400.000000 fValue -250990256
filter raw 454 y 136.200012 yy -175693184.000000 fValue -175693040

那么发生了什么?它如何仍然收到相同的输入,但突然发疯了?除此功能以外,我不会在任何地方设置fvalue。

我使这些变量(y和yy)非常内在地对该功能进行了内部化,因为我担心它们会以某种方式被修改或与其他东西相撞。但是现在他们完全是本地的,我不知道发生了什么。我正在使用C 类,所以无论如何都应该在自己的空间中。

编辑:实际上,如果我让它运行更长的时间,那么我保留的不同I2C芯片地址的变量也会损坏至-1075766188。到底是什么?

[t1] filter raw 454 y 136.200012 yy 317.799988 fValue 454
[t2] filter raw 455 y 136.500000 yy -731751040.000000 fValue -731750912

t1 t2 之间的某个时间 fValue的值被损坏了。yy的损坏是fValue损坏的结果。查找程序中的其他位置,以了解罪魁祸首。

  • 如果您不能使用valgrind,则在整个程序中撒上fvalue的理智检查。
  • 在例程中打印this的值。看看它是否变得不寻常。
  • Ambient打印其他成员变量的值。看看它们是否变得不寻常。
  • 尝试评论大量代码。从您的程序的1/2开始。如果该错误仍在那里,请评论其余部分的1/2。继续直到找到控制腐败的一条线。

关于它是如何损坏的,有很多可能性。也许您在某个地方放了一个野生的指针。也许您的写作超出了阵列的末尾。也许您正在使用先前销毁的Ambient

最新更新