Eclipse: Problem mit Auswahl des Target-Typs

#2205843
Lesenswert?

Unter Project|Properties|AVR|Target Hardware habe ich ATmega88 
ausgewählt.

Merkwürdigerweise ist in io.h das Symbol '__AVR_ATmega16__' definiert 
und so der Header <avr/iom16.h> geladen.

Wenn ich auf dem Symbol '__AVR_ATmega16__' F3 drücke, meint Eclipse:
Could not find symbol '__AVR_ATmega16__' in index.

Was ist da los?
#2207476
Lesenswert?

Ich habe jetzt versucht, das Problem zu umschiffen - leider mit mäßigem 
Erfolg.

Als erster Header in jedem meiner Source Files wir ein Header geladen, 
der folgende Definitionen enthält:
1
  #undef  __AVR_ATmega16__
2
  #if __AVR_ATmega88__ != 1
3
    #error Current -mmcu option is not atmega88
4
  #endif
5
  #define  __AVR_ATmega88__  1

Jetzt wird in io.h in Eclipse nicht mehr _AVR_ATmega16_ als definiert 
angenommen, sondern '__AVR_ATmega8__'.

Auch ein clean ändert daran nichts.


Nachtrag: Wenn man in den Header auch noch ein
1
  #undef  __AVR_ATmega8__
packt, dann zeigt Eclipse in io.h '__AVR_ATmega88__' als definiert an.

Offenbar sind da mehrere dieser Symbole definiert und das erste in der 
Liste von io.h gewinnt...
Gast #2208566
Lesenswert?

Uhu Uhuhu schrieb:
> Ich vermute, daß ein Fehler im AVR-Plugin für Eclipse die Ursache für
> dieses komische Verhalten ist.

Das plugin hat mit der Darstellung irgendwelcher defines nichts zu tun. 
Das macht alleine der Editor.
Welche Eclipse-Version benutzt du eigentlich? Das bei mit installierte 
helios macht alles "richtig" (sprich, für den Editor ist gar kein 
Prozessor definiert), und so wird der Code auch dargestellt.

Oliver
#2208618
Lesenswert?

Oliver schrieb:
> Welche Eclipse-Version benutzt du eigentlich?

Helios

> Das plugin hat mit der Darstellung irgendwelcher defines nichts zu tun.
> Das macht alleine der Editor.

Der Editor wird aber kaum dafür zuständig sein, die Compiler-Option 
-mmcu auszuwerten, und das datu passende '__AVR_ATmega*__'-Symbol zu 
definieren.

Ohne die korrekte Definition dieses Symbols in Eclipse funktioniert das 
Ausgrauen der nichtaktiven #if-Blocks nicht.

Sehr merkwürdig ist auch, daß von den '__AVR_ATmega*__' gleich mehrere 
definiert sind.
Persönliche Seite #2208634
Lesenswert?

Uhu Uhuhu schrieb:

> Zumindest finde ich mit grep -R '__AVR_ATmega16__' *
> in /usr/local/avr/avr/include nichts; ebensowenig in meinem Projektbaum.

Da ist das auch nicht drin. Es ist ein Built-in Define; siehe
1
echo | avr-gcc -x c - -E -dM -mmcu=atmega16 |sort

gcc kennt 3 Arten von Defines: built-in, per -D und per #define.
#2208655
Lesenswert?

Johann L. schrieb:
> Da ist das auch nicht drin.

Das wollte ich mit dem grep ja nachprüfen...

Da bei mir mindestens die Symbole '__AVR_ATmega8__' und 
'__AVR_ATmega16__' zusätzlich zu dem eigentlich erwarteten 
'__AVR_ATmega88__' definiert sind und es sich - wie dur richtig sagst - 
um built-in-defines handelt, kann eigentlich nur das AVR-Plugin für 
Eclipse dafür verantwortlich sein, denn in dessen Property-Page wird das 
Target Device definiert.

Allerdings interessiert hier nicht, welchen Status diese Defines im gcc 
haben - der ist noch nicht gelaufen, wenn der Eclipse-Editor falsch 
anzeigt, welche #if-Blocks expandiert werden und welche nicht.
#2208739
Lesenswert?

Es ist schon ein paar Jahre her, wo ich mir Eclipse mal angeschaut habe. 
Alles folgende daher unter der Prämisse "wenn ich mich richtig 
erinnere".

Uhu Uhuhu schrieb:
> Allerdings interessiert hier nicht, welchen Status diese Defines im gcc
> haben - der ist noch nicht gelaufen, wenn der Eclipse-Editor falsch
> anzeigt, welche #if-Blocks expandiert werden und welche nicht.

Doch, er ist schon gelaufen. Eclipse merkt sich alles mögliche von 
früheren Compiler-Läufen. Außerdem führt das C-Plugin wohl auch einen 
ähnlichen Compiler-Aufruf aus, wie den von Georg-Johann gezeigten, um an 
die ganzen vordefinierten Sachen zu kommen (da gibt es ja schließlich 
einige, nicht nur die __AVR_*).

