Mit einem Programm habe ich auf MSP430 das Problem, das es nach rund einer halben Stunde abstürzt, also der MC auf Eingaben von Außen nicht mehr reagiert. Deshalb hab ich des mehrmals mit dem Debuger C-Spy laufen lassen, aber beim abgestürzten Programm zeigt es nur die Basis-Register (SP, PC, R3 - R 15) ; die betreffende Stelle im Source Code wird nicht angezeigt (das Fenster ist nur weiß) und zu Registern wie ADC12IFG kommt nur ADC12IFG: Error[63]: Variable not active Also habe ich mir SP und PC angesehen, aber bei denen tut sich nicht viel: Entweder ist der SP fest auf 09E0 und PC wechselt nur von 055E zu 0562 und zurück (AM) oder der SP ist fest auf 09F0 und der PC fest auf 10 (irgendein LPM laut C-Spy). Was bedeutet das? Muss man für den IAR-Compiler noch in jede zweite Zeile ein nop einfügen?
Hi Spannungsspitzen und schlechte Abblockung kannst du ausschließen? Matthias
Ja, denn jetzt habe ich zur Sicherheit die betreffende Platine in das geerdete Gerät eingebaut in dem andere Software schon tagelang lief und nun habe ich den Absturz schon nach 21 Minuten.
Hi das heißt noch lange nicht das deine Platine korrekt gegen Ground Bounce und ähnliches geschützt ist. Wenn der Absturz aber immer nach gleicher zeit erfolgt würde ich auf einen Stacküberlauf (in einer selten aufgerufenen Routine) tippen. Matthias
Weil die Hardware schon seit Jahren produziert wird und die Rücklaufrate der ca. 100.000 Geräte nicht allzu groß ist, kann es nur die Software sein. Merkwürdig ist, dass der Absturz manchmal nach 21 Minuten, manchmal nach 31 Minuten oder nach über einer Stunde passiert. Ein Stack-Überlauf könnte zwar durch sowas eine rekursive Funktion passieren, aber merkt der C-Spy das denn nicht? Die Möglichkeit den Ablauf umzukehren bis zur letzten Stelle, bei der es noch kein Problem gab, hat C-Spy ja leider nicht und Debugen mit Ausgaben in Log-Dateien, so wie bei PC-Programmen üblich, geht ja leider nicht (weil der Flash-Speicher fast voll ist).
Also nach dem Disabeln vom ADC12 läuft es anscheinend stabil. Aber eigentlich kann das doch nicht sein, wenn am Ende von interrupt[ADC_VECTOR] void adc12 (void) immer mit ADC12IFG = 0; gecleart wird, oder? Auf Dauer kann ich das Disabeln auch nicht lassen, denn ich brauche den ADC12 auch um u. a. die OnChip-Temperatur zu messen.
Also nun habe ich das Programm mit aktiviertem ADC12, wobei das jeweilige ADC12MEMx ausgelesen wird, und es funktioniert stabil! Es ist also definitiv ein Bug vom IAR-Compiler, denn nach dem User's Guide wird durch das Auslesen eines ADC12MEMx nur das betreffende Interrupt-Flag gelöscht, aber das wurde auch schon bisher mit ADC12IFG = 0; erreicht (mit ADC12TOVIE und ADC12OVIE immer auf 0).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.