конфликт библиотек, а конкретно с библиотекой servo

Max_K

✩✩✩✩✩✩✩
21 Дек 2022
14
2
Доброго всем времени суток.
Пишу довольно большой проект, собственно поскольку он большой то писал его частями и все части в отдельности работают,
Но вот когда начал собирать все в один проект на последнем этапе вышла проблема, а именно конфликт используемых библиотек с библиотекой Servo
Получаю вот такую ошибку.
ошибка:
Arduino: 1.8.7 (Windows 10), Плата:"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"

libraries\Servo\avr\Servo.cpp.o (symbol from plugin): In function `ServoCount':

(.text+0x0): multiple definition of `__vector_32'

sketch\Max_K_Antenna2_ramps.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here

c:/users/user/appdata/local/arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino5/bin/../lib/gcc/avr/7.3.0/../../../../avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions

libraries\Servo\avr\Servo.cpp.o (symbol from plugin): In function `ServoCount':

(.text+0x0): multiple definition of `__vector_42'

sketch\Max_K_Antenna2_ramps.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here

libraries\Servo\avr\Servo.cpp.o (symbol from plugin): In function `ServoCount':

(.text+0x0): multiple definition of `__vector_47'

sketch\Max_K_Antenna2_ramps.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here

collect2.exe: error: ld returned 1 exit status

exit status 1
Ошибка компиляции для платы Arduino Mega or Mega 2560.

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"

На сколько я понимаю возникает конфликт использования одинаковых таймеров.

У меня в коде используются следующие библиотеки
C++:
#include <Wire.h>
#include <EEManager.h>
//#define _useTimer1
#include <Servo.h>
#include <GyverTimers.h>
#include <FIFO.h>
#include <GStypes.h>
#include <GyverPlanner.h>
#include <GyverPlanner2.h>
#include <GyverStepper.h>
#include <GyverStepper2.h>
#include <StepperCore.h>
#include <EEPROM.h>
И я использую таймеры 3,4,5
На сколько я знаю Servo использует таймер1, но это для Nano например, а вот для Mega не пойму что она пытается использовать.
Если открыть код библиотеки, то находим очень интересный код
C++:
// Say which 16 bit timers can be used and in what order
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define _useTimer5
#define _useTimer1
#define _useTimer3
#define _useTimer4
typedef enum { _timer5, _timer1, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t;
И я не могу понять, какой именно таймер она использует.
Собственно вопросы:
1. Как понять какой из таймеров использует библиотека и от чего это зависит?
2. Как указать библиотеке использовать конкретный таймер? ( пробовал добавлять строчку #define _useTimer1 - не помогает)
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
499
146
@Max_K,
Использует таймеры в указанном порядке начиная с Timer5, по 12 серво на таймер.
Если у вас не больше 12 серв и вы хотите использовать только Timer1, то замените содержимое этого блока на

C++:
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define _useTimer1
typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t;
Возможно правильнее отменить определения в основной программе, и определить заново, чтобы не править код библиотеки, и в случае обновления библиотеки продолжало работать.
 
Изменено:

Max_K

✩✩✩✩✩✩✩
21 Дек 2022
14
2
Возможно правильнее отменить определения в основной программе, и определить заново, чтобы не править код библиотеки, и в случае обновления библиотеки продолжало работать.
А как это сделать в основной программе?
Просто вставив этот код в основную программу?
У меня всего одна серво.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
499
146
@Max_K,
Не уверен, что это можно ли сделать в основном коде, т.к. не знаю, можно ли переопределить typedef enum { _timer5, ....
Кажется нельзя.

Попробуйте для начала отредактировать файл в библиотеке.

Дополнено позже. Наверное предложение отменить определения в основной программе ошибочно.
 
Изменено:

Bruzzer

★★★✩✩✩✩
23 Май 2020
499
146
@Max_K,
Я использовал серво только на UNO и возможно с другой версией библиотеки, поэтому мне непонятны ошибки в которых ServoCount называется функицей, и еще перечисляются прерывания захвата таймеров, которые не используются в моей версии Servo.

Чтобы убедиться, что вы правите используемый файл, и он компилируется, для проверки добавьте после измененных строк, строку с выводом ошибки #error MY_ERROR

typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t;
#error MY_ERROR // Добавляемая строка для проверки, что правится нужный файл в нужном месте

Если появится соответствующие сообщения от ошибке, значит файл тот и он компилируется. Строку #error MY_ERROR после проверки убрать.
Что еще можно сделать я не знаю.
 

Max_K

✩✩✩✩✩✩✩
21 Дек 2022
14
2
@Bruzzer,
Хм...
ошибка не меняется.
Я правлю файл в пути c:\Users\User\AppData\Local\Arduino15\libraries\Servo\src\avr\
Сейчас буду искать где прячется нужная библиотека
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
499
146
@Max_K,
После правки библиотеки надо. Выйти из Arduino IDE (закрыть все окна), и снова войти, иначе может использоваться раньше скомпилированные файлы.
 

Max_K

✩✩✩✩✩✩✩
21 Дек 2022
14
2
@Bruzzer,
Спасибо огромное!
Все откомпилилось,
библиотека servo оказалась в директории c:\distr\arduino\arduino-1.8.7\libraries\Servo\src\avr\
Но все же интересно как переопределять настройки в основной програме.