undefined reference to ...
Hallo!
Ich habe hier ein Programm für die serielle Schnittstelle nur leider kann ich es nicht übersetzen, auch wenn ich allen code rauskommentiere. Es erscheint diese Fehlermeldung:
Code:
Linking: main.elf
avr-gcc -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o -std=gnu99 -Wundef -MMD -MP -MF .dep/main.elf.d main.o --output main.elf -Wl,-Map=main.map,--cref -lm
c:/programme/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr5/crtm32.o: In function `__vectors':
../../../../../avr-libc-1.4.6/crt1/gcrt1.S:51: undefined reference to `main'
make: *** [main.elf] Error 1
Meine Suchen im Forum ergaben, dass ich vergessen habe eine Datei im Makefile zu linken. Nur welche?
Das ist mein Code:
Code:
/////////////////////////////////////////////////////////////////////
// Arios: Serial Interface functions //
/////////////////////////////////////////////////////////////////////
// Author: Johannes Neumann //
// Date of completion: **.**.**** //
/////////////////////////////////////////////////////////////////////
// Defines //////////////////////////////////////////////////////////
#include <avr/interrupt.h>
#include <avr/io.h>
//#include <avr/signal.h>
#include <string.h>
#define cReadBufferSize 32
#define cWriteBufferSize 512
#define cBlockung 1
#define cNonBlocking 0
#define cTXComplete 1;
#define cTXNotComplete 0;
// Variables ////////////////////////////////////////////////////////
volatile unsigned int TXComplete;
volatile unsigned int WritePointer0 = 0, WritePointer1 = 0;
volatile unsigned int ReadPointer0 = 0, ReadPointer1 = 0;
volatile unsigned char ReadBuffer[cReadBufferSize];
volatile unsigned char WriteBuffer[cWriteBufferSize];
// Init /////////////////////////////////////////////////////////////
void RS232_init(long unsigned int baudrate) {
UCSRA = 0x00;
UCSRB = (1 << RXCIE) | (1 << RXEN);
UCSRC = (1 << UCSZ1) | (1 << UCSZ0) | (1 << URSEL);
UBRRH = (((F_CPU/baudrate) >> 4) - 1) >> 8;
UBRRL = (((F_CPU/baudrate) >> 4) - 1) & 0xFF;
TXComplete = cTXComplete;
}
// Send /////////////////////////////////////////////////////////////
int RS232_send(char *c, int blocking) {
int i;
for (i=0; i< strlen(c);i++) {
if ((cWriteBufferSize + WritePointer1 - WritePointer0) % cWriteBufferSize >
(cWriteBufferSize - 2)) {
if (blocking) {
while((cWriteBufferSize + WritePointer1 - WritePointer0) % cWriteBufferSize >
(cWriteBufferSize - 2));
}
else
return i;
}
TXComplete = cTXComplete;
asm("cli");
WriteBuffer[WritePointer1++] = c[i];
if (WritePointer1 > cWriteBufferSize - 1) WritePointer1 = 0;
asm("sei");
UCSRB = (1<<TXEN) | (1<<UDRIE);
}
return i;
}
// Receive //////////////////////////////////////////////////////////
int RS232_receive(char *c, int length, int blocking) {
int i;
for (i=0; i<length; i++) {
if (ReadPointer0 == ReadPointer1) {
if (blocking) while(ReadPointer0 == ReadPointer1);
else return i;
}
c[i] = ReadBuffer[ReadPointer1++];
if (ReadPointer1 > cReadBufferSize - 1) ReadPointer1 = 0;
}
return length;
}
// Complete? ////////////////////////////////////////////////////////
int RS232_WritingComplete(void) {
return TXComplete;
}
// Count of Bytes in ReadBuffer /////////////////////////////////////
int RS232_GetBytesInReadBuffer(void) {
return (cReadBufferSize + ReadPointer1-ReadPointer0) % cReadBufferSize;
}
// Count of Bytes in WriteBuffer ////////////////////////////////////
int RS232_GetBytesInWriteBuffer(void) {
return (cWriteBufferSize + WritePointer1-WritePointer0) % cWriteBufferSize;
}
// Interrupt for Reading ////////////////////////////////////////////
SIGNAL (SIG_UART_RECV) {
ReadBuffer[ReadPointer0++] = UDR;
if (ReadPointer0 > cReadBufferSize) ReadPointer0 = 0;
}
// Interrupt for writing Data into UDR //////////////////////////////
SIGNAL (SIG_UART_DATA) {
UDR = WriteBuffer[WritePointer0++];
if (WritePointer0 < cWriteBufferSize - 1) WritePointer0 = 0;
if (WritePointer0 == WritePointer1) UCSRB = (1<<TXEN) | (1<<TXCIE);
}
// Interrupt for setting Complete-Flag //////////////////////////////
SIGNAL (SIG_UART_TRANS) {
UCSRB = (1<<RXCIE) | (1<<RXEN);
TXComplete = cTXComplete;
}
Danke,
Bääääär