Question

J'utilise la bibliothèque v-usb pour mon projet.J'ai écrit du code et je veux le compiler, mais malheureusement j'ai une erreur que je ne parviens pas à résoudre.Voici ma capture d'écran :

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

Cette situation est pour moi étrange car j'ai en en-tête ceci :

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

Et usbdrv/usbdrv.h définit le USBpoll fonction:

Le compilateur ne devrait-il pas pouvoir le compiler ?

Voici mon projet : http://goo.gl/P6ujK

Et voici l'intégralité de mon répertoire d'espace de travail : http://minus.com/mbhTkJuvOK#1

Voici mon code :principal 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;
}
Était-ce utile?

La solution

Vous devez établir un lien avec n'importe quel fichier fourni usbInit etc., d'après l'apparence de vos captures d'écran, vous avez montré le fichier usbdrv.c, mais vous ne l'avez pas réellement compilé/lié dans votre projet.Seul usbdrv.h s'affiche dans l'arborescence.

#includele fichier d'en-tête montre au compilateur le déclaration de la fonction, vous devez vous assurer qu'elle voit le définition quelque part aussi.

Autres conseils

solution:

mv usbdrv.c usbdrv.cpp

ou compiler avec avr-g++

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top