首页 > 解决方案 > 如何在eclipse中修复“ld返回1退出状态”

问题描述

当我尝试在 Eclipse 中编译代码时,会发生此错误,

错误

Building target: 0001_BLDC_test.elf
Invoking: AVR C Linker
avr-gcc -Wl,-Map,0001_BLDC_test.map -mmcu=atmega32a -o "0001_BLDC_test.elf"  ./bldc.o ./main.o   
./main.o: In function `bezpiecznik':
main.c:(.text.bezpiecznik+0x0): multiple definition of `bezpiecznik'
./bldc.o:bldc.c:(.text.bezpiecznik+0x0): first defined here
./main.o: In function `bezpiecznik_stop':
main.c:(.text.bezpiecznik_stop+0x0): multiple definition of `bezpiecznik_stop'
./bldc.o:bldc.c:(.text.bezpiecznik_stop+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
make: *** [0001_BLDC_test.elf] Błąd 1

我使用Windows 10,我在 ECLIPSE 中尝试相同的代码,Atmel Sutdio 7.0但我仍然有相同的错误。

代码

#include <avr/io.h>
#include <util/delay.h>
#include "bldc.h"
#include "bldc.c"


//------------------------------------------------------------------

int main (void)
{

 //ustaw  i stan początkowy wyjść strujących tranzystorami
 U_TR_G_USTAW_DDR
 V_TR_G_USTAW_DDR
 W_TR_G_USTAW_DDR
 U_TR_D_USTAW_DDR
 V_TR_D_USTAW_DDR
 W_TR_D_USTAW_DDR
 U_TR_G_PIN_L
 V_TR_G_PIN_L
 W_TR_G_PIN_L
 U_TR_D_PIN_L
 V_TR_D_PIN_L
 W_TR_D_PIN_L


 //na wszelki wypadek
 WYLACZ_TRANZYSTORY


 //UWAGA!!!
 //Testuj program dowolnie sterując tranzystorami usuwając znak komentarza
 //w poniższych instrukcjach, obserwując diody LED poszczególnych
 //tranzystorów. Stan zabroniony powinien zostać złapany przez funkcję
 //bezpiecznik() i sygnalizowany jej diodą LED.


 //faza U tranzystor górny
 //U_TR_G_ON;
 //U_TR_G_OFF;

 //faza U tranzystor dolny
 //U_TR_D_ON;
 //U_TR_D_OFF;

 //faza V tranzystor górny
 //V_TR_G_ON;
 //V_TR_G_OFF;

 //faza V tranzystor dolny
 //V_TR_D_ON;
 //V_TR_D_OFF;

 //faza W tranzystor górny
 //W_TR_G_ON;
 //W_TR_G_OFF;

 //faza W tranzystor dolny
 //W_TR_D_ON;
 //W_TR_D_OFF;


 //sprawdzamy, czy nie ma stanu zabronionego na tranzystorach
 //ZAWSZE WYWOŁUJ TĘ FUNKCJĘ, GDY ZMIENIASZ STAN TRANZYSTORÓW!!!
 bezpiecznik();


 //pętla główna
 while(1);
}


bldc.h

//--- D E F I N I C J E   D O T.  B E Z P I E C Z N I K A  ------

//LED bezpiecznika
#define BEZP_LED_DDR       DDRD
#define BEZP_LED_PORT      PORTD
#define BEZP_LED_PIN       PD3

//--- D E F I N I C J E   D O T.  S I L N I K A  ------

//Faza U

//tranzystor górny
#define U_TR_G_PORTx       PORTB
#define U_TR_G_DDRx        DDRB
#define U_TR_G_PINx        PINB
#define U_TR_G_PIN         PB1
#define U_TR_G_USTAW_DDR   U_TR_G_DDRx  |=  (1<<U_TR_G_PIN); //ustaw port
#define U_TR_G_PIN_L       U_TR_G_PORTx &= ~(1<<U_TR_G_PIN); //ustaw niski
#define U_TR_G_ON          U_TR_G_PORTx |=  (1<<U_TR_G_PIN); //włącz tranz.
#define U_TR_G_OFF         U_TR_G_PORTx &= ~(1<<U_TR_G_PIN); //wyłącz tranz.
#define U_TR_G_SPRAW_STAN  (U_TR_G_PINx  &  (1<<U_TR_G_PIN)) //warunek stanu
//tranzystor dolny
#define U_TR_D_PORTx       PORTD
#define U_TR_D_DDRx        DDRD
#define U_TR_D_PINx        PIND
#define U_TR_D_PIN         PD4
#define U_TR_D_USTAW_DDR   U_TR_D_DDRx  |=  (1<<U_TR_D_PIN); //ustaw port
#define U_TR_D_PIN_L       U_TR_D_PORTx &= ~(1<<U_TR_D_PIN); //ustaw niski
#define U_TR_D_ON          U_TR_D_PORTx |=  (1<<U_TR_D_PIN); //włącz tranz.
#define U_TR_D_OFF         U_TR_D_PORTx &= ~(1<<U_TR_D_PIN); //wyłącz tranz.
#define U_TR_D_SPRAW_STAN  (U_TR_D_PINx  &  (1<<U_TR_D_PIN)) //warunek stanu

//Faza V
//tranzystor górny
#define V_TR_G_PORTx       PORTB
#define V_TR_G_DDRx        DDRB
#define V_TR_G_PINx        PINB
#define V_TR_G_PIN         PB3
#define V_TR_G_USTAW_DDR   V_TR_G_DDRx  |=  (1<<V_TR_G_PIN); //ustaw port
#define V_TR_G_PIN_L       V_TR_G_PORTx &= ~(1<<V_TR_G_PIN); //ustaw niski
#define V_TR_G_ON          V_TR_G_PORTx |=  (1<<V_TR_G_PIN); //włącz tranz.
#define V_TR_G_OFF         V_TR_G_PORTx &= ~(1<<V_TR_G_PIN); //wyłącz tranz.
#define V_TR_G_SPRAW_STAN  (V_TR_G_PINx  &  (1<<V_TR_G_PIN)) //warunek stanu
//tranzystor dolny
#define V_TR_D_PORTx       PORTD
#define V_TR_D_DDRx        DDRD
#define V_TR_D_PINx        PIND
#define V_TR_D_PIN         PD5
#define V_TR_D_USTAW_DDR   V_TR_D_DDRx  |=  (1<<V_TR_D_PIN); //ustaw port
#define V_TR_D_PIN_L       V_TR_D_PORTx &= ~(1<<V_TR_D_PIN); //ustaw niski
#define V_TR_D_ON          V_TR_D_PORTx |=  (1<<V_TR_D_PIN); //włącz tranz.
#define V_TR_D_OFF         V_TR_D_PORTx &= ~(1<<V_TR_D_PIN); //wyłącz tranz.
#define V_TR_D_SPRAW_STAN  (V_TR_D_PINx  &  (1<<V_TR_D_PIN)) //warunek stanu


//Faza W
//tranzystor górny
#define W_TR_G_PORTx       PORTB
#define W_TR_G_DDRx        DDRB
#define W_TR_G_PINx        PINB
#define W_TR_G_PIN         PB2
#define W_TR_G_USTAW_DDR   W_TR_G_DDRx  |=  (1<<W_TR_G_PIN); //ustaw port
#define W_TR_G_PIN_L       W_TR_G_PORTx &= ~(1<<W_TR_G_PIN); //ustaw niski
#define W_TR_G_ON          W_TR_G_PORTx |=  (1<<W_TR_G_PIN); //włącz tranz.
#define W_TR_G_OFF         W_TR_G_PORTx &= ~(1<<W_TR_G_PIN); //wyłącz tranz.
#define W_TR_G_SPRAW_STAN  (W_TR_G_PINx  &  (1<<W_TR_G_PIN)) //warunek stanu
//tranzystor dolny
#define W_TR_D_PORTx       PORTD
#define W_TR_D_DDRx        DDRD
#define W_TR_D_PINx        PIND
#define W_TR_D_PIN         PD7
#define W_TR_D_USTAW_DDR   W_TR_D_DDRx  |=  (1<<W_TR_D_PIN); //ustaw port
#define W_TR_D_PIN_L       W_TR_D_PORTx &= ~(1<<W_TR_D_PIN); //ustaw niski
#define W_TR_D_ON          W_TR_D_PORTx |=  (1<<W_TR_D_PIN); //włącz tranz.
#define W_TR_D_OFF         W_TR_D_PORTx &= ~(1<<W_TR_D_PIN); //wyłącz tranz.
#define W_TR_D_SPRAW_STAN  (W_TR_D_PINx &   (1<<W_TR_D_PIN)) //warunek stanu



//Wspólna definicja wyłączająca wszystkie tranzystory
#define WYLACZ_TRANZYSTORY U_TR_G_OFF; U_TR_D_OFF; V_TR_G_OFF; V_TR_D_OFF; W_TR_G_OFF; W_TR_D_OFF;


bldc.c

/*
 * bldc.c
 *
 *  Created on: 30 lip 2019
 *      Author: krzys
 */
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "BLDC.h"

void bezpiecznik(void){

 //Sprawdzamy, czy nie występuje konflikt sterowania, powodujący
 //jednoczene otwarcie tranzystora górnego i dolnego w tej samej fazie,
 //co oznacza wystąpienie zwarcia !!!

 if(U_TR_G_SPRAW_STAN && U_TR_D_SPRAW_STAN){

  //Faza U - oba tranzystory są włączone - sytuacja niedopuszczalna!!!
  bezpiecznik();

 }else if(V_TR_G_SPRAW_STAN && V_TR_D_SPRAW_STAN){

  //Faza V - oba tranzystory są włączone - sytuacja niedopuszczalna!!!
  bezpiecznik();

 }else if(W_TR_G_SPRAW_STAN && W_TR_D_SPRAW_STAN){

  //Faza W - oba tranzystory są włączone - sytuacja niedopuszczalna!!!
  bezpiecznik();
 }
}

//------------------------------------------------------------------

void bezpiecznik_stop(void){

 //Funkcja wyłącza wszelkie tranzystory oraz przechodzi w stan sygnalizacji
 //błędu komutacji. Funkcja ta razem z funkcją bezpiecznik() pełni rolę
 //zabezpieczenia przeciwzwarciowego dla błędnie działającego algorytmu
 // komutacji w czasie pisania i testów programu.

 //wyłącz przerwania
 cli();

 //natychmiast wyłącz tranzystory
 WYLACZ_TRANZYSTORY

 //i ustaw stany niskie na pinach sterujących
 U_TR_G_USTAW_DDR
 V_TR_G_USTAW_DDR
 W_TR_G_USTAW_DDR
 U_TR_D_USTAW_DDR
 V_TR_D_USTAW_DDR
 W_TR_D_USTAW_DDR
 U_TR_G_PIN_L
 V_TR_G_PIN_L
 W_TR_G_PIN_L
 U_TR_D_PIN_L
 V_TR_D_PIN_L
 W_TR_D_PIN_L

 //ustaw pin LED jako wyjście
 BEZP_LED_DDR |= (1<<BEZP_LED_PIN);

 //zatrzymaj program w pętli nieskończonej sygnalizując błąd
 while(1){

      //zmień stan LED na przeciwny
      BEZP_LED_PORT  ^= (1<<BEZP_LED_PIN);

      //co 100ms
      _delay_ms(100);
     }
    }

<>

标签: ceclipse

解决方案


推荐阅读