Forum: Mikrocontroller und Digitale Elektronik MPLAB PIC18F: Variablen werden von Systemfunktionen überschrieben


von Julian (Gast)


Lesenswert?

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

von Christian K. (Firma: Atelier Klippel) (mamalala)


Lesenswert?

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

von Der Rächer der Transistormorde (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.