mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Crossworks mit optimiertem Code


Autor: Rangi Jones (rangi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,
ich habe das folgende nervige Problem beim Debuggen mit Crossstudio für 
ARM: die Speicheradressen der Befehle im optimierten Code sind nicht in 
der richtigen Reihenfolge. Das führt dazu, das man sich nicht sicher 
sein kann, das ein Breakpoint auch wirklich zuschlägt, wenn er das 
sollte.
Ich weiss, das ist im optimiertem Code immer ein Problem, aber wenn 
wenigstens der Code in der richtigen Reihenfolge stehen würde, das 
könnte schon helfen. Dann geht zwar in einigen Fällen der Zusammenhang 
zwischen C-Code und Assembler verloren, aber so isses auch nicht schön.
              btmp[1]+=ActRecord;
00011430   4B2F       ldr r3, [pc, #0x0BC]
00011434   781B       ldrb r3, [r3, #0x00]
0001143A   3330       adds r3, #0x30
0001143C   F88D3006   strb.w r3, [sp, #+0x006]
              SEND_BLOCK(btmp,3);
00011432   2103       movs r1, #0x03
00011436   F10D0005   add.w r0, sp, #0x00000005
00011440   4B2E       ldr r3, [pc, #0x0B8]
00011442   4798       blx r3
00011444   F0100FFF   tst r0, #0x000000FF
00011448   D14A       bne 0x000114E0
0001144A   E046       b 0x000114DA
Im Bsp ist die Adresse 32 nach der 3C. Ich verwende den GCC zum 
kompilieren und Crossworks nur zum Debuggen.
Kann man dem Crossworks das irgendwie abgewöhnen?
(und bitte nicht so dumme Kommentare wie: "Dann debug doch im 
unoptimiertem Code")

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das dürfte ein Fehler im Debugger sein, mit optimiertem oder nicht 
optimiertem Code kann das nichts zu tun haben.

Das ist Thumb-Code, nicht wahr?

Vielleicht versteht ja Crossworks auch nur die Debuginfos nicht, die 
Dein gcc erzeugt.

> Ich verwende den GCC zum
> kompilieren und Crossworks nur zum Debuggen.

Warum? Was nutzt denn Crossworks als Compiler, ist das nicht auch gcc?

Autor: Rangi Jones (rangi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das ist Thumb-Code, nicht wahr?
Ja, Thumb-Mode

> Warum? Was nutzt denn Crossworks als Compiler, ist das nicht auch gcc?
Crossworks hat den GCC, aber 1. nicht in der aktuellen Version und 2. 
passt das nicht in meine Toolchain. Das kann ich nicht umstellen. Da 
hängt noch viel mehr dran.

Im nicht-optimierten Code funktioniert das super - alles linear und 
aufgeräumt. Nur leider passt der unoptimierte Code nich mehr in Flash.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal, die einzelnen Optimierungsschritte selektiv abzuschalten, 
d.h. mit -fno-... anzugeben:
http://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/Optimi...

Gute Kandidaten wären solche wie -fno-reorder-blocks und 
-fno-schedule-insns. Nach der -O... Option.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun, wenn man sich den von Dir geposteten Code genau ansieht, dann 
scheint die Optimierung die beiden C-Code-Zeilen

              btmp[1]+=ActRecord;
              SEND_BLOCK(btmp,3);

zu einem Codeblock übersetzt zu haben, bei denen abwechselnd 
Instruktionen für die eine und für die andere Codezeile zuständig sind.

Der Debugger scheint aber die Instruktionen auf die zugehörigen 
Codezeilen zurückzuverteilen.

Bringt man das ganze von Hand in die richtige Reihenfolge, kommt das 
hier 'raus:
* 00011430   4B2F       ldr r3, [pc, #0x0BC]
# 00011432   2103       movs r1, #0x03
* 00011434   781B       ldrb r3, [r3, #0x00]
# 00011436   F10D0005   add.w r0, sp, #0x00000005
* 0001143A   3330       adds r3, #0x30
* 0001143C   F88D3006   strb.w r3, [sp, #+0x006]
# 00011440   4B2E       ldr r3, [pc, #0x0B8]
# 00011442   4798       blx r3
# 00011444   F0100FFF   tst r0, #0x000000FF
# 00011448   D14A       bne 0x000114E0
# 0001144A   E046       b 0x000114DA

(die Zeilen habe ich durch vorangestellte * bzw. # als zu den 
unterschiedlichen C-Codezeilen gehörig gekennzeichnet)

Wenn Du Deinen separat genutzten gcc dazu instruierst, ein Listing-File 
zu erzeugen, sieht das darin denn anders aus?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.