функция фильтра 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 %d\n",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. Что за черт?

0

Решение

[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,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]