Eleganter geht es in C, also ohne sich die Mühe machen zu müssen, den
Code nachher zu prüfen, wenn man als i und iAlt 16 bit Werte nimmt und
als Regelabweichung 8 bit Werte. Dann hat man dafür gesorgt, dass
maximal 128 als Regelfehler auftreten kann. So kann man Grenzwerte von i
angeben, ab denen man abschneidet, bei denen sicher noch kein Überlauf
passiert.
i = iAlt + Regelabweichung;
if ((i < 32639) && (i > -32639))
iAlt = i;
else
i = iAlt;
Wenn man aber darauf angewiesen ist, dass i und Regelabweichung vom
gleichen Typ sind, sollte man tatsächlich den Overflow der ALU
auswerten, andernfalls wird die Berechnung, ob ein Überlauf auftreten
wird, recht aufwendig.
Man müsste dazu erst ausrechnen, wieviel Platz noch in i nach oben und
unten ist bis zum Überlauf und dann abfragen, ob die Regelabweichung
größer ist, als dieser Wert. Das ganze mit Fallunterscheidung für
positive und negative Werte.
Auf DSPs hat man dieses Problem im Übrigen meist nicht, denn die meisten
können saturiert addieren, d.h. das Register läuft nicht über, sondern
wird nur auf den Maximalwert gesetzt, wenn man zu viel draufaddiert.
Peter