У меня есть счетчик для 16-битного поля, которое увеличивается / уменьшается с течением времени с помощью аппаратного периферийного устройства.
Я периодически выбираю его значение, чтобы сложить разницу в 32-битное поле.
Моя проблема заключается в обнаружении переполнения / недостаточного заполнения 16-битного поля при вычислении разницы.
Давайте рассмотрим пример:
В образце n-1 значение счетчика Vn-1 равно 65530.
В качестве образца n значение счетчика Vn равно 4.
Счетчик был увеличен на 10. Но разница (Vn - Vn-1) будет примерно равна 65529 (не уверен в точном значении).
Единственный способ обнаружить переполнение, которое я нашел, - это сравнить значение разности с фиксированным значением, превышающим максимальный прирост (я выбираю 10000).
Знаете ли вы решение для управления этим переполнением, не сравнивая с этим субъективным значением?
Вот пример кода:
static sint32 overallCount = 0;
sint32 diff;
static sint16 previousValue = 0;
sint16 currentValue;
currentValue = sampleValue();
diff = ((sint32) currentValue) - previousValue;
if(diff > 10000) {
diff -= 65536;
} else if ((-diff) > 10000) {
diff += 65536;
}
overallCount += diff;