- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 32

Thema: Unerklärliche Programmfehler

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.08.2008
    Ort
    Graz
    Beiträge
    521

    Unerklärliche Programmfehler

    Ich habe immer wieder mit dem Phänomen zu kämpfen dass bei einer kleinen Änderung in einer Funktion auf einmal das ganze Programm nicht mehr funktioniert. Und das oft obwohl bei normalen Ablauf diese eine Funktion erst spät aufgerufen wird.
    Ein Beispiel: in einer Fahrfunktion wollte ich ein Timeout einbauen, dazu habe ich die globale Zeit auf eine Änderung überprüft. Der Robi hat dann nach ca 10s Fahrzeit mit Resets angefangen, irgendwelche anderen Funktionen aufgerufen, und zum Schluss auf gar nichts mehr reagiert. Diese eine Fahrfunktion wird erst nach ca 30 Minuten Fahrzeit aufgerufen, warum kann die also gleich nach dem Einschalten solche Störungen verursachen?
    Inzwischen wurde das Timeout anders gelöst, das Programm erheblich erweitert, und funktioniert so immer noch.

    Gestern gab es wieder so ein Problem, zur besseren Drehzahlregelung habe ich die schon vorhandene Funktion der Drehzahlüberwachung auch in die vorhande Wartefunktion eingebaut. (Der Robi wartet vor jeder Richtungsänderung 0.5s). Und wieder hat das Programm nicht mehr richtig gearbeitet, es wurde alle paar Sekunden immer wieder von vorne gestartet.

    Die Überwachung in der Wartefunktion musste ich rausnehmen, dafür wurde in Drehzahlregelung ein PID Regler eingebaut der auch einiges an Variablen und Speicherplatz benötigt, und es funktioniert perfekt.

    Woher kann so ein Verhalten kommen?
    Ist der Atmega schon zu Tode geflasht??
    Oder macht der Compiler manchmal einfach Mist??

    Das Programm ist zu umfangreich um es komplett im Simulator laufen zu lassen (wie GPS, Kompass und Odometrie simulieren?), und wenn ich Teile entferne ist der Simulation nicht mehr vergleichbar und damit sinnlos.

    Es geht um einen Atmega32, AVR Studio 4.17, WinAVR-20090313.
    Program: 24970 bytes (76.2% Full)
    Data: 1366 bytes (66.7% Full)
    Build succeeded with 0 Warnings...

    Es wäre gut diese Probleme lösen oder erklären zu können, um nicht immer wieder umständliche Lösungen für eigentlich einfache Aufgaben finden zu müssen.

    LG!
    alles über meinen Rasenmäherroboter (wer Tippfehler findet darf sie gedanklich ausbessern, nur für besonders kreative Fehler behalte ich mir ein Copyright vor.)

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Meine Glaskugel ist kaputt (und du hast keinen Code gepostet), daher bleiben nur generische Ansätze: Ist dein RAM vollgelaufen? Wenn der Stack mit den statischen Daten kollidiert, können interessante Dinge geschehen ...

    Zur Fehlersuche wirst du wohl oder übel versuchen müssen, so lange Komponenten zu deaktivieren bis du den Fehler eingekreist hast ...

    mfG
    Markus

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.08.2008
    Ort
    Graz
    Beiträge
    521
    Ein riesen Code wird wenig nutzen da man lange braucht bis man den versteht und dann noch die eine kleine Variable finden muss, die den Ausschlag zwischen funktionierenden Code oder nicht gibt.

    Den Fehler habe ich immer gefunden, einmal war es eine neue Variable, einmal eine zusätzliche IF Abfrage, oder letztens eine schon vorhandene Funktion an anderer Stelle zusätzlich eingebunden.
    Und wie gesagt, das war oft an Programmstellen die beim Start nicht aufgerufen werden.
    Nur wenn eine bestimmte If Abfrage das Programm komplett zum Absturz bringt, und ich andererseits jede Menge anderen Code dazupacken kann ohne das etwas passiert, das kann ich logisch nicht nachvollziehen.

    Aber vielleicht ist das jemanden schon untergekommen?

    Wie kann man überprüfen ob der RAM voll ist? Gibt es einen Befehl der mir das im laufenden Betrieb liefert?

    LG!
    alles über meinen Rasenmäherroboter (wer Tippfehler findet darf sie gedanklich ausbessern, nur für besonders kreative Fehler behalte ich mir ein Copyright vor.)

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Es gibt einen Trick: Dynamischen RAM-Verbrauch ermitteln (RN-Wissen)

    Insgesamt klingt das etwas chaotisch, von Zeit zu Zeit empfiehlt es sich, den Code etwas aufzuräumen und durchzustrukturieren

    mfG
    Markus

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Hallo,
    ein ähnliches Phänomen hatte ich auch schon mit einem PIC Controller. Ich habe völlig blödsinnigen Code eingefügt, der nichtmal aufgerufen wurde und plötzlich lief mein Programm nicht mehr. Dann hab ich den Blödsinn wieder ausgeklammert und es lief. Es gab überhaupt keinen Zusammenhang zwischen dem unbenutzten Code. Die Ursache war, man sollte es nicht glauben eine "schlechte" Abblockung am Prozessor. Durch den zusätzlichen Programm-Code hat sich natürlcih der angesprungene Code im Flash Programmspeicher verschoben. Da der Flash in sogenannte Planes unterteilt ist, zieht der Prozessor beim aktivieren des Speichers mehr Strom, bei einer ungenügenden Abblockung springt er in die Wüste oder führt einen Reset aus. Vielleicht hast Du ein ähnliches Problem Versuche mal möglichst dicht an der Versorgungsspannung des Prozessors mit einem zusätzlichen Kondensator abzublocken Also zwischen Plus und Masse. Bei mir reichten 100nF.
    So unglaublich es klingen mag, ich habe eine Woche im Programmcode gesucht und das eigentliche Problem war ein 100nF Kondi etwas zu weit entfernt vom den Prozssorpins.
    mfg. Siro

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.11.2003
    Beiträge
    1.112
    Es kann sein, dass eine Optimierung des Compilers anders ausgeführt wird, wenn der Code fehlt. Das würde bedeuten, dass es mindestens einen weiteren Fehler gibt, der mit dem zusätzlichen Code nicht ins Gewicht fällt, also unsichtbar bleibt.
    Interrupts können ähnliche Probleme gelegentlich auslösen, weil nicht immer klar ist, wann genau sie eintreten.
    Wenn es am Compiler läge, würdest Du im Netz sehr wahrscheinlich etwas darüber erfahren.
    Da es keine Warnungen gibt, kann man einige Dinge auschließen.
    Aber eigentlich und logischerweise kann es natürlich nicht sein, dass ein Stück fehlerhafter Code ein Problem macht, wenn er nicht ausgeführt wird (sofern das restliche Programm und die Hardware fehlerfrei ist...). Und weil das so eindeutig ist, würde ich daran zweifeln, dass dieser Code wirklich nicht ausgeführt wird nach 10s.
    Ich kenne ähnliche Probleme. Man hat eine Annahme, zB der Code würde nicht ausgeführt und sucht die Fehler überall, obwohl es höchst unlogisch ist. Am Ende stellt sich heraus, die Annahme war falsch und damit ist auch nichts mehr unlogisch.
    Gruß

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Dein RAM ist auch schon zu 66,7% belegt. Wenn dann noch einige Variable dazu kommen dann kann der Stack schon mal überlaufen.
    Vielleicht kannst du da etwas verlegen, LCD-Texte im Flash oder im EEPROM speichern z.B.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.08.2008
    Ort
    Graz
    Beiträge
    521
    Den dynamischen Ram Verbrauch zu ermitteln hab ich grad versucht, geht nicht da das normale Fahrprogramm nicht mehr korrekt ausgeführt wird.

    Der Flash war schon mal voller bevor ich mit der Option -s compilieren musste, und es ist ein Kondensator am Controller.

    Das bei manchen Fehlern der betreffende Code sicher nicht ausgeführt werden sollte ist sicher. Denn eine Änderung bei zB Spiralfahrt kann sich nicht auf die normale Fahrt auswirken, denn er ruft diese nur in bestimmten Situationen auf, verlässt sie erst wenn er damit fertig ist, und das dauert ein paar Minuten.
    Aber ich gehe davon aus dass er den Speicher für die Funktionen erst im Ram reserviert wenn die Funktion aufgerufen wird, deswegen erwarte ich ein Fehlverhalten genau dann, und nicht schon von Anfang an.

    LG!
    alles über meinen Rasenmäherroboter (wer Tippfehler findet darf sie gedanklich ausbessern, nur für besonders kreative Fehler behalte ich mir ein Copyright vor.)

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.11.2003
    Beiträge
    1.112
    Ist es nicht so, dass in den RAM zu beginn auch unter anderem volatile Variablen geladen werden? Wenn Dein zusätzlicher Code auf Daten in einer Headerdatei oder sonstigen zugreifen "würde", kann es sein, dass dort ein Laden stattfindet, was ohne den Code nicht stattfinden würde. Bin aber nicht sicher.
    Gruß

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Also globale und volatile Variablen werden gleich zu beginn geladen und bleiben zumindest als Platz reserviert.
    Somit auch von Code der nicht abgerufen wird.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test