Keil: LPC1768 UART: Error: L6200E: Símbolo a multiplicado definido (por main.o y uart.o)

0

Estoy aprendiendo programación ARM. He configurado uart de lpc2148 antes. Pero ahí incluí el código completo en un solo archivo. Hoy los separé en archivos .c y .h. Pero cuando intenté construir, obtuve el siguiente error

uart.axf: Error: L6200E: Symbol a multiply defined (by main.o and uart.o).
uart.axf: Error: L6200E: Symbol i multiply defined (by main.o and uart.o).
Target not created

Debajo está el código main.c

//main.c

#include "uart.h"

int main(void)  {

    uart_init();
    uart_tx("Hello\r\n");

    while(1)
    {
        uart_rx();
        uart_tx(a);
        uart_tx("\r\n");
    }
    return 0;
}

uart.c

//uart.c
#include "uart.h"

void uart_init()    {
    PINSEL0 |= (5<<0);
    U0LCR = 0X83;
    U0DLL = 97;
    U0LCR = 0X03;

}

void uart_tx(char *data)    {
    while(*data)    {
        U0THR = *data;
        while(!(U0LSR&(1<<5)));
        data++;
    }
}

void uart_rx()  {
    for(i = 0; ; i++)   {
        while(!(U0LSR&(1<<0)));
        a[i] = U0RBR;

        if(a[i] == '\r')    {
            a[i] = '
//uart.h

#ifndef UART_H
#define UART_H

#include <LPC214X.H>
#include <stdio.h>
#include <stdint.h>

char a[100];
int i;

void uart_init();
void uart_tx(char *);
void uart_rx();

#endif
'; break; } } }

uart.h

uart.axf: Error: L6200E: Symbol a multiply defined (by main.o and uart.o).
uart.axf: Error: L6200E: Symbol i multiply defined (by main.o and uart.o).
Target not created

Encontré algunos enlaces, pero ninguno de ellos parece dar una solución

link1

link2

    
pregunta Athul

2 respuestas

1

Ha declarado a y i en un encabezado, por lo que se están definiendo en cada unidad de traducción en la que se compilan. Debe incluirlos en sus respectivos archivos de implementación, static si no lo hacen. t necesita ser compartido y en el alcance más pequeño que pueda.

i , por ejemplo, se usa solo como un contador de bucle en la función rx, ya sea declararlo en la parte superior de la función o si está usando c99, entonces declararlo en el bucle.

    
respondido por el Colin
0

Las variables 'a' y 'i' deben declararse en uart.h usando el atributo 'extern'. Las variables 'a' e 'i' deben estar definidas en uart.c, y solo en uart.c La declaración en uart.h le dice al compilador sobre las características de las dos variables y el 'extern' atributo indica que están definidos en otra parte (uart.c en este caso).

La definición de las variables en uart.c debe estar fuera de cualquier función para que tengan un alcance global. Es una buena idea poner esta definición antes de cualquier función también.

Por cierto, deberías usar mejores nombres de variables.

    
respondido por el Elliot Alderson

Lea otras preguntas en las etiquetas