Forum: Mikrocontroller und Digitale Elektronik Falsche Quelltextposition beim Debuggen


von Silvio G. (technofreak)


Angehängte Dateien:

Lesenswert?

Hallo

hat jemand eine Ahnung, woran es liegen kann, dass beim Debuggen mit dem 
Pickit3 falsche Stellen im Quelltext angezeigt werden?

Habe schon mehrere Sachen getestet. Neustart von MPLAB, Neustart PC, 
Pickit an anderem USB-Anschluss. Nichts hat geholfen.

Nach einen Reset des µC steht nach ca. 3 Einzelschritten der grüne Pfeil 
mitten in einem Unterprogramm. Bei weiteren Einzelschritten bleibt er 
teilweise auch auf Leerzeilen stehen.

Verwendete Umgebung:
Laptop: Win7
MPLAB 8.88
HI-TECH C für PIC10/12/16 Ver. 9.83

Gibt es da eine Erklärung für? Wäre scön wenn ihr mir helfen könntet.
Die c-Datei ist mit bei, soll eine Garagentorsteuerung werden.

Silvio

Warum wird bei der Vorschau nicht angezeigt dass die Datei ängehängt 
wurde? Egal, nu gibts die doppelt.

von Thomas E. (thomase)


Lesenswert?

Silvio G. schrieb:
> hat jemand eine Ahnung, woran es liegen kann, dass beim Debuggen mit dem
> Pickit3 falsche Stellen im Quelltext angezeigt werden?
>
> Gibt es da eine Erklärung für? Wäre scön wenn ihr mir helfen könntet.
> Die c-Datei ist mit bei, soll eine Garagentorsteuerung werden.
Das liegt an der Optimierung. Dadurch entstehen im Maschinencode 
Konstruktionen, die sich so im C-Quelltext gar nicht wiederfinden. Und 
da setzt er den Breakpoint dann irgendwie oder gar nicht. Oder springt 
irgendwo hin, wohin du es nun absolut nicht vermutest, weil er 
irgendwelchen Code zusammengefasst hat.
Wenn du die Optimierung abschaltest, ist das vorbei. Dann übersetzt der 
Compiler den Quelltext Zeile für Zeile. Aber das Ergebnis will niemand 
haben.

mfg.

von holger (Gast)


Lesenswert?

Compiler Optimierung abgeschaltet?

von Silvio G. (technofreak)


Lesenswert?

Hallo

nee die Optimierung hab ich nicht abgestellt. Steht in der 
Standardeinstellung für die Lite-Version.

Silvio

von Ralf G. (ralg)


Lesenswert?

Thomas Eckmann schrieb:
> Das liegt an der Optimierung.

Ist mir noch nicht aufgefallen (allerdings AVR-Studio).
Aber:
Evtl. wird gerade eine Funktion in einer Lib aufgerufen, da hast du 
keinen Quelltext dazu...

Kannst du durch den ASM-Code gehen?

von Silvio G. (technofreak)


Angehängte Dateien:

Lesenswert?

Hallo

hab ich noch nicht getestet, geht auch nicht mal schnell, da die 
Schaltung momentan grad nicht in Reichweite ist. Aber die ersten 30 
Anweisungen sind nur Zuweisungen an einzelne Bits eines Registers oder 
ganze Register.

Habe gerade mal den ASM-Code und das Disassambly Listing angeschaut. Der 
Controller macht was er soll, aber ich weiß nicht wo er die Befehle her 
hat.

Im Programmspeicher steht folgendes:

Adresse Code
000     NOP
001     GOTO 0x18
...
018     CLRF 0x8        \ Woher kommt das?
019     GOTO 0x4FF      /
01A     MOVLB 0x1       \
01B     BCF 0x19, 0x7   | Das ist das was auch im Disassambly Listing 
steht.
01C     BSF 0x19, 0x6   | Das wäre auch richtig
01D     BSF 0x19, 0x5   /

Die Stelle 0x4FF ist auch genau die Stelle wo er bei Debuggen 
hinspringt. Das sieht mir so aus, als wenn er dort die Variablen 
initialisiert.

Aber warum hat er vor ein paar Änderungen (endschalterzustand war 1 
statt 0, dementsprechend war in tasten_lesen in der Überprüfung für 
ende_oben und ende_unten die Prüfung für aktiv und inaktiv umgedreht) 
das noch richtig gemacht? Da sprang er nach dem Reset direkt zum ersten 
Befehl in der main.

Silvio

von Thomas E. (thomase)


Lesenswert?

Silvio G. schrieb:
> Aber warum hat er vor ein paar Änderungen (endschalterzustand war 1
> statt 0, dementsprechend war in tasten_lesen in der Überprüfung für
> ende_oben und ende_unten die Prüfung für aktiv und inaktiv umgedreht)
> das noch richtig gemacht? Da sprang er nach dem Reset direkt zum ersten
> Befehl in der main.
Hier geht es nicht um "richtig" oder "falsch". Macht das Programm, was 
es soll? Ja. Dann ist es doch egal, wie der Compiler dahin kommt.

Rechne 3 * 7.
Du könntest jetzt wirklich multiplizieren. Du könntest aber auch
7 + 7 + 7 rechnen. Oder 3 + 3 + 3 + 3 + 3 + 3 + 3. Oder, weil du vorhin 
schon 2 * 7 ausgerechnet hast und das Ergebnis noch weisst, 14 + 7. 
Spätestens da steigt dann kein Aussenstehender mehr durch, wie du darauf 
kommst, das so auszurechnen.
So ähnlich macht das ein Compiler auch. Die Optimierung fängt da an, wo 
die Weisheit, der sich selbst überschätzenden ASM-Friggeler endet. Das 
ist nicht einfach da durchzusteigen.
Und warum macht der Compiler das? Weil es Laufzeit und/oder Speicher 
spart. Auch wenn es Leute gibt, denen das noch gar nicht aufgefallen 
ist.
Compilier das mal ohne Optimierung. Dann passt das Programm 
möglicherweise gar nicht mehr in deinen Controller.

mfg.

von Jürgen S. (Firma: privat) (jschmied)


Lesenswert?

Hallo!

Die PIC bleibt beim Debuggen "aus dem Lauf" meistens nicht genau auf dem 
Breakpoint stehen, da bereits der nächste Befehl in der Pipeline und 
bereit zur Ausführung ist. Das ist auch irgendwo dokumentiert. Ggf. ein 
NOP davor einfügen und den Breakpoint auf das NOP setzen. Ansonsten ist 
man oft schon in der aufgerufenen Funktion drin.
Beim "Single Step" passiert das meiner Erfahrung nach nicht.

vg

Jürgen

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.