Hallo, ich baue gerade eine neue Lib, zusätzlich zu bestehenden Libs, die alle eingebunden werden. Mit 2 Methoden in der neuen Lib ist noch alles i.O. Füge ich eine Dritte hinzu erhalte ich: C:\avrToolchain\avr-gcc-10.2.0_mingw64_binutils2.35/bin/avr-objdump: DWARF error: invalid abstract instance DIE ref Kann es sein das avr-objdump ab einer gewissen Codegröße bzw. Anzahl an Libs mit virtuellen Methoden nicht mehr klar kommt? Der Compiler selbst meckert nicht. Flash 9200 und RAM 670 Bytes. Controller ist ein AVR128DB48. Die DWARF Meldung hatte ich sonst immer sporadisch. Beim erneuten kompilieren war sie dann weg. Diesmal erscheint sie immer. Muss ich mir Sorgen machen?
:
Verschoben durch Moderator
avr-objdump hat doch etliche Parameter. Ist da nichts dabei was mehr Informationen gibt? Was macht z.B.: --dwarf[=...] ?
Hallo, hmm, avr-objdump direkt in der Konsole aufgerufen (ohne .bat) funktioniert. Verstehe ich nicht. Die Option Bsp. --dwarf[=rawline] kennt es nicht, ist unbekannt. -W funktioniert jedoch.
Veit D. schrieb: > avr-objdump direkt in der Konsole aufgerufen (ohne .bat) > funktioniert. Kann es sein, dass durch viele Kerne und Parallel Abarbeitung der Prozesse etwas anderes noch nicht fertig ist? Das würde das gelegentliche Auftreten des Fehlers erklären. Setz doch einfach mal eine Sekunde Pause vor avr-objdump in der .bat .
Hallo, habe den Code zusammengelegt und Einzeiler zum besseren auskommentieren gemacht. Wenn ich die Methode deleteOVF() auskommentiere kommt kein DWARF Error. Damit man einmal sieht um welchen Codesyntax es sich handelt. Am Ende möchte ich das tcb Array nutzen um über alle Timer mittels for Indexdurchlauf drüberzugehen. Ich probiere einmal die Pause.
1 | #pragma once
|
2 | |
3 | #define INLINE inline __attribute__((always_inline))
|
4 | |
5 | namespace AVR128DB |
6 | {
|
7 | namespace TCB |
8 | {
|
9 | namespace
|
10 | {
|
11 | using Register = volatile uint8_t *; |
12 | |
13 | #if defined(__AVR_AVR128DB48__)
|
14 | #include <AVR128DB48_TCBnRegister.h> |
15 | #else
|
16 | #error "Your board has no AVR128DB48 controller!".
|
17 | #endif
|
18 | constexpr Register getCTRLA(const uint8_t n) { |
19 | return (Register) (baseAddr[n].baseAddr + addrOffset.ctrla); |
20 | }
|
21 | constexpr Register getINTFLAGS(const uint8_t n) { |
22 | return (Register) (baseAddr[n].baseAddr + addrOffset.intflags); |
23 | }
|
24 | |
25 | template<const uint8_t numberTCBn> |
26 | class Timer |
27 | {
|
28 | public:
|
29 | void INLINE enable() { *getCTRLA(numberTCBn) = *getCTRLA(numberTCBn) | TCB_ENABLE_bm; } |
30 | void INLINE disable() { *getCTRLA(numberTCBn) = *getCTRLA(numberTCBn) & ~TCB_ENABLE_bm; } |
31 | void INLINE deleteOVF() { *getINTFLAGS(numberTCBn) = *getINTFLAGS(numberTCBn) | TCB_OVF_bm; } |
32 | };
|
33 | |
34 | class TimerInterface // Interface |
35 | {
|
36 | public:
|
37 | virtual void enable() = 0; |
38 | virtual void disable() = 0; |
39 | virtual void deleteOVF() = 0; |
40 | };
|
41 | |
42 | template<uint8_t n> |
43 | class Tcb : public TimerInterface |
44 | {
|
45 | private:
|
46 | Timer<n> tcb; |
47 | |
48 | public:
|
49 | virtual void enable() { tcb.enable(); } |
50 | virtual void disable() { tcb.disable(); } |
51 | virtual void deleteOVF() { tcb.deleteOVF(); } |
52 | };
|
53 | |
54 | TimerInterface *tcb[4] = |
55 | {
|
56 | new Tcb <0>(), // TCB0 |
57 | new Tcb <1>(), // TCB1 |
58 | new Tcb <2>(), // TCB2 |
59 | new Tcb <3>(), // TCB3 |
60 | };
|
61 | }
|
62 | }
|
Hallo, deine Erklärung mit den mehreren Kernen usw. macht erstmal Sinn. Pause einbauen klappt erstmal nicht wie gedacht, wird einfach ignoriert. Die Arduino IDE ruft eine Textdatei mit "Hunderten" Compilerparametern zum kompilieren auf. Darin steckt am Ende ein Aufruf für avr-objdump der sich mittels .bat die Info zum Pfad der kompilierten Dateien im Temp Ordner holt. Unterbricht man das anderweitig ist die Pfadinfo weg. Mal sehen ob mir dazu eine Lösung einfällt. Der Weg scheint der richtige zu sein, wenn es separat in der Konsole funktioniert. Danke schon einmal.
Hallo, passend zum erneut aufgetauchten DWARF Problem Beitrag "Re: Arduino Uno Serial stört Timer1 Interrupts?" mach ich einmal hier weiter. Diesmal kann ich die .elf Datei auch nicht nachträglich in der Konsole fehlerfrei disasemblieren. Erhalte genau die gleichen Fehler als wenn das die Arduino IDE selbst gleich mit erledigt. avr-gcc 10.2 & binutils 2.35 Nehme ich avr-objdump.exe aus meiner avr-gcc 10.1 & binutils 2.34 Toolchain gibts auch bei mir keine Fehler. Deswegen schließe ich ein Timing Problem mit den CPU Kernen/Threads vorläufig aus. Ich werde im laufe des Tages noch eine Toolchain mit gcc 10.2 und binutils 2.34 bauen und nochmal testen.
Hallo, erste Gegenprobe mit avr-gcc-10.2.0 & binutils 2.34 zeigt keine Disasemblierungsfehler. Egalb ob Wire.h inkludiert ist oder nicht.
Hallo, zweite Gegenprobe mit avr-gcc-10.1.0 & binutils 2.35 zeigt erneut DWARF Errors wenn Wire.h inkludiert wird. 'grübel' Erste Erkenntnis die sich gefestigt hat ist. Es gibt ein Problem im Zusammenspiel der Wire.h mit binutils v2.35.
1 | C:\avrToolchain\avr-gcc-10.1.0_mingw64_binutils2.35/bin/avr-objdump: DWARF error: could not find variable specification at offset 15ee |
2 | C:\avrToolchain\avr-gcc-10.1.0_mingw64_binutils2.35/bin/avr-objdump: DWARF error: could not find variable specification at offset 15fa |
3 | C:\avrToolchain\avr-gcc-10.1.0_mingw64_binutils2.35/bin/avr-objdump: DWARF error: could not find variable specification at offset 1606 |
4 | C:\avrToolchain\avr-gcc-10.1.0_mingw64_binutils2.35/bin/avr-objdump: DWARF error: could not find variable specification at offset 1612 |
5 | C:\avrToolchain\avr-gcc-10.1.0_mingw64_binutils2.35/bin/avr-objdump: DWARF error: could not find variable specification at offset 161e |
6 | C:\avrToolchain\avr-gcc-10.1.0_mingw64_binutils2.35/bin/avr-objdump: DWARF error: could not find variable specification at offset 162a |
7 | C:\avrToolchain\avr-gcc-10.1.0_mingw64_binutils2.35/bin/avr-objdump: DWARF error: could not find variable specification at offset 1636 |
8 | C:\avrToolchain\avr-gcc-10.1.0_mingw64_binutils2.35/bin/avr-objdump: DWARF error: could not find variable specification at offset 1642 |
9 | C:\avrToolchain\avr-gcc-10.1.0_mingw64_binutils2.35/bin/avr-objdump: DWARF error: could not find variable specification at offset 164e |
10 | C:\avrToolchain\avr-gcc-10.1.0_mingw64_binutils2.35/bin/avr-objdump: DWARF error: could not find variable specification at offset 165a |
:
Bearbeitet durch User
Hallo, habe mir noch eine Toolchain aus avr-gcc 9.3 und binutils 2.35 gebaut. Sobald ich Wire.h inkludiere wirft es wieder DWARF Errors. Mir scheint es gibt wirklich ein Problem mit der binutils Version 2.35.
Also ehrlich gesagt, wenn Du alles selber baust und keine getestete Toolchain benutzt, kannst Du nicht erwarten, dass zum speziellen Problem irgendwer eine Antwort parat hat. Ist jedenfalls meine Meinung...
Hallo, das ist jetzt irgendwie falsche Welt oder? Wer soll die Toolchain testen? Zeige mir eine avr-gcc Toolchain mit binutils 2.35 und ich probiere sie aus. Wie testest du deine Toolchains? Jetzt gibts ein Problem sobald binutils 2.35 verwendet wird und ich soll nicht fragen dürfen. Das finde ich merkwürdig.
:
Bearbeitet durch User
So habe ich das nicht gemeint. Ich würde einfach die aktuellste offizielle verwenden, die dann auch für gut befunden wurde. Wenn Du das Neueste von allem haben willst, liegt die Verantwortung dafür bei dir selbst.
Für Linux scheinen die Versionen: avr-binutils 2.35.1-1 https://www.archlinux.org/packages/community/x86_64/avr-binutils/ und avr-gcc 10.2.0-1 https://www.archlinux.org/packages/community/x86_64/avr-gcc/ aktuell zu funktionieren.
Hallo, genau das ist ja das Problem. Welche sieht man als offiziell getestet an? Nach welchen Kriterien geht man? Die Toolchain der Arduino IDE ist auf dem Stand avr-gcc 7.x Die Toolchain von Atmel Studio 7 ist auf dem Stand avr-gcc 4.9.x Zudem gibts ja kein Problem mit der Toolchain selbst, sondern beim disasemblieren mittels obj-dump. Betrifft also nur eine Winzigkeit der gesamten Toolchain. Kann man erstmal beheben wenn man eine ältere obj-dump.exe verwendet. Ist erstmal nichts dramatisches. Ich wollte es dennoch melden falls es noch niemand festgestellt haben sollte. Ich weiß das Jörg W. hier aus dem Forum sich um die binutils kümmert. Vielleicht hat er einen Tipp vielleicht auch nicht. Werde ich ja mitbekommen. Ansonsten bleibts erstmal im Raum stehen bis die Lösung kommt. Hatte übrigens übersehen das es schon eine binutils 2.35.1 gibt. Also nochmal eine mit avr-gcc 10.2.0 gebaut. DWARF Errors bleiben leider bestehen. Das am Rande. Edit: Dafür hat irgendwer die avr-size.exe gefixt. Die funktioniert nämlich wieder nachdem sie über Versionen hinweg nicht funktionierte. :-) Danke.
:
Bearbeitet durch User
Hallo, es gibt noch eine Abhängigkeit. Kompiliert man mit C++17 statt C++20 gibts keine DWARF Errors mit Wire.h. Am Rande. Das mit der gefixten avr-size.exe stimmt natürlich nicht. Sorry. War gestern schon spät, hab mich von der Arduino IDE ablenken lassen. Die nutzt das ja nicht. Atmel Studio greift noch darauf zurück.
pegel schrieb: > Für Linux scheinen die Versionen: > > avr-binutils 2.35.1-1 > https://www.archlinux.org/packages/community/x86_64/avr-binutils/ > > und > > avr-gcc 10.2.0-1 > https://www.archlinux.org/packages/community/x86_64/avr-gcc/ > > aktuell zu funktionieren. Bei Arch bekommt man immer die aktuellsten Versionen. Die prüft jedoch auch niemand weiter. Der Maintainer pflegt das Paket ein, mehr nicht. Ich baue nur mit Release Versionen. Ob das -1 am Ende auf Snapshots hindeutet kann ich nicht sagen. Ich glaube jedoch nicht das Arch soweit geht und Snapshots bzw. Beta Versionen einpflegt. Von daher wäre ich und Arch auf dem gleichen Stand.
Ich habe die Arduino-Umgebung nicht zur Hand. Kannst du hier mal ein ELF-File hinlegen, welches das Problem hat? Was mir bei Lesen des Threads nicht ganz klar ist: funktioniert das sich ergebende ELF-File eigentlich? Ist es also nur ein Problem mit objdump, oder ist da noch tiefer was kaputt?
Hallo, ich habe den Sketch 2x kompiliert. Einmal mit binutils 2.34 und einmal mit 2.35.1. Jeweils mit avr-gcc 10.2.0. Geht aus dem Dateinamen hervor. Laut meinen Tests spielt die avr-gcc Version keine Rolle. Ein zeitliches Problem durch Multithreading kann ich mittlerweile ausschließen, da der DWARF Error auch beim nachträglichen diassemblieren der .elf Datei auftritt. Laut meiner Meinung betrifft das die obj-dump.exe der binutils 2.35.x Ich kann beide .elf Dateien mit der obj-dump.exe der binutils 2.34 fehlerfrei disassemblieren. Mit der obj-dump.exe von 2.35 oder 2.35.1 erhalte ich DWARF Errors. Die Kompilierung selbst erzeugt keine Fehler, auch keine Warnungen und das erzeugte Programm funktioniert.
Ich habe diese neue Version gerade noch nicht greifbar. Aber ich denke, du hast das damit schon so weit eingekreist, dass du dafür eigentlich direkt bei den binutils ein Bug-Ticket öffnen kannst, an das du deine beiden ELF-Dateien dran hängst.
Hallo, Danke fürs lesen. Ich werde mein Besten geben ...
Hallo, das Ergebnis vom Bugreport lautet, es ist im aktuellen binutils Entwicklungszweig gefixt.
OK, also ein echter "Bug zwischendurch". Shit happens.
Hallo, genau, zur falschen Zeit am falschen Ort - oder so ähnlich treffend. :-) Ich warte brav auf das nächste Release.
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.