Hallo,
ich suche bereits länger nach einem Interrupt-Fehler bzw. -Warnung
(wobei ich jede Warnung ernst nehme). Leider hat mich jetzt die
Reduktion des Programms auf ein Minimum auch nur Zeit gekostet und keine
Erkenntnisse gebracht. Ich verstehe das Ganze nicht. Das Programm ist
mittlerweile sehr kurz:
1
#include<inttypes.h>
2
#include<avr/interrupt.h>
3
#include<avr/io.h>
4
#include<stdlib.h>
5
6
ISR(USART_RX_vect){
7
UDR0;
8
}
9
10
intmain(){
11
while(1);
12
}
avr-gcc 4.8.1 (offizielle Version von Atmel) sagt jede Mal:
1
In function '__vector_18':
2
test.c:6:1: warning: '_vector_18' appears to be a misspelled signal handler [ena
3
bled by default]
4
ISR(USART_RX_vect) {
5
^
Sind eventuell die Header-Dateien kaputt? Ich habe nichts Auffälliges
gefunden. Das AVR-Studio habe ich jetzt schon mehrfach runtergeladen und
neu installiert. Ich kann aber nicht ausschließen, dass mein Windows
etwas hat. Will es aber ungerne neu installieren, weil ich schon
genügend Zeit verloren habe. :(
Die Warnung tritt nur in 4.8.2 auf:
http://gcc.gnu.org/PR59396
Falls ein Distributor das Problem auf eine andere Version zurückportiert
hat, tritt die Warnung auch dort auf.
Klaus Wachtler schrieb:> Für welchen Controller?>> Es gibt ja auch welche mit 2 U(S)ART, dann heißt die ISR natürlich etwas> anders (mit 0 oder 1).
Dann sähe die Warnung aber auch anders aus.
-mmcu=atmega328p
Hmmmmmmm. Inwiefern passt das nicht zusammen? Auch wenn ich in der ISR
was anderes tue, um eine Dummyaktivität zu kreieren, jammert der
Compiler. Und ich nehme jede Warnung ernst. Eine Warnung ist für mich
nie "nur" eine Warnung!
Thommy schrieb:> -mmcu=atmega328p>> Hmmmmmmm. Inwiefern passt das nicht zusammen?
Das genau ist die Frage.
Schau noch mal ins Datenblatt, wie die Vectoren genau heißen.
Oliver
Thommy schrieb:> Eine Warnung ist für mich> nie "nur" eine Warnung!
Ok, dann: Diese Warnung benötigt eine Besondere Übersetzung.
Der Compiler Sagt zwar:
> warning: '_vector_18' appears to be a misspelled signal handler
meint aber eigentlich:
> Achtung! Ich bin eine alte, vom Distributor schlecht gepatchte Version! Bitte
aktualisier mich!
:)
Thommy schrieb:> Hmmmm. Wo bekomme ich denn dann eine aktuellere Version?
Für Windows? Keine Ahnung.
Aber: Schau dir vielleicht mal die GCC-Quelltext-Schnippsel an, die für
diese Warnung verantwortlich sind:
Aus einem anderen Grund (führendes Sonderzeichen abschneiden) wurde der
Char-Pointer auf den Funktionsnamen um eins inkrementiert
weiterverarbeitet. d.H. der erste Buchstabe wurde weggeschnitten. Aus
"__vector_18" wurde dabei also "_vector_18".
Weiter hinten/an anderer Stelle erfolgt dann die Prüfung auf gültige
IRQ-Vektoren-Namen. Dabei wird eben auf "__vector" geprüft.
=> es gibt die von dir gesehene Warnung.
diese ist, wenn du dir das im GCC-Source gesehen hast, ein rein
kosmetisches Problem => ignorieren.
Das beruhigt mich eigentlich nicht. Mein Chef verlangt z.B. sogar
-Werror
Und so ein alter und schwer wiegender Bug sollte doch längt gefixt sein?
Er verursacht ja eine Menge Zeitverlust durch Irreführung, nicht nur bei
mir. Zumal es auch 4.9.0 gibt, oder? Ich würde auch selbst kompilieren,
weiß aber nicht wie. Hat jemand eine Ahnung, wie man den avr-gcc unter
Windows kompiliert?
Thommy schrieb:> Und so ein alter und schwer wiegender Bug sollte doch längt gefixt sein?
Ist er ja auch. Hat halt etwas länger gedauert.
So Juli 2013 ist der Bug in die 4.8er Schiene aufgenommen worden.
Dez. 2013 ist er entdeckt&gemeldet worden.
März 2014 ist dann die gefixte Version released worden...
Und "Schwerwiegend" sind für die GCC-Entwickler garkeine AVR-Bugs.
Thommy schrieb:> Das beruhigt mich eigentlich nicht. Mein Chef verlangt z.B. sogar> -Werror
Die Warnung tritt ja nur beim Linken mit -flto auf. Du kannst also beim
Linken zusätzlich -w angeben.
Thommy schrieb:> Hmmmm, was meinst du mit "Linken". Ich kompiliere so:
Bei der Frage... ist es wohl das einfachste, du nimmst -flto aus
"[DIVERSE PARAMETER]" raus.
Oder du besorgst dir eine 4.8.3, die enthält auch Fixes für "richtige"
Bugs, also für solche, die zu falschem Code führen können.
Ja, ich spare mir eben das extra Linken aus Faulheit und mache alles in
einem Schritt. Warum auch nicht, ging früher auch. Und -flto brauche ich
wegen der Codegröße zwingend.
Und natürlich würde ich viel lieber die 4.8.3 oder 4.9.0 installieren,
habe aber keine Quelle für ein Binary. Ich verstehe nicht so ganz, warum
gcc die AVR-Geschichte überhaupt einbaut, wenn anscheinend kein
Interesse an Support oder Testern besteht. Ich bin ja kein Einzelfall,
wie eine Google-Suche gezeigt hat. Wären Binarys zum Testen verfügbar,
gäbe es sicher eine Menge Rückmeldungen mehr... aber anscheinend ist das
ja nicht erwünscht!? Vorsicht Kunde? Es könnten noch mehr Fehler
entdeckt werden?
Thommy schrieb:> Ich verstehe nicht so ganz, warum> gcc die AVR-Geschichte überhaupt einbaut, wenn anscheinend kein> Interesse an Support oder Testern besteht.
Du bellst den falschen Baum an, und das gleich zweifach (nicht, daß das
irgend eine Baum groß stören würde, aber trotzdem)
Du benutzt nicht "den" gcc, sondern das, was Atmel daraus gemacht hat.
Ein Original 4.8.1 hat den Fehler nicht, wie weiter oben ja schon steht.
Also beschwer dich bei Atmel.
Und Johann ist mit Sicherheit auch nicht das Ziel deines Unmuts.
Ansonsten ist die Sache einfach: gcc ist Open source. Du darfst da jeden
Fehler, der dir auffällt, gerne selber beheben. Von alleine beheben die
sich leider nicht.
Oliver
Thommy schrieb:> Und -flto brauche ich> wegen der Codegröße zwingend.
In der Regel kann der Programmierer viel besser optimieren, als jede
Linkeroption.
Oftmals enthält Code viele sich ähnelnde Copy&Paste Sequenzen. Wenn man
da sinnvoll Unterfunktionen und Arrays einsetzt, lassen sich schnell 50%
und mehr einsparen.