Hilfe bei Erstellung von eCos

Hallo www,

seit einiger Zeit bin ich an einem Embedded-Projekt dran und im Moment muss ich mich um das RTOS kümmern. Die Wahl ist auf das eCosPro von eCosCentric ( http://www.ecoscentric.com/ecospro/ni… ) gefallen, da es für unseren Softcore NIOS2 schön zugeschnitten ist.

Da mir die GUI etwas zu undurchsichtig ist (was im Hintergrund alles genau abläuft) und ich damit keine Fehler machen will, habe ich mich dazu entschlossen über Cygwin das OS über die Commandline zu erstellen.

Damit ich die Software und die Entwicklungsumgebung besser kennen lerne, mache ich seit einigen Tagen das Tutorial durch und bin immer wieder auf Probleme gestoßen. Jetzt hänge ich allerdings entgültig.

In Kapitel 13 des eCos User Guides ( http://ecos.sourceware.org/docs-lates… ) geht es darum eine Test-Applikation zu erstellen und schließlich auch auszuführen. Für die Befehle werden immer wieder Variablen benutzt, die ich inzwischen auch schon längst gesetzt habe. Allerdings ist mein Problem bei dieser Zeile:

$ TARGET-gcc -g -IBASE_DIR/ecos-work/install/include hello.c -LBASE_DIR/ecos-work/install/lib -Ttarget.ld -nostdlib

Die Variablen habe ich wie folgt gesetzt:
$ export TARGET=„nios2_stratix2_2s60_rohs_tseplus_lan91c111“
$ export BASE_DIR="/cygdrive/g/projekt/eCosOS"

(Mit $ export -p | less habe ich auch überprüft dass die Variablen richtig übernommen wurden)

Die Befehlszeile macht für mich keinen Sinn. An erster Stelle steht ja TARGET, was von der Logik her doch ein Befehl sein müsste - aber keiner ist. Allerdings funktioniert es auch nicht dass ich die Zeile umschreibe in:
$ gcc -g TARGET […]
Die Shell meckert nämlich hier dass TARGET kein File oder Directory sei (ist ja auch keines).

Desweiteren verstehe ich nicht woher diese abgewandelten Variablen -IBASE_DIR und -LBASE_DIR kommen.
Und last but not least habe ich leider auch keinen Schimmer was das zusätzliche T vor -Ttarget.ld bedeutet (die File target.ld habe ich so schon gefunden).

Ich hoffe dass mir jemand helfen kann etwas Licht ins Dunkel zu bringen.

Gruß,
Stahlkopf

Hallo,

inzwischen hat sich etwas getan und ein paar Fragezeichen wurden behoben.
Der Prefix -I und -L sind jetzt klar.
Außerdem habe ich die Zeile gleich über gcc aufgerufen ohne dabei auf meine Ziel-Hardware zu verweisen (wobei ich dabei auch nicht weiß ob er dann richtig kompiliert).

Punkt 3 ist allerdings noch vollkommen unklar! Ich hoffe ihr könnt mir dabei Helfen:

Und last but not least habe ich leider auch keinen Schimmer
was das zusätzliche T vor -Ttarget.ld
bedeutet (die File target.ld habe ich so schon gefunden).

Nach wie vor bleibt meine Hoffnung:

Ich hoffe dass mir jemand helfen kann etwas Licht ins Dunkel
zu bringen.

Immernoch mit Grüßen

Gruß,
Stahlkopf

Hallo,

Ganz schön mutiger Anfang :smile: Hast Du vorher schonmal irgend etwas in Richtung C Programmierung gemacht?

Der Prefix -I und -L sind jetzt klar.

Na dann …

Außerdem habe ich die Zeile gleich über gcc aufgerufen ohne
dabei auf meine Ziel-Hardware zu verweisen (wobei ich dabei
auch nicht weiß ob er dann richtig kompiliert).

Vermutlich schon. Viel steht in so einem „hello world“ ja nicht drin. Allerdings hättest Du Dir dann auch den ganzen eCos Krempel schenken können, denn er kompiliert es dann einfach für Deinen x86 und macht Dir ein dort ausführbares Programm draus.

Punkt 3 ist allerdings noch vollkommen unklar! Ich hoffe ihr
könnt mir dabei Helfen:

-T ist ein Hinweis für den Linker, wo er sein linker Skript finden kann.

Am besten schnappst Du Dir mal die Anleitung zur GCC und schmökerst eine Weile.

Gruß

Fritze

Hallo,

Heyho,

Ganz schön mutiger Anfang :smile: Hast Du vorher schonmal irgend
etwas in Richtung C Programmierung gemacht?

Ja, hab ich. Und was ich nicht kann muss ich mir eben beibringen :wink:
Die Registerbelegung fürs Display (EA LED55X46-RGB) ist auch schon fertig, die für den Ethernet-Controller (ENC28J60) ist grad am Entstehen (is aber deutlich umfangreicher). Was noch fehlt ist eine RTC, aber da is noch nicht ganz raus welche den Zuschlag erhält.
Und danach ist noch die Frage wie unfangreich das Config-Tool mir das Betriebssystem baut, denn ansich hoffe ich dass ich drum herum komme groß im Scheduler rum zu pfuschen oder mit diverse Semaphoren um mich zu schmeißen… Weswegen sollte ich sonst das Config-Tool verwenden :stuck_out_tongue_winking_eye:
Aber so wie es im Moment ausschaut könnte es etwas Probleme mit dem SPI geben. Aber soweit bin ich noch nicht.

Außerdem habe ich die Zeile gleich über gcc aufgerufen ohne
dabei auf meine Ziel-Hardware zu verweisen (wobei ich dabei
auch nicht weiß ob er dann richtig kompiliert).

Vermutlich schon. Viel steht in so einem „hello world“ ja
nicht drin. Allerdings hättest Du Dir dann auch den ganzen
eCos Krempel schenken können, denn er kompiliert es dann
einfach für Deinen x86 und macht Dir ein dort ausführbares
Programm draus.

Ja, sowas hab ich mir schon gedacht. Das ist dann natürlich mist! Wie kann ich dem gcc denn dann sagen dass er für meine Hardware kompilieren soll? Wie gesagt, so wie der Befehl da steht funktioniert es einfach nicht.
Ich hab ein einfaches „hello world“ Programm genommen, damit erstmal der prinzipielle Weg klar wird. Halt erstmal möglichst wenige Fehlerquellen einbeziehen :smile:

-T ist ein Hinweis für den Linker, wo er sein
linker Skript finden kann.

Am besten schnappst Du Dir mal die Anleitung zur GCC und
schmökerst eine Weile.

Gestern Nacht ist mir das mit dem Linkerskript auch noch aufgefallen (wegen der Fehlermeldung). Ich hab dann auch im Manual weng geschaut, allerdings den Prefix „-T“ nicht gefunden. (Du meintest schon $ man gcc, oder?)

Im Moment stehe ich an der Stelle, dass der Befehl (ohne TARGET) bis zum -Ttarget.ld abgearbeitet wird. Allerdings verweist er ab hier auf eine .exe File und soweit ich weiß kommt Unix (ohne Wine) mit dem Dateiformat nicht wirklich zurecht.

Um es etwas verständlicher zu machen was ich meine, hier der Befehl mit Fehlermeldung (ohne TARGET, da er sonst vorher abbrechen würde):

_$ gcc -g -IBASE_DIR/ecos-work/install/include hello.c -LBASE_DIR/ecos-work/install/lib -Ttarget.ld -nostdlib
/usr/lib/gcc/i686-pc-cygwin/3.4.4/…/…/…/…/i686-pc-cygwin/bin/ld: cannot open linker script file target.ld: No such file or directory _
(Im Ordner /usr/i686-pc-cygwin/bin besteht der Inhalt ausschließlich aus .exe Files [ar.exe; as.exe; ld.exe; nm.exe; ranlib.exe; strip.exe])

Ich habe auch schon die target.ld mal in das gesuchte Verzeichnis verschoben (/usr/i686-pc-cygwin/bin/), allerdings ändert sich die Fehlermeldung nicht.

Ich kann es mir nur noch so erklären, dass das Linkerskript speziell für die Hardware geschnitten ist und ohne die TARGET Anweisung nicht läuft (leider kenne ich mich mit Linkerskripts nicht wirklich aus).
Wobei wieder die Frage aufkommt wie ich das Ganze für meine Hardware kompiliere :wink:

Vielen Danke für deine Hilfe :smile:

Gruß

Fritze

Gruß,
Stahlkopf

Hilfe bei Erstellung von eCos [Edit Nr2]
Hallo,

so schnell kann man zu neuen Erkenntnissen kommen! Ich habe nämlich TARGET immer falsch gesetzt. Jetzt habe ich es auf folgendes gesetzt:
$ export TARGET=„nios2-elf“

… Allerdings verweist er ab hier auf eine .exe File und
soweit ich weiß kommt Unix (ohne Wine) mit dem Dateiformat
nicht wirklich zurecht.

Um es etwas verständlicher zu machen was ich meine, hier der
Befehl mit Fehlermeldung

(mit TARGET):

$ TARGET-gcc -g -IBASE_DIR/ecos-work/install/include hello.c
-LBASE_DIR/ecos-work/install/lib -Ttarget.ld -nostdlib
/usr/lib/gcc/i686-pc-cygwin/3.4.4/…/…/…/…/i686-pc-:cygwin/bin/ld:
cannot open linker script file target.ld: No such file or
directory

collect2: ld returned 1 exit status

(Im Ordner /usr/i686-pc-cygwin/bin besteht der Inhalt
ausschließlich aus .exe Files [ar.exe; as.exe; ld.exe; nm.exe;
ranlib.exe; strip.exe])

Mit anderen Worten: Ich denke dass ich durch das (jetzt hoffentlich richtig) gesetzte TARGET nicht mehr für den x86 kompiliere. Allerdings bleibt die Fehlermeldung mit dem Linker Skript gleich.

Hast du eine Idee woran das liegen könnte?

Nochmal Danke für deine Hilfe!

Gruß,
Stahlkopf

Hallo,

Mit anderen Worten: Ich denke dass ich durch das (jetzt
hoffentlich richtig) gesetzte TARGET nicht mehr für den x86
kompiliere. Allerdings bleibt die Fehlermeldung mit dem Linker
Skript gleich.

Hast du eine Idee woran das liegen könnte?

Die Fehlermeldung ist doch recht eindeutig. Der Linker kann die Datei nicht finden. In welchem Verzeichnis rufst Du den Compiler auf und wo steht die Datei? Übrigens: Die -T Option ist wie gesagt für den Linker, nicht den Compiler. Also ist die zugehörige Manpage nicht „man gcc“ sondern „man ld“.

Gruß

Fritze

1 „Gefällt mir“

Danke
Hallo Fritze,

Die Fehlermeldung ist doch recht eindeutig. Der Linker kann
die Datei nicht finden. In welchem Verzeichnis rufst Du den
Compiler auf und wo steht die Datei?

Ja, da hast du recht, die Fehlermeldung ist eindeutig. Ich bin nur ewig nicht darauf gekommen, da ich mit dem Befehl -LBASE_DIR/ecos-work/install/lib schon genau auf die Datei verweise (dachte ich). Mein Fehler bestand darin, dass ich ja den Inhalt der Variable haben will und nicht die Varbiable direkt. Deswegen muss der Aufruf genau heißen:

$ $TARGET-gcc -g -I$BASE_DIR/ecos-work/install/include hello.c -L$BASE_DIR/ecos-work/install/lib -Ttarget.ld -nostdlib

Ich sollte mir merken keine Variablen in der BASH zu verwenden wenn ich nicht richtig damit umgehen kann :wink:

Übrigens: Die -T Option
ist wie gesagt für den Linker, nicht den Compiler. Also ist
die zugehörige Manpage nicht „man gcc“ sondern „man ld“.

Danke, danke, danke, danke! Das war absolut blöd von mir. Durch das schmökern in (jetzt endlich) dem richtigen Manual ist mir eben das mit -L richtig aufgefallen.

Du hast meine tagelange, sinnlose Odysee beendet :stuck_out_tongue:

Gruß

Fritze

Gruß,
Stahlkopf