www.mikrocontroller.net

Forum: Compiler & IDEs selbe Anweisung, unterschiedliche Auführungsdauer


Autor: Yaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
    debug31[0] = acos(((uint16_t)(OS*OS) + d123*d123 - (uint16_t)(US*US)) / (2 * OS * d123));
    debug31[0] = acos(((uint16_t)(OS*OS) + d123*d123 - (uint16_t)(US*US)) / (2 * OS * d123));
    debug31[0] = acos(((uint16_t)(OS*OS) + d123*d123 - (uint16_t)(US*US)) / (2 * OS * d123));
    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

Autor: Yaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt versucht, das Problem ganz gesondert nachzustellen, doch 
leider klappt das nicht... Anscheinend tritt es nur im Zusammenhand mit 
dem restlichen Programm auf...
Ein Überlauf von sonstwas kann es nicht sein, SRAM steht noch genügend 
zu Verfügung., außerdem ist das Ergebnis ja auch immer richtig...

Ich bin echt am Verzweifeln...

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Yaro,
schonmal an Deine Interrupts gedacht, die den "normalen Programmablauf" 
immer mal wieder kurzfristig unterbrechen und damit "indirekt 
verlängern"

Gruß
Frank

Autor: Yaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OMG......Wie blöd war ich.........
Natürlich liegts an einem Interrupt!

Ich bin nicht darauf gekommen, weil dort normalerweise kein Interrupt 
auftreten kann... Zu debug-Zwecken habe ich es aber verändert, weil mir 
AVR-Studio sonst zu lange rechnet!

Manchmal sieht man den Wald vor lauter Bäumen nicht!

Danke für deine Hilfe!

Gruß, Yaro

Autor: Gaast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte mal ein ähnliches Problem, nachdem ich im Simulator was am 
Non-Volatile-Memory-Controller verstellt hatte. (Das war aber ein 
ATxmega.) Die LPM-Instruktionen, die sin() und cos() verwendeten, 
brauchten dann plötzlich länger.

Wenn es nur im Zshg. mit dem restlichen Programm auftritt, lösche doch 
nach und nach das drumherum weg. Wenn es dann geht, weißte in welchem 
Bereich der Fehler ausgelöst wird.

Gruß

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yaro schrieb:
>> Ich habe eine sehr zeitkritische Anwendung und kann auf diese 52000
>> Takte kaum verzichten...
> Natürlich liegts an einem Interrupt!
Du solltest mal die Interruptroutine überarbeiten, wenn die so lange 
braucht... :-o

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.