Проблема компиляции в Embedded C и AVR G CC с несколькими определениями - PullRequest
0 голосов
/ 01 февраля 2020

Кажется, что мой компилятор не хочет собирать прошивку в stepper_motor.c и, как вы можете видеть ниже, выдает эту ошибку, которую я не могу решить.

Я создал stepper_motor.c источник, в котором размещены все мои функции и переменные, и заголовок stepper_motor.h, в котором находятся все #define s и прототипы функций. В main.c я просто включаю заголовок stepper_motor.h и использую функции. Как видно из данных журнала оболочки, он не компилируется и сообщает, что 4 x переменные определены несколько раз. Те из них используются в подпрограмме ISR () для таймера, поэтому они также должны быть нестабильными.

Любая информация будет высоко оценена по этому вопросу.

это моя главная задача. c включает в себя: --------

#include <avr/io.h>
#include <Hardware_Bay.h>
#include <util/delay.h>
#include <USART.h>
#include <string.h>
#include <inttypes.h>
#include <stdint.h>
#include <stdbool.h>
#include <avr/interrupt.h>
#include <scale16.h>
#include <stepper_motor.h>

const uint8_t motor_Phases[] = {
    (1 << COIL_B1),                             // full step
    (1 << COIL_B1) | (1 << COIL_A2),            // half step
    (1 << COIL_A2),                             // full step
    (1 << COIL_A2) | (1 << COIL_B2),            // half step
    (1 << COIL_B2),                             // full step
    (1 << COIL_B2) | (1 << COIL_A1),            // etc..
    (1 << COIL_A1),
    (1 << COIL_A1) | (1 << COIL_B1),
};

volatile uint8_t stepPhase = 0;
volatile uint16_t stepCounter = 0;
volatile int8_t direction = FORWARD;

ISR(TIMER0_COMPA_vect) {                    // Timer/Counter-0 Compare match interrupt vector enable
    stepPhase += direction;                 // take step in right direction
    stepPhase &= 0b00000111;                // keep the stepPhase in range (0 - 7)
    STEPPER_PORT = motor_Phases[stepPhase]; // write phase out to motor COIL-1 A/B
    HALL_PORT = motor_Phases[stepPhase];    // write phase out to motor COIL-2 A/B
    stepCounter ++;
}

------------------------------ заголовочный файл -----------------------------------------------

#ifndef STEPPER_MOTOR_H_INCLUDED
#define STEPPER_MOTOR_H_INCLUDED

#endif // STEPPER_MOTOR_H_INCLUDED

#define FORWARD           1                      
#define BACKWARD         -1
#define TURN              200  

#define MAX_DELAY         255                                                  
#define MIN_DELAY         10                                                      
#define ACCELERATION      16                                        

#define RAMP_STEPS        (MAX_DELAY - MIN_DELAY) / ACCELERATION

void stepperDrive(uint8_t number_of_steps, uint8_t delay);

void trapezoidDrive_Stepper(int16_t number_of_steps);
PS D:\Users\Arhitect\Documents\C_Programs\Physalis_Banshee\Physalis_GEO_version_3.6> make flash
avr-gcc -Wl,-Map,Physalis_GEO_version_3.6.map -Wl,--gc-sections -mmcu=atmega1284p fuse.o main.o stepper_motor.o USART.o  -o Physalis_GEO_version_3.6.elf
stepper_motor.o: In function `stepperDrive':
D:\Users\Arhitect\Documents\C_Programs\Physalis_Banshee\Physalis_GEO_version_3.6/stepper_motor.c:50: multiple definition of `stepCounter'
main.o:(.bss.stepCounter+0x0): first defined here
stepper_motor.o:(.data.direction+0x0): multiple definition of `direction'
main.o:(.data.direction+0x0): first defined here
stepper_motor.o:(.rodata.motor_Phases+0x0): multiple definition of `motor_Phases'
main.o:(.rodata.motor_Phases+0x0): first defined here
stepper_motor.o: In function `stepperDrive':
D:\Users\Arhitect\Documents\C_Programs\Physalis_Banshee\Physalis_GEO_version_3.6/stepper_motor.c:50: multiple definition of `stepPhase'
main.o:(.bss.stepPhase+0x0): first defined here
make: *** [Physalis_GEO_version_3.6.elf] Error 1
PS D:\Users\Arhitect\Documents\C_Programs\Physalis_Banshee\Physalis_GEO_version_3.6>

1 Ответ

1 голос
/ 01 февраля 2020

Действительно, сообщения об ошибках сообщают вам все, что вам нужно знать - вы определили эти символы в двух местах - главном. c и setpper_motor. c.

Вы определили stepCounter в строке 50 из stepper_motor. c, а также, как показано в основном. c. Аналогично для stepPase и motor_Phases.

  • Если они независимы и не должны быть видны снаружи, тогда оба должны быть объявлены static, чтобы они были видны только в соответствующем переводе единицы.

  • Если предполагается, что символ относится к объекту того же , то один из них необходимо объявить extern, чтобы указать компилятору его тип и имя, но он определен определен в другом месте ..

  • Если они независимы, но "должны быть" глобальными (потому что вы не можете думать о лучшем решение), то они не могут иметь одинаковое имя.

  • Если вы не ссылаетесь на них в main. c, то они в любом случае должны быть удалены оттуда. Кажется странным, что вы определяете их здесь, когда они явно относятся к управлению шаговым двигателем и, вероятно, должны быть заключены в stepper_motor. c.

Избежать использования глобалов в первом месте - гораздо лучшее решение, см. https://www.embedded.com/a-pox-on-globals/

...