У меня есть счетчик в 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;