Forum: Compiler & IDEs Probleme mit nanosleep() in Eclipse


von Erik W. (bser_w)


Lesenswert?

Hallo,

ich bin momentan dabei auf einem Linuxsystem einen seriellen Treiber zur 
Kommunikation mit einen LON Shortstack Microserver zu implementieren und 
diesen dann später auf einem embedded Linux laufen zu lassen.

Als Entwicklungsumgebung nutze ich Eclipse und als Compiler den GCC.

Zu Testzwecken habe ich versucht mit nanosleep() eine Funktion zur 
Verzögerung zu bauen. Hiermit will ich vermeiden das zu viele Daten auf 
den UART geschrieben werden.
1
#include <unistd.h>
2
#include <time.h>
3
4
void wait(int sec, long int nsec)
5
{
6
  struct timespec t;
7
  t.tv_nsec = nsec;
8
  t.tv_sec = sec;
9
  nanosleep(&t, NULL);
10
}

Das Compilieren via Makefile funktioniert problemlos. Allerdings meldet 
Eclipse zwei Fehler die vom Compiler nicht gemeldet werden.

Field 'tv_nsec' could not be resolved
Field 'tv_sec' could not be resolved

Ich könnt mir vorstellen das es an irgendwlechen Projekteinstellungen 
liegt das Eclipse evtl. die time.h nicht finden kann.

Hat vielleicht jemand eine Idee an was es liegen könnte?

Gruß

Erik

von Karl H. (kbuchegg)


Lesenswert?

Erik Wolf schrieb:

> Ich könnt mir vorstellen das es an irgendwlechen Projekteinstellungen
> liegt das Eclipse evtl. die time.h nicht finden kann.

Wenn der Compiler time.h nicht hätte finden können, hättest du eine 
entsprechende Fehlermeldung bekommen.

Schau doch mal in time.h hinein, such dir die struct timespec und sieh 
nach, wie die Member wirklich heißen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wenn der Compiler time.h nicht hätte finden können, hättest du eine
> entsprechende Fehlermeldung bekommen.

Klar, aber der hat seine eincompilierten Pfade, auf denen er das
sucht.  Die müssen nicht mit dem übereinstimmen, was Eclipse kennt.
Eclipse möchte das aber gern kennen, (offenbar) damit es im Debugger
weiß, welcher Datentyp sich dahinter verbirgt.

Man kann dem Compiler eine zusätzliche Option -v beim Compilieren
mitgeben, dann zeigt er an, welche Pfade er für include-Dateien
sucht.  Außerdem kann man sich mit dem Schalter -E das Zwischen-
ergebnis nach dem preprocessing ausgeben lassen, dort stehen die
tatsächlichen Pfadnamen dann drin, sodass man erfahren sollte, durch
welche Datei er das <time.h> aufgelöst hat.

von Erik W. (bser_w)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wenn der Compiler time.h nicht hätte finden können, hättest du eine
> entsprechende Fehlermeldung bekommen.

Genau, vom Compiler habe ich keiner Fehlermeldung bekommen. Der macht es 
offensichtlich richtig, zumal die Funktion ja auch wie gewollt 
funktioniert. Nur Eclipse leider nicht.

> Schau doch mal in time.h hinein, such dir die struct timespec und sieh
> nach, wie die Member wirklich heißen.

Habe ich gemacht.
1
struct timespec
2
  {
3
    __time_t tv_sec;    /* Seconds.  */
4
    long int tv_nsec;    /* Nanoseconds.  */
5
  };

Jörg Wunsch schrieb:
> Man kann dem Compiler eine zusätzliche Option -v beim Compilieren
> mitgeben, dann zeigt er an, welche Pfade er für include-Dateien
> sucht.  Außerdem kann man sich mit dem Schalter -E das Zwischen-
> ergebnis nach dem preprocessing ausgeben lassen, dort stehen die
> tatsächlichen Pfadnamen dann drin, sodass man erfahren sollte, durch
> welche Datei er das <time.h> aufgelöst hat.

#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/include
 /usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/include-fixed
 /usr/include/i386-linux-gnu
 /usr/include

Mein Eclipse sucht in genau den gleichen Verzeichnissen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Dann musst du wohl entweder das Eclipse dazu überreden, dass es dir
ein paar Debuginformationen rausrückt, oder du lässt den ganzen Kram
durch strace laufen (Option -e trace=open sollte genügen) und siehst
nach, auf welche Dateien es alles zugreift.

von Karl H. (kbuchegg)


Lesenswert?

Erik Wolf schrieb:
> Karl Heinz Buchegger schrieb:
>> Wenn der Compiler time.h nicht hätte finden können, hättest du eine
>> entsprechende Fehlermeldung bekommen.
>
> Genau, vom Compiler habe ich keiner Fehlermeldung bekommen. Der macht es
> offensichtlich richtig, zumal die Funktion ja auch wie gewollt
> funktioniert. Nur Eclipse leider nicht.

Ah mein Fehler.
Das hab ich überlesen.
Entschuldigung.

Vergiss die Sache mit time.h  Jörg hat das IMHO bereits korrekt 
diagnostiziert: Diskrepanz zwischen den Include-Verzeichnissen des 
Compilers und der IDE

von Erik W. (bser_w)


Lesenswert?

Ok, hab jetzt noch ein bisschen weiter geschaut. Es handelt sich bei der 
Geschichte offensichtlich um einen Eclipse Bug.

Lösung: Einfach ignorieren.

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.