Forum: Mikrocontroller und Digitale Elektronik CooCox IDE: unbekanntes Schlüsselwort bringt CooCox durcheinander


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,
mich nervt gerade die Eigenschaft von CooCox, bei einem unbekannten Wort 
in der Zeile Fehler anzuzeigen. Beispielsweise ist in der Datei 
pgmspace.h folgendes definiert:
1
#define __flash
und in der Datei xxxx.c steht:
1
#include "../src_avrcom/pgmspace.h"
2
const __flash char MT_TEXTTEST[]      = "Zeichensatz test";
so wird die ganze zweite Zeile unterkringelt, da CooCox das Wort 
"__flash" nicht kennt.

Mitgelieferte Header-Dateien nutzt CooCox und kennt die Definitionen- 
z.B. alles, was in "stm32f10x_gpio.h" steht. Aber bei eigenen 
Header-Dateien erkennt es die Defines nicht.

Ist das eine Eigenschaft von der CooCox IDE oder muß da etwas 
eingestellt werden?

Viele Grüße
W.T.

von Dr. Sommer (Gast)


Lesenswert?

Was passiert wenn du Strg gedrückt hälst und auf das #include klickst, 
erscheint der richtige Header? Was passiert wenn du das bei __flash 
machst? Und wenn du im Header so auf __flash klickst?

PS: Bei ARM braucht man keine gesonderte Markierung für 
Flash-Variablen...

von Walter T. (nicolas)


Lesenswert?

Dr. Sommer schrieb:
> Was passiert wenn du Strg gedrückt hälst

Cool, die Funktion kannte ich noch gar nicht. Ich lande im richtigen 
Headerfile.

"__flash" wird allerdings nicht erkannt. Und ich verstehe jetzt auch 
warum. In der Headerdatei steht nämlich eigentlich:
1
#idfef AVR
2
  #include <avr/pgmspace.h>  
3
#elif defined STM32
4
    #define PROGMEM 
5
    #define pgm_read_byte(a) (*a)
6
    #define __flash
7
          ...
8
#else
9
   #warning No MCU defined  
10
#endif
wobei CooCox den richtigen Block erkennt und hervorhebt, da das Symbol 
"STM32" in den Build-Optionen definiert ist (und das finde ich toll!). 
Und jetzt das Merkwürdige: Korrigiere ich die Auswahl zu
1
...
2
#elif defined(STM32)
3
...
wird auch in der anderen Datei "__flash" richtig erkannt.

CooCox nutzt also scheinbar für die Hervorhebung eine andere Erkennung 
der Präprozessordirektiven als für die Verlinkung.

Danke für die Hilfe!
W.T.

von Dr. Sommer (Gast)


Angehängte Dateien:

Lesenswert?

Walter Tarpan schrieb:
> wobei CooCox den richtigen Block erkennt und hervorhebt,
Nicht wirklich, hervorgehobene Blöcke sind deaktiviert (siehe Anhang).

Walter Tarpan schrieb:
> CooCox nutzt also scheinbar für die Hervorhebung eine andere Erkennung
> der Präprozessordirektiven als für die Verlinkung.
Verlinkung? Der Editor hat jedenfalls nur sehr eingeschränkte 
Möglichkeiten zur Code Erkennung, beim eigentlichen Compilen macht das 
alles der Compiler selber und ggf. anders. Die Kunst ist eclipse (Die 
Basis von CooCox) so einzustellen dass es sich gleich verhält...

"defined name" und "defined (name)" sollte beim Compilieren keinen 
Unterschied machen, siehe http://gcc.gnu.org/onlinedocs/cpp/Defined.html 
- kann sein dass eclipse das nicht so ganz hinbekommt.

von Walter T. (nicolas)


Lesenswert?

Dr. Sommer schrieb:
> Nicht wirklich, hervorgehobene Blöcke sind deaktiviert (siehe Anhang).

Geschenkt. Ob eine auffällige Nicht-Hervorhebung in einem grau 
hervorgehobenen Bereich als Hervorhebung bezeichnet werden kann ist 
diskutabel.

Dr. Sommer schrieb:
> "defined name" und "defined (name)" sollte beim Compilieren keinen
> Unterschied machen,

