Forum: Compiler & IDEs Arduino: init()-Methode einbinden


von Jonas H. (programmer007)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

Danke schon mal im voraus an diejenigen, welche sich nun mit meinem 
Problem beschäftigen:

Ich bin dabei mittels CMake ein hex-File für mein Arduino Yun Board 
(atmega32u4) zu erstellen. Hier ist einmal mein Code:

------------------------------------------------------------------------ 
----
test.c:
1
#include <stdio.h>
2
#include  "Arduino.h"
3
4
void setup() {
5
  printf("Test");
6
}
7
8
void loop() {
9
 
10
}
11
12
int main(void)
13
{
14
  init();  //reference undefined?!?
15
  setup();
16
  for(;;)
17
  {
18
    loop();
19
  }
20
  return 0;
21
}
------------------------------------------------------------------------ 
----

Der include der Arduino Header Datei sollte stimmen. Wenn ich die 
init()-Methode auskommentiere, erhalte ich keinerlei Fehler und das hex 
File wird erstellt. Jedoch wenn ich das hex File auf das Board lade, 
kann man das Board über die Ports nicht mehr ansprechen =(.
Sofern jedoch die init-Methode aufgerufen wird, kommt es zu diesem 
Fehler:

test.c:30: undefined reference to `init'


Mein toolchain und die CMakeLists-Textdatei habe ich in den Anhang 
gepackt.

Kann sich jemand vorstellen woran es liegen kann? Könnte mir vorstellen, 
dass ein include fehlt, aber ich weiß nicht welchen ich noch einfügen 
könnte.

Beste Grüße

: Bearbeitet durch User
von Kaj (Gast)


Lesenswert?

was soll init() denn machen?

Jonas Hamers schrieb:
> test.c:30: undefined reference to `init'
Natürlich. weil die funktion in keinem deiner header deklariert ist, 
sprich: Der Compiler kennt die Funktion nicht, und kann sie auch nicht 
finden. Das ist so, als wenn du statt init() schreiben würdest: 
los_mach_was_am_besten_weltherrschaft()
Das gibt unter diesen voraussetzungen den selben fehler.

Jonas H. schrieb:
> Könnte mir vorstellen,
> dass ein include fehlt, aber ich weiß nicht welchen ich noch einfügen
> könnte.
Am besten das, in dem init() steht... welches das ist, musst Du 
wissen.

von Jonas H. (programmer007)


Lesenswert?

Ich habe es so verstanden, dass ich die Methode init() am Anfang 
aufrufen muss, um das Board zu initialisieren, und um zu verhindern, 
dass man das Board nicht mehr über einen Port ansprechen kann.

Die Arduino Header Datei habe ich nicht selbst geschrieben, und weiß 
demnach auch nicht wo sich die Implementierung der init-Methode 
versteckt. Möglicherweise in einer dll. Datei? ...Aber an dem Wissen 
scheitere ich gerade. Ich habe gedacht es würde ausreichen, Arduino 
1.0.6 zu installieren und den include der Arduino.h Datei auszuführen.

von Karl H. (kbuchegg)


Lesenswert?

Ein 'undefined reference' ist keine Fehlermeldung vom Compiler, sondern 
vom Linker.

Dir fehlt also nicht irgendein include, sondern die Bibliothek, in der 
die init Funktion tatsächlich implementiert ist. Im Header File steht ja 
mehr oder weniger lediglich "Es gibt eine init Funktion". Beim Linken 
kommt dann aber die Stunde der Wahrheit: Wo ist diese Funktion 
tatsächlich?

Wird sie in dem zu linkenden nicht gefunden, dann gibt es eben eine 
'undefined reference'.

Also: rausfinden, was du zu deinem Arudino-Nachbau sonst noch so alles 
dazu linken musst.

> Möglicherweise in einer dll. Datei?

Nein. DLL sind eine Windows Spezialität. Die Libraries, die dich 
interessieren haben die Dateiendung *.a
Also Verzeichnisbaum mal durchsuchen, wo sich derartige Dateien 
befinden.

: Bearbeitet durch User
von Jonas H. (programmer007)


Lesenswert?

Danke dir auf jeden Fall schon mal für deine Antwort.
Hast du denn eine grobe Vorstellung was ich dazu linken müsste? Ob es 
eine schon bestehende Datei im Arduino Verzeichnis ist? Welche Endung 
sie haben müsste oder wo ich wie das Linken bewerkstelligen müsste?

von Karl H. (kbuchegg)


Lesenswert?

Jonas H. schrieb:

> Ich habe gedacht es würde ausreichen, Arduino
> 1.0.6 zu installieren und den include der Arduino.h Datei auszuführen.

Wenn du sowieso die Arduino IDE installiert hast und auch mit der 
arbeitest, dann brauchst du dich doch um das gaze Gedöns mit der main() 
überhaupt nicht kümmern. Das macht doch die IDE für dich. Oder nicht?

von Jonas H. (programmer007)


Lesenswert?

Ja, das würde Sie tun. Jedoch sitze ich an der Aufgabe, einen 
Build-Prozess automatisch starten zu lassen und kann dann die IDE nicht 
händisch nutzen. Deswegen muss ich das hex File ohne IDE erstellen..

von Jonas H. (programmer007)


Lesenswert?

Habe eine *.a Datei gefunden die passen könnte
(libgcc.a) im Verzeichnis 
\Arduino\hardware\tools\avr\lib\gcc\avr\4.3.2\avr5

...wie linke ich die nun zu meiner Klasse?

von Karl H. (kbuchegg)


Lesenswert?

Jonas H. schrieb:
> Habe eine *.a Datei gefunden die passen könnte
> (libgcc.a) im Verzeichnis

Nope. Die passt ganz sicher nicht.
libgcc.a ist die Standard Library, die sowieso dazu gelinkt wird.

von Jonas H. (programmer007)


Lesenswert?

Ich hätte nun gedacht, dass ich die init-Methode in einer Standard 
Library finden könnte. Bist du dir denn sicher, dass die automatisch 
(wenn ich ohne der IDE arbeite) dazu gelinkt wird?

von Karl H. (kbuchegg)


Lesenswert?

Wo hast du denn das main her?

Die schreibst du ja normalerweise nicht selbst.
Ich geh mal davon aus, dass du dir ja wohl in der Arduino IDE ein 
Projekt zusammengestellt hast, und dann nachgesehen hast, was die IDE 
damit macht. Bzw. auf den Arduino Verzeichnissen das standardmässige 
main dir gesucht hast.


Und ja, ich bin mir sicher, dass init() keine C++ Standardfunktion ist 
und daher aus der Arduino Umgebung dazu gelinkt werden muss.

Mehr sag ich nicht, sonst geht mir die Galle hoch.

: Bearbeitet durch User
von Jonas H. (programmer007)


Lesenswert?

Nein mit der IDE habe ich gar nicht gearbeitet. Ich versuche lediglich 
aus einer c.Datei ein Hex File zu erzeugen, welches ich nachher aufs 
Board laden möchte.
Jede c.Datei braucht eine main und diese muss die setup und loop 
function aufrufen. Die Infos habe ich lediglich diesem Link entnommen:
http://playground.arduino.cc/Code/Netbeans

von IANAL (Gast)


Lesenswert?

Jonas H. schrieb:
> Die Infos habe ich lediglich diesem Link entnommen:
> http://playground.arduino.cc/Code/Netbeans

Dann folge der Anleitung ganz.

Ich vermute der Fehler liegt bei Schritt
"Compiling the Arduino core lib"

oder danach bei "Add library: Add libarduino_corelib.a file "

Denn da sollte die init()-Methode drinnen sein.

von Kaj (Gast)


Angehängte Dateien:

Lesenswert?

Karl Heinz schrieb:
> Ein 'undefined reference' ist keine Fehlermeldung vom Compiler, sondern
> vom Linker.
Ok, mein fehler :)

