Forum: Mikrocontroller und Digitale Elektronik Subroutine Aufruf


von Thomas (Gast)


Lesenswert?

Liebe Kollegen!

Ich versuche gerade eine Funktion auf meinem Microblaze Prozessor zu 
implememtieren. Leider scheitert es immer am Funktionsaufruf.
Kann mir jemand weiterhelfen!?

Fehler:
/cygdrive/x/Microblaze_Test/ML605_MB_Test/Random_test/Random.c:103:2: 
warning: no newline at end of file
/cygdrive/c/DOKUME~1/adi/LOKALE~1/Temp/cchnNATm.o: In function `main':
/cygdrive/x/Microblaze_Test/ML605_MB_Test/Random_test/main.c:34: 
undefined reference to `gauss'
collect2: ld returned 1 exit status
make: *** [random_test/executable.elf] Error 1
ERROR:EDK - Error while running "make -f system.make init_bram".
   Return code = 2

main:
1
#include <stdio.h>
2
#include <xgpio.h>
3
#include <xparameters.h>
4
//#include <xstatus.h>
5
//#include <xgpio_l.h>
6
7
#define LED_ID XPAR_LEDS_8BIT_DEVICE_ID
8
9
#define LED_DELAY     5000
10
11
void gauss ();
12
13
int idum;
14
int n; 
15
16
int main(void)
17
{
18
print("*** Ready ***\r\n");
19
XGpio led;
20
21
22
23
double Delay;
24
int i  = 0;
25
int j  = 0x01;
26
27
28
XGpio_Initialize(&led, LED_ID);
29
XGpio_mSetDataDirection(XPAR_LEDS_8BIT_BASEADDR,1,0); //Set LEDS as output ports
30
31
  while(1) 
32
  {
33
  print("while(1) \r\n");
34
  XGpio_mSetDataReg(XPAR_LEDS_8BIT_BASEADDR,1,idum);
35
  
36
  idum = -XUartLite_RecvByte(XPAR_RS232_UART_1_BASEADDR);
37
  gauss();
38
  n= n * 1000;
39
   xil_printf (" calculated idum: %d \r\n", n);
40
  //XGpio_DiscreteWrite(&led, 1, 0xAA);
41
  }
42
return (0);
43
}

subroutine:
1
void gauss()
2
3
{
4
    extern n;
5
    extern idum;
6
    
7
    // ... do something
8
9
   return;
10
}

Bitte sagt mir was ich falsch mache!!!!

LG
Thomas

von Oliver (Gast)


Lesenswert?

Thomas schrieb:
> /cygdrive/x/Microblaze_Test/ML605_MB_Test/Random_test/Random.c:103:2:
> warning: no newline at end of file

Am Ende der Datei hätte der Compiler gerne noch eine Leerzeile

Thomas schrieb:
> /cygdrive/c/DOKUME~1/adi/LOKALE~1/Temp/cchnNATm.o: In function `main':
> /cygdrive/x/Microblaze_Test/ML605_MB_Test/Random_test/main.c:34:
> undefined reference to `gauss'

Der linker vermisst die Funktion gauss. Da wird dein makefile einen 
Fehler haben.

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Thomas schrieb:

> Bitte sagt mir was ich falsch mache!!!!

Und wo ist die Funktion gauss()?

Selbes *.c File oder ein anderes?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Das sieht für mich so aus:

Die Definition der Funktion gauss() steckt in der Datei "subroutine" und 
diese Datei bzw. deren Kompilat ist dem Linker ld nicht bekannt. 
Folglich mosert ld die fehlende Funktion an.

Quickfix: Schreibe die Definition der Funktion gauss() ebenfalls in die 
Datei "main"

Nachhaltiger Fix: Passe das Makefile so an, dass alle C-Dateien deines 
Projekts darin enthalten sind.

von Thomas (Gast)


Lesenswert?

die Funktion gauss() steht in einem eigenen File.

ich hab den Quickfix probiert. Das funktioniert. Eigenartig ist, dass 
ich noch eine 2. Funktion habe die immer noch im eigenen File ist. Die 
geht!?

Eigentlich steht die .c Datei mit den Subroutinen bei den sources im 
Compiler.

LG
Thomas

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Im Dateiverzeichnis bei den anderen Sourcen reicht nicht; sie muss 
namentlich im Makefile (bzw. im Projekt wenn du mit einer IDE arbeitest) 
stehen.

von Karl H. (kbuchegg)


Lesenswert?

Thomas schrieb:

> Eigentlich steht die .c Datei mit den Subroutinen bei den sources im
> Compiler.

Der Fehler kommt vom Linker
und zuständig ist das Makefile, welches dem Linker alle übersetzten *.c 
Files (die Objekt-files *.o) angeben muss, damit der die Einzelteile 
auch findet. Der Linker sucht nämlich nicht selbsttätig alles Files ab, 
die er auf einem Verzeichnis findet, ob er von dort etwas brauchen kann.

von Thomas (Gast)


Lesenswert?

Ok, danke.

Werde das Makefile umarbeiten.

Danke für die superschnelle Hilfe!!!

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.