Genau. Nur für CooCox macht es wohl einen- und zwar noch 
unterschiedlich, ob es nur um Hervorhebung (oder Nicht-Hervorhebung) 
oder um das Erkennen von defines geht. Aber was soll's. Das ist wirklich 
eine Sache, auf die man beim Quelltexten achten kann- wenn man es weiß.

von Dr. Sommer (Gast)


Lesenswert?

Walter Tarpan schrieb:
> Geschenkt. Ob eine auffällige Nicht-Hervorhebung in einem grau
> hervorgehobenen Bereich als Hervorhebung bezeichnet werden kann ist
> diskutabel.
Naja, wenn alles aktive grau sein soll, wäre ja die ganze Datei grau bis 
auf die nicht-aktiven weißen Teile - sähe auch komisch aus.
> Genau. Nur für CooCox macht es wohl einen- und zwar noch
> unterschiedlich, ob es nur um Hervorhebung (oder Nicht-Hervorhebung)
> oder um das Erkennen von defines geht. Aber was soll's. Das ist wirklich
> eine Sache, auf die man beim Quelltexten achten kann- wenn man es weiß.
Mh, mein eclipse erkennt "defined(foo)" und "defined foo" gleich 
richtig... Version Kepler Service Release 1, Build id: 20130919-0819, 
CDT version 8.2.1.201309180223

von Walter T. (nicolas)


Angehängte Dateien:

Lesenswert?

Dr. Sommer schrieb:
> Mh, mein eclipse erkennt "defined(foo)" und "defined foo"

Sehr interessant. Die Nichterkennung ohne Klammern ist immer nur dann, 
wenn CooCox es noch nie erkannt hat; sprich: Sind die Klammern vorhanden 
und werden entfernt, erkennt es auch weiterhin das Symbol. Erst beim 
Neustart von CooCox nicht mehr. Und das gilt auch nur für andere 
Dateien, nicht für die Datei selbst, d.h. eine Variable "const __flash 
char hallo = 0;" in der oberen Datei wird richtig hervorgehoben (führt 
natürlich zu einem Build-Fehler).

Und es betrifft auch nur die in den "aktiven Blöcken" definierten 
Symbole. Nicht die Hervorhebung der "aktiven Blöcke".

Edit: Habe noch zwei neue Screenshots gemacht, wo man besser erkennt, 
was gemeint ist. Die erste Version ist also jetzt überflüssig.

: Bearbeitet durch User
von Walter T. (nicolas)


Lesenswert?

Hmmm....so einfach ist die Sache doch nicht. Ob in Klammern oder nicht: 
erkannt wird das gültige Symbol immer erst dann, wenn pgmspace.h in 
CooCox einmal geöffnet, geändert und gespeichert wurde.

Ein Build reicht nicht aus.

CooCox nervt.

von Dr. Sommer (Gast)


Lesenswert?

Walter Tarpan schrieb:
> wenn pgmspace.h in CooCox einmal geöffnet, geändert und gespeichert
> wurde.
Ja, sonst weiß es nicht dass es was machen soll. Alfernativ rechte 
maustaste auf das projekt und "rerun C/C++ Analysis" oder wie das hieß.
> Ein Build reicht nicht aus.
Ja, der Build hat nichts mit der Code-Hilfe zu tun; der Build ist quasi 
eine externe Funktion, man kann ja auch ganz eigene Build-Scripte 
einbausen.
> CooCox nervt.
Tja eclipse ist an manchen Stellen etwas gewöhnungsbedürftig...

von Walter T. (nicolas)


Lesenswert?

Dr. Sommer schrieb:
> Alfernativ rechte
> maustaste auf das projekt und "rerun C/C++ Analysis" oder wie das hieß.

Hmm....ich finde irgendwie nicht, wie man die Indizierung manuell 
anstoßen kann. Nur wenn ich in den "Preferences" zwischen automatischer 
und manueller Indizierung umschalte scheint er das zu machen.

von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,
ich muß dieses alte Thema nochmal aufgreifen: Wie bringt man CooCox IDE 
dazu, die Indizierung durchzuführen?

Viele Grüße
W.T.

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.