Forum: Mikrocontroller und Digitale Elektronik Assemblerdatei in C-Code einbinden


von Petra (Gast)


Lesenswert?

Hallo,

ich möchte eine Assembler-Funktion in C-Code (AVR-GCC) einbinden.
Die Assembler Datei sieht so aus und ist unter uart.S gespeichert:

#include "avr/io.h"
.extern data
.global UART_Receive
.func UART_Receive
UART_Receive:
1:
  sbis _SFR_IO_ADDR(UCSR0A), _SFR_IO_ADDR(RXC0)
  rjmp 1b
  in 17, _SFR_IO_ADDR(UDR0)
  ret
.endfunc
.end

Im Makefile wird diese Datei mit: ASRC = uart.S eingebunden.
Im C-Code wird die Funktion UART_Receive als extern deklariert und dann 
ganz normal aufgerufen.
Wenn ich compilieren will, kommt folgende Fehlermeldung:
undefined reference to `UART_Receive'
Was mache ich falsch?? Vielen Dank schon mal für eure Hilfe!!!

von Florian (Gast)


Lesenswert?

Du must auch die entstehende uart.o linken. Vermutlich ist es auch nicht 
das beste, die Funktion als extern zu deklarieren, also einfach void 
UART_Receive( void );

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Diese Assemblerdatei hat einen Fehler und es wird keine Objektdatei 
erzeugt. Deswegen findet der Linker auch die Funktion nicht.

Ohne Gewähr - Probiere mal
1
#include "avr/io.h"
2
.extern data
3
.global UART_Receive
4
.func UART_Receive
5
UART_Receive:
6
1:
7
//  sbis _SFR_IO_ADDR(UCSR0A), _SFR_IO_ADDR(RXC0)
8
  sbis _SFR_IO_ADDR(UCSR0A), RXC0
9
  rjmp 1b
10
  in 17, _SFR_IO_ADDR(UDR0)
11
  ret
12
.endfunc
13
.end

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.