www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Subroutine Aufruf


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <stdio.h>
#include <xgpio.h>
#include <xparameters.h>
//#include <xstatus.h>
//#include <xgpio_l.h>

#define LED_ID XPAR_LEDS_8BIT_DEVICE_ID

#define LED_DELAY     5000

void gauss ();

int idum;
int n; 

int main(void)
{
print("*** Ready ***\r\n");
XGpio led;



double Delay;
int i  = 0;
int j  = 0x01;


XGpio_Initialize(&led, LED_ID);
XGpio_mSetDataDirection(XPAR_LEDS_8BIT_BASEADDR,1,0); //Set LEDS as output ports

  while(1) 
  {
  print("while(1) \r\n");
  XGpio_mSetDataReg(XPAR_LEDS_8BIT_BASEADDR,1,idum);
  
  idum = -XUartLite_RecvByte(XPAR_RS232_UART_1_BASEADDR);
  gauss();
  n= n * 1000;
   xil_printf (" calculated idum: %d \r\n", n);
  //XGpio_DiscreteWrite(&led, 1, 0xAA);
  }
return (0);
}

subroutine:
void gauss()

{
    extern n;
    extern idum;
    
    // ... do something

   return;
}


Bitte sagt mir was ich falsch mache!!!!

LG
Thomas

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas schrieb:

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

Und wo ist die Funktion gauss()?

Selbes *.c File oder ein anderes?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke.

Werde das Makefile umarbeiten.

Danke für die superschnelle Hilfe!!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.