Arduino: init()-Methode einbinden

#3890265
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
Angehängte Dateien:
Gast #3890306
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.
#3890333
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.
#3890346
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.
#3890459
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.
Gast #3891420
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 :)
Angehängte Dateien:
Gast #3895051
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!

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