Jonas H. schrieb:
> Ich habe gedacht es würde ausreichen, Arduino
> 1.0.6 zu installieren und den include der Arduino.h Datei auszuführen.
Da ist das Problem. Wenn du mal auf die arduino-seite gehst, unter 
Downloads, und die seite liest, dann dürfter dier folgendes auffallen:
siehe Bild

So, finde dein Fehler und behebe ihn :)

von chris_ (Gast)


Lesenswert?

#include "arduino.h"

oder

#include "Arduino.h"


fehlt wahrscheinlich.

von Kaj (Gast)


Lesenswert?

chris_ schrieb:
> #include "arduino.h"
>
> oder
>
> #include "Arduino.h"
>
> fehlt wahrscheinlich.

Jonas H. schrieb:
> test.c:
> #include <stdio.h>
> #include  "Arduino.h"

Ich sag, ein Problem wird wohl sein, das die 1.0.6 keinen Support für 
den Yun inbegriffen hat. den gibt es erst seit der 1.5.6-beta. Das der 
Support nicht vorhanden ist, merkt man schon daran, das man das Board 
gar nicht in der IDE auswählen kann. Das erklärt auch, warum
Jonas H. schrieb:
> Jedoch wenn ich das hex File auf das Board lade,
> kann man das Board über die Ports nicht mehr ansprechen =(.
das passiert. Der Code wird nicht für den Yun Compiliert und das 
Flashprogramm geht auch von irgendeinem anderen Controller aus.

Jonas H. schrieb:
> Ich habe gedacht es würde ausreichen, Arduino
> 1.0.6 zu installieren
Da fängt das Problem an: Falsche version der IDE!

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.