Hallo Leute! Ich habe hier ein sehr merkwürdiges Problem: Bei der Programmierung eines PIC18F452 mit der MPLAB-IDE und dem MCC18-Compiler werden Benutzer-Variablen plötzlich von Systemfunktionen wie z.B. "t0write.c" überschrieben. Der PIC ist über RS-232 mit einem Touch-Display verbunden. Über ein Timer-Interrupt wird das Display regelmäßig abgefragt und bei Bedarf Daten von diesem mithilfe eines USART-Interrupts empfangen. Mit dem PIC soll so eine recht komplexe Menüführung realisiert werden. Nach kurzer Bedienung stürtzt plötzlich die Software des PICs ab. Beim Debuggen der Software über die ICSP-Schnittstelle, stelle ich fest, dass wichtige Benutzervariablen überschriben wurden. Durch das setzen von Data-Breakpoints auf die betroffenen Stellen im Fileregister stelle ich fest, dass die Variablen von verschiedenen Systemfunktionen überschrieben werden, die von Absturz zu Absturz variieren. -> in "C:\MCC18\src\pmc_common\Timers\t0write.c" 6CDA CFDB MOVFF PLUSW2, POSTINC2 -> in "C:\MCC18\src\traditional\stdclib\sprintf.c" 68D8 CFD9 MOVFF FSR2L, POSTINC1 -> viele andere Stellen mit änlichen befehlen Manchmal kommt es auch vor, dass der PIC bei betätigen von Touch-Buttons unerwartet resetet. Ich beschäftige mich nun schon seit langem mit diesem misteriösen Verhalten, aber ich konnte noch keine Lösung finden. Wenn ich zusätzlichen Code in das MPLAB-Project einbinde, der aber nicht ausgeführt wird, tritt das Probem gehäuft auf. Könnte es sich um einen Compiler-Fehler handeln? Ich habe den Code bereits ausgibig nach Buffer-Overflows oder Ähnlichem abgesucht. Habt ihr eine Idee zur Lösung des Problems? Liebe Grüße Julian
Zu wenig Informationen um da was sagen zu können. Die beiden von Dir gezeigten Assembler-Zeilen sehen OK aus. Die gehören sehr wahrscheinlich zum Prolog oder Epilog der entsprechenden Funktionen. Diese werden vom Compiler automatisch eingefügt um Stack/Framepointer zu sichern/wiederherzustellen, Funktionsargumente vom Stack zu holen, lokale Variablen (die auf dem Stack landen) zuzuweisen, etc. Hast Du ein passendes Linkerfile benutzt, für den passenden Typ des PIC? Sind dort die Bereiche für Debug und Stack passend definiert? Hast Du im Code selber irgendwelche expliziten Adressangaben für Variablen die dann ggf. den Stack überschreiben? Irgendwelche Pointer die Du benutzt und bei Übergabe an eine Funktion falsch angibst? Wie sieht es mit Daten im RAM und Flash aus, alles entsprechend definiert so das dort keine Verwechslung stattfinden kann? (Das ist ein ziemlich beliebter Fehler. Daten werden im Flash abgelegt mittels des ROM Qualifiers, bei Funktionsargumenten fehlt dieser Qualifier dann aber -> Falsche Adressen werden angesprochen). Ist dein Code Super-Duper-Geheim das Du ihn nicht als Anhang dazugibst? Unsere Glaskugeln sind derzeit nämlich alle in Reparatur... Grüße, Chris
Julian schrieb: > Ich habe den Code bereits ausgibig nach Buffer-Overflows oder Ähnlichem > abgesucht. Das Problem sitzt mit hoher Wahrscheinlichkeit vor dem Bildschirm. > Könnte es sich um einen Compiler-Fehler handeln? Ja, könnte, ist aber selten der Fall. Schau doch mal im Simulator wann das ganze passiert. Dann Trace den Teil schrittweise. Julian schrieb: > Manchmal kommt es auch vor, dass der PIC bei betätigen von Touch-Buttons > unerwartet resetet. Würde ich erstmal als andere Baustelle und somit später behandeln.
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.