Hallo Leute,
ich programmiere auf einem AVR mit AVR-GCC und debugge mit AVR-Studio4
nun bin einem echt heimtückischen Bug in meinem Programm auf der Spur...
Ich habe bemerkt, dass eine meiner Funktionen manchmal viel zu lange
dauert, um berechnet zu werden.
Klar, kann passieren, dachte ich, schließlich wird sie ja immer mit
unterschiedlichen Werten gespeist.
Nun wollte ich gucken, bei welcher Art von Werten die Funktion Probleme
bekommt, habe aber überhaupt keine Systematik finden können.
Habe eine acos Funktion in meiner Funktion. Es scheint, als ob hier der
Bug sitzt...
Zufällig bin ich darauf gestoßen, dass selbst wenn ich in meinem Prog
acos mit den Selben Werten lade, es manchmal (aber eher selten) statt
4000 Takte 56000 Takte braucht! Das Ergebnis ist dabei immer richtig.
Habe daraufhin versucht das Nachzustellen:
habe an der Stelle, wo das auftritt folgendes gemacht:
1 | debug31[0] = acos(((uint16_t)(OS*OS) + d123*d123 - (uint16_t)(US*US)) / (2 * OS * d123));
|
2 | debug31[0] = acos(((uint16_t)(OS*OS) + d123*d123 - (uint16_t)(US*US)) / (2 * OS * d123));
|
3 | debug31[0] = acos(((uint16_t)(OS*OS) + d123*d123 - (uint16_t)(US*US)) / (2 * OS * d123));
|
4 | debug31[0] = acos(((uint16_t)(OS*OS) + d123*d123 - (uint16_t)(US*US)) / (2 * OS * d123));
|
d123 ist ein float, alles andere sind Konstanten.
Manchmal, nicht systematisch, braucht eine dieser Rechnungen 56000
Takte.
Woran könnte das liegen?
Ich habe eine sehr zeitkritische Anwendung und kann auf diese 52000
Takte kaum verzichten...
Gruß, Yaro