Kann es vielleicht sein, dass du in dem Projekt schon ein paar mal das 
Device gewechselt hast? Es wäre dann nämlich denkbar, dass du dann halt 
mehrere dieser Device-Defines im Cache hast. Es gibt aber einen 
Menüpunkt, mit dem der komplette Cache für das aktuelle Projekt gelöscht 
wird (oder neu aufgebaut wird). Den würde ich mal ausprobieren.
#2208791
Lesenswert?

Stefan Ernst schrieb:
> Doch, er ist schon gelaufen.

Das Ausgrauen nicht expandierter #if-Blocks funktioniert auch sofort, 
nachdem man die Bedingungsdefinition im Quelltext geändert hat - zu 
diesem Zeitpunkt ist gcc definitiv noch nicht gelaufen.

Daraus folgt, daß das C-Plugin von Eclipse die Preprozessor-Anweisungen 
selbst auswertet und den Editor entsprechend steuert.

> Kann es vielleicht sein, dass du in dem Projekt schon ein paar mal das
> Device gewechselt hast?

Ja und es waren mega8 und mega16 - die Typen, die auch jetzt noch 
definiert sind. Das ist aber schon längere Zeit her.

> Es gibt aber einen
> Menüpunkt, mit dem der komplette Cache für das aktuelle Projekt gelöscht
> wird (oder neu aufgebaut wird). Den würde ich mal ausprobieren.

Gute Idee.
Clean ist es nicht - das behebt das Problem nicht.
Unter Project|Preferences|C/C++|Indexer gibt es zwar 
Einstellmöglichkeiten für den Indexer-Cache, aber nichts um ihn zu 
löschen und neu aufzubauen.
#2208839
Lesenswert?

Uhu Uhuhu schrieb:
> Das Ausgrauen nicht expandierter #if-Blocks funktioniert auch sofort,
> nachdem man die Bedingungsdefinition im Quelltext geändert hat - zu
> diesem Zeitpunkt ist gcc definitiv noch nicht gelaufen.
>
> Daraus folgt, daß das C-Plugin von Eclipse die Preprozessor-Anweisungen
> selbst auswertet und den Editor entsprechend steuert.

Ja, die Defines, die direkt im Sourcecode stehen, werden natürlich 
direkt und sofort und ohne den Compiler ausgewertet. Daraus folgt aber 
nicht, dass das ausschließlich so läuft. Ansonsten würde ja der Editor 
von den vordefinierten Dingen gar nichts wissen können.

Uhu Uhuhu schrieb:
> clean ist es nicht - das behebt das Problem nicht.

Gab es nicht auch noch ein "Clean Project", oder so ähnlich?
#2208895
Lesenswert?

Uhu Uhuhu schrieb:
> Stefan Ernst schrieb:
>> Ansonsten würde ja der Editor
>> von den vordefinierten Dingen gar nichts wissen können.
>
> Dafür sind die Plugins zuständig. Der Editor macht dann nur noch, was
> die ihm einflüstern.

Das sagte ich doch. Das C-Plugin holt sich die Infos über die 
Pre-Defines aus dem Compiler-Output (woher auch sonst), und cached sie.
#2220681
Lesenswert?

Uhu Uhuhu schrieb:

> Jetzt fragt sich nur noch, wie man den alten Mist wieder losbekommt.

Welche Eclipse Version hast Du?

Ich meine ab 3.6 (Helios) kann man den Symbol-Cache von der 
Benutzeroberfläche aus löschen (Ich habe es gerade mit 3.7/Indigo 
ausprobiert):
Project-> Properties -> C/C++ Build -> Discovery Options -> "Clear 
discovered entries now" und das Projekt neu "builden"


Bei Eclipse-Versionen vor 3.6 konnte man diesen Cache nicht von der 
Benutzeroberfläche aus löschen. Dafür gab es eine Hack:
http://avr-eclipse.sourceforge.net/wiki/index.php/Known_Issues#After_update_of_the_avr-gcc_toolchain_Include_paths_still_point_to_the_old_location

Und damit es hier keinen Streit gibt woher der Editor die aktuellen 
Defines kennt:

Eclipse, genauer gesagt CDT, nutzt den sogenannten "Discovery" 
Mechanismus um möglichst alle definierten Symbole zu ermitteln. Dazu 
wird (unter anderem) der GCC mit ein paar speziellen Parametern 
gestartet um alle im GCC eingebauten Symbole zu ermitteln. Das 
AVR-Plugin hängt sich hier mit ein und übergibt auch noch den Parameter 
"-mmcu=..." mit der aktuellen Projekt Target MCU (und F_CPU) damit 
avr-gcc die entsprechenden MCU-abhängigen Symbole ausspuckt.

