Forum: Compiler & IDEs Atmel Studio 6 - Linker findet Funktion nicht


von Julian R. (julianr)


Angehängte Dateien:

Lesenswert?

Ich habe mir ein Arudino Due kompatibles Board besorgt und wollte damit 
ein bisschen in FreeRTOS einsteigen (nach Application Note AT04056).

Ich habe also ein neues ASF projekt erstellt und das Arduino Due/X Board 
ausgewählt, FreeRTOS hinzugefügt und kompiliert. Soweit alles gut.

Nun wollte ich den worker1 task aus der main.c auslagern und habe dazu 
zwei files erstellt:
worker1.h
1
#ifndef WORKER1_H_
2
#define WORKER1_H_
3
4
static void worker1_task(void *pvParameters);
5
6
#endif /* WORKER1_H_ */

und worker1.c
1
#include <asf.h>
2
#include "worker1.h"
3
4
static void worker1_task(void *pvParameters)
5
{
6
  for(;;)
7
  {
8
    /* task application*/
9
  }
10
  /* Should never go there */
11
  vTaskDelete(NULL);
12
}

Wenn ich nun allerdings die worker.h in der main.c includiere:
1
#include <asf.h>
2
#include "worker1.h"
3
4
/* Task handler declaration*/
5
xTaskHandle worker1_id;
6
7
int main (void)
8
{
9
  /* Insert system clock initialization code here (sysclk_init()). */
10
  sysclk_init();
11
  board_init();
12
13
  /* Create Worker 1 task */
14
  xTaskCreate(worker1_task,"Worker 1",configMINIMAL_STACK_SIZE+1000,NULL, 2,& worker1_id);
15
  /*Start Scheduler*/
16
  vTaskStartScheduler();
17
  for(;;);
18
}
bekomme ich diesen merkwürdigen Fehler (siehe Screenshot). Ich habe 
vorher noch nie mit der arm toolchain von Atmel gearbeitet (auf der 
Arbeit nutzten wir Keil). Die worker1.c wird kompiliert (ein .o File 
wird erstellt) aber der Linker findet das nicht.

Hat jemand ne Idee was ich falsch mache?

von Bastler (Gast)


Lesenswert?

Static bedeutet: wird nur lokal gebraucht, also Symbol NICHT 
exportieren.
Der Linker hat keine Info mehr, daß es die Funktion gibt,
Static wegmachen und im .h extern davor.

von Peter (Gast)


Lesenswert?

Bastler schrieb:
> und im .h extern davor.

Braucht man nur bei Variablen, nicht bei Funktionen.

von Bastler (Gast)


Lesenswert?

Ist aber erlaubt, konsistent zu anderem und dokumentiert was man meint. 
Anderorts wird doch immer über die Ungeradlinigkeit von C lamentiert. 
Hier kann man diese überwinden.

von Julian R. (julianr)


Lesenswert?

Bastler schrieb:
> Static bedeutet: wird nur lokal gebraucht, also Symbol NICHT
> exportieren.
> Der Linker hat keine Info mehr, daß es die Funktion gibt,
> Static wegmachen und im .h extern davor.

Man ist das peinlich. Schande über mein Haupt...
Du hast natürlich vollkommen Recht, ohne static gehts.
Ich hab in letzter Zeit ausschließlich C++ geschrieben ... da haben 
statische Klassenfunktionen ja eine andere bedeutung.

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.