2012-01-26 4 views
2

Я использую библиотеку v-usb для своего проекта. Я написал код, и я хочу скомпилировать его, но, к сожалению, у меня есть ошибка, которую я не могу решить. Вот мой скрин-шот:Неопределенная ссылка на `usbInit 'в C AVR

enter image description here

Description Resource Path Location Type 
make: *** [USB_module.elf] Error 1 USB_module   C/C++ Problem 
undefined reference to `usbInit' main.c /USB_module  C/C++ Problem 
undefined reference to `usbMsgPtr' main.c /USB_module  C/C++ Problem 
undefined reference to `usbPoll' main.c /USB_module  C/C++ Problem 

Эта ситуация для меня странно, потому что я в заголовке этого:

#include "usbconfig.h" 
#include "usbdrv/usbdrv.h" 
#include "usbdrv/oddebug.h" 

И usbdrv/usbdrv.h определяет USBpoll функцию:

Разве компилятор не может скомпилировать его?

Вот мой проект: http://goo.gl/P6ujK

А вот весь мой рабочий каталог: http://minus.com/mbhTkJuvOK#1

Вот мой код: main.c:

/* 
* main.c 
* 
* Created on: 25-01-2012 
*  Author: Bordeux 
*/ 
#define F_CPU 12000000 
#include <avr/io.h> 
#include <avr/interrupt.h> 
#include <avr/pgmspace.h> 
#include <avr/wdt.h> 

#include "usbconfig.h" 
#include "usbdrv/usbdrv.h" 
#include "usbdrv/oddebug.h" 


#define DDS1_SDA (1<<1)   //PORTB1 
#define DDS_SCL (1<<3)   //PORTB3 
#define DDS_UPDATE (1<<4)  //PORTB4 

static uchar usb_val; 

USB_PUBLIC uchar usbFunctionWrite(uchar *data, uchar len) //sends len bytes to DDS_SDA 
{ 
    uchar i; 
    uchar b; 
    uchar adr=0; 
    while (len!=0) 
    { 
     b=1; 
     for (i=0; i<8; i++) 
     { 
      if (b & data[adr]) 
      { 
       PORTB = (PORTB | DDS1_SDA) & ~DDS_SCL; 
       PORTB = PORTB | DDS_SCL; 
      } 
      else 
      { 
       PORTB = PORTB & (~DDS1_SDA & ~DDS_SCL); 
       PORTB = PORTB | DDS_SCL; 
      } 
      b=b<<1; 
     } 
     len--; 
     adr++; 
    } 
    if (usb_val) 
    { 
     PORTB = PORTB | DDS_UPDATE;// update DDS 
     PORTB = PORTB & ~DDS_UPDATE; 
    } 
    return 1; 
} 


USB_PUBLIC uchar usbFunctionSetup(uchar data[8]) 
{ 
    usbRequest_t *rq = (void *)data; 
    static uchar replyBuf[3]; 
    usbMsgPtr = replyBuf; 
    if(rq->bRequest == 0)   // ECHO value 
    { 
     replyBuf[0] = data[2]; // rq->bRequest identical data[1]! 
     replyBuf[1] = data[3]; 
     return 2; 
    } 
    if(rq->bRequest == 1)   // set port directions 
    { 
     // DDRA = data[2]; 
     DDRB = data[3];    
     DDRD = data[4] & (~USBMASK & ~(1 << 2)); // protect USB interface 
     return 0; 
    } 
    if(rq->bRequest == 2)   // read ports 
    { 
     // replyBuf[0] = PINA; 
     replyBuf[1] = PINB; 
     replyBuf[2] = PIND; 
     return 3; 
    } 
    if(rq->bRequest == 3)   // read port states 
    { 
     // replyBuf[0] = PORTA; 
     replyBuf[1] = PORTB; 
     replyBuf[2] = PORTD; 
     return 3; 
    } 
    if(rq->bRequest == 4)   // set ports 
    { 
     // PORTA = data[2]; 
     PORTB = data[3]; 
     PORTD = data[4]; 
     return 0; 
    } 
    if(rq->bRequest == 5)  // use usbFunctionWrite to transfer len bytes to DDS 
    { 
     usb_val = data[2];  // usb_val!=0 => DDS update pulse after data transfer 
     return 0xff; 
    } 
    if(rq->bRequest == 6) 
    { 
     PORTB = PORTB | DDS_UPDATE; // issue update pulse to DDS 
     PORTB = PORTB & ~DDS_UPDATE; 
     return 0; 
    } 
    replyBuf[0] = 0xff;   // return value 0xff => command not supported 
    return 1; 
} 


int main(void) 
{ 
    wdt_enable(WDTO_1S);   // set Watchdog Timer 
    odDebugInit(); 
    PORTB=0xe0;     // Set PortB 0-4 zero 
    DDRB=0x1f;     // Set PORTB 0-4 output 
    PORTD = 0;     /* no pullups on USB pins      */ 
    DDRD = ~USBMASK & ~(1 << 2); /* all outputs except USB data and PD2 = INT0 */ 
    usbInit(); 
    sei(); 
    for(;;)      /* main event loop       */ 
    { 
     wdt_reset();    // restart watchdog timer 
     usbPoll(); 
    } 
    return 0; 
} 

ответ

2

Вы должны связать с какой-либо файл расходные материалы usbInit и т. д., с внешнего вида ваших снимков экрана вы показали файл usbdrv.c, но на самом деле не скомпилировали/не связали его с вашим проектом. В древовидной структуре отображается только usbdrv.h.

#include ИНГ файл заголовок показывает компилятору декларацию функции, вам необходимо убедиться, что он видит определения где-то тоже.

2

решение:

mv usbdrv.c usbdrv.cpp 

или скомпилировать с avr-g++

+0

удивительно изменение названия действительно работает! такое простое решение! – Chris