Mit der Liste der gefunden Symbole kann sich wiederum der Indexer (?) 
durch alle Includes durchhangeln und die entsprechenden #defines mehr 
oder weniger korrekt parsen. Wann der Indexer automatisch anspringt weiß 
ich jetzt spontan nicht. Aber mit Project -> Index -> Rebuild kann man 
ihn auch manuell starten.

Und zum Schluss greift der Editor auf die vom Indexer gefunden #defines 
zu um #ifdefs entsprechend darzustellen und mit F3 die Definitionen 
anzuspringen

Welche Symbole Eclipse aktuell für das Projekt gespeichert hat kann man 
unter: Project -> Properties -> C/C++ General -> Paths and Symbols -> 
#Symbols sehen wenn man "Show built-in values" aktiviert.

Thomas
#2220729
Lesenswert?

Thomas Holland schrieb:
> Welche Eclipse Version hast Du?

Helios

> Ich meine ab 3.6 (Helios) kann man den Symbol-Cache von der
> Benutzeroberfläche aus löschen (Ich habe es gerade mit 3.7/Indigo
> ausprobiert):
> Project-> Properties -> C/C++ Build -> Discovery Options -> "Clear
> discovered entries now" und das Projekt neu "builden"

Das hilft leider auch nichts. Der ATmega16 ist in io.h nach wie vor 
definiert.

Merkwürdig ist auch, daß ich die Symbole mit
1
  #undef __AVR_ATmega16__
2
  #undef __AVR_ATmega8__
wegbekomme. Vordefinierte Symbole sollten sich mit #undef nicht 
beseitigen lassen.
#2220748
Lesenswert?

Thomas Holland schrieb:
> Welche Symbole Eclipse aktuell für das Projekt gespeichert hat kann man
> unter: Project -> Properties -> C/C++ General -> Paths and Symbols ->
> #Symbols sehen wenn man "Show built-in values" aktiviert.

Dort sehe ich nur die Symbole, die ich selbst -D unter Project -> 
Properties -> C/C++ Build -> Settings -> Tool Settings -> AVR Compiler 
Symbols definiert habe.

"Show built-in values" bewirkt nichts.
#2221363
Lesenswert?

Ich habe jetzt einfach mal den #include-Verteiler aus io.h herauskopiert 
und in dieser Art modifiziert in einen neu angelegten Source-File in 
Eclipse eingefügt:
1
#if defined (__AVR_AT94K__)
2
//#  include <avr/ioat94k.h>
3
#endif
4
#if defined (__AVR_AT43USB320__)
5
//#  include <avr/io43u32x.h>
6
#endif
7
...

Ich habe in den Optionen des AVR-Plugins ATmega88 eingestellt - der 
zugehörige #include-Block wird korrekt hell angezeigt.

Alle anderen #include-Blocks, außer denen für ATmega8 und ATmega16 sind 
korrekt grau dargestellt.

Da kein Headerfile eingelesen wird, müssen die Symbole für ATmega8 und 
ATmega16 wohl aus dem AVR-Plugin kommen. (Wie schon geschrieben, hatte 
ich auch diese beiden Prozessortypen früher schon einmal eingestellt.)
#2221384
Lesenswert?

Du wurschtelst jetzt schon so lange daran rum und fängst jetzt sogar an 
die System-Header zu modifizieren, und das alles bloß wegen der Optik. 
Dir ist schon klar, dass das ein reines Anzeigen-Problem ist und nicht 
die geringsten Auswirkungen auf das Compilieren hat, oder? Wenn dich die 
fehlerhafte Anzeige so stört/irritiert, dann lege doch einfach ein neues 
Projekt an.
#2221562
Lesenswert?

Stefan Ernst schrieb:
> Du wurschtelst jetzt schon so lange daran rum und fängst jetzt sogar an
> die System-Header zu modifizieren, und das alles bloß wegen der Optik.

Lesen ist wohl nicht dein Ding?

> Dir ist schon klar, dass das ein reines Anzeigen-Problem ist und nicht
> die geringsten Auswirkungen auf das Compilieren hat, oder?

Es soll auch Fehler geben, die die Anzeige betreffen.
#2221606
Lesenswert?

Uhu Uhuhu schrieb:
> Lesen ist wohl nicht dein Ding?
>
>> Dir ist schon klar, dass das ein reines Anzeigen-Problem ist und nicht
>> die geringsten Auswirkungen auf das Compilieren hat, oder?
>
> Es soll auch Fehler geben, die die Anzeige betreffen.

Dein Ding ist es wohl auch nicht, was?
Habe ich etwa behauptet, dass es kein Fehler ist? Aber es ist ein 
Problem, das nur die Anzeige betrifft, und keine Auswirkungen auf 
den generierten Code hat. Insofern finde ich einfach nur, dass du zu 
viel Zeit damit verschwendest. Aber nun gut, ist ja schließlich deine 
Zeit.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren