Forum: Mikrocontroller und Digitale Elektronik Auf Arduino erstelltes Programm in C und Assembler anschauen


von Christine (Gast)


Lesenswert?

Wenn ich es richtig verstanden habe, ist die Arduino Software eine 
C-Biliothek, die dann in Maschinensprache kompiliert wird. Ich habe ein 
Programm für den Arduino geschrieben. Besteht zu Lernzwecken die 
Möglichkeit, das auf die Basisbefehle von C übersetzte und das daraus 
erzeugte Assembler Programm zu sehen?

Ich habe Microcontroller auf der MPLAB Entwicklungsumgebung von 
Microchip kennen gelernt. Dort ist zumindest bei Abschalten der 
Compiler-Optimierung hinter jedem einzelnen C-Befehl aufgeführt, wie er 
in Assembler übersetzt wurde. Mit AVR C und Assembler habe ich noch 
keine Erfahrung.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Christine schrieb:
> Wenn ich es richtig verstanden habe, ist die Arduino Software eine
> C-Biliothek

Arduino ist C++, und es ist mehr als nur eine Bibliothek; der Code wird 
auch noch etwas umgebaut (leider).

Christine schrieb:
> das auf die Basisbefehle von C übersetzte
Bibliotheken werden nie auf "Basisbefehle" umgesetzt. Da wird direkt 
Maschinencode draus.

Arduino speichert beim Kompilieren unter "/tmp/arduino_build_xxx/" 
temporäre Dateien. Unter sketch/sketchname.ino.cpp findet sich 
vermutlich das, was der Compiler sieht. Unter sketchname.ino.elf findet 
sich das Kompilat. Das kann man mit
1
/pfad/zur/Arduino/IDE/hardware/tools/avr/bin/avr-objdump -d -S -C sketchname.ino.elf
disassemblieren, um den erzeugten Code zu sehen. Das "-S" bewirkt die 
Anzeige der C++-Zeilen. Da Arduino aber immer mit Optimierungen 
kompiliert, ist das ziemlich durcheinander und m.E. mehr verwirrend als 
hilfreich, weshalb ich das nie nutze. Das "-C" bewirkt die lesbare 
Anzeige der C++-Symbole (demangling).

von Cornelius (Gast)


Lesenswert?

Man könnte eventuell auch in der "platform.txt"

/pfad/zur/Arduino/IDE/hardware/platform.txt

die GCC-Optionen für die Erzeugung der Assembler-List-Files anhängen:
https://www.systutorials.com/240/generate-a-mixed-source-and-assembly-listing-using-gcc/

von Einer K. (Gast)


Lesenswert?

Hier habe ich das mal beschrieben, wie man das automatisieren kann, ohne 
die originale platform.txt ändern zu müssen.
Beitrag "Re: Welche Ressourcen nutzt die Arduino Software?"

So wird dann in dem Build Verzeichnis, bei jeder Kompilation, eine *.asm 
und eine *.map Datei erzeugt.

von Adam P. (adamap)


Lesenswert?

Such mal nach: "avr disassembler"

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Adam P. schrieb:
> Such mal nach: "avr disassembler"

Gefunden:

Niklas G. schrieb:
> Das kann man mit [...] avr-objdump -d -S -C sketchname.ino.elf disassemblieren

von Adam P. (adamap)


Lesenswert?

Niklas G. schrieb:
> Niklas G. schrieb:
>> Das kann man mit [...] avr-objdump -d -S -C sketchname.ino.elf disassemblieren

Aber nur wenn er eine *.elf Datei hat.

Ich habe Ihm den Weg vorgeschlagen: HEX -> ASM.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Adam P. schrieb:
> Aber nur wenn er eine *.elf Datei hat.

Die gibt Arduino raus.

Adam P. schrieb:
> Ich habe Ihm den Weg vorgeschlagen: HEX -> ASM.

Ich hab nix von HEX gelesen... Ohne Funktionsnamen wird das ganze noch 
lästiger.

von Adam P. (adamap)


Lesenswert?

Niklas G. schrieb:
> Die gibt Arduino raus.

Also ich habe hier ein Arduino-Projekt und da finde ich keine *.elf

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Adam P. schrieb:
> Also ich habe hier ein Arduino-Projekt und da finde ich keine *.elf

Niklas G. schrieb:
> Arduino speichert beim Kompilieren unter "/tmp/arduino_build_xxx/"
> temporäre Dateien. [...] Unter sketchname.ino.elf findet
> sich das Kompilat.

von Einer K. (Gast)


Lesenswert?

Adam P. schrieb:
> Niklas G. schrieb:
>> Die gibt Arduino raus.
>
> Also ich habe hier ein Arduino-Projekt und da finde ich keine *.elf

Dann schaust du nicht in die richtige Ecke!

Ausführliche Meldungen aktivieren.
In den Meldungen erscheint das Build Verzeichnis.
Dort, und nur dort.

von Adam P. (adamap)


Lesenswert?

OK, wieder was dazu gelernt.

Ich programmier eigentlich kein Arduino, deshalb wusste ich es nicht.

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.