如何解决"`__vector_32'"的多重定义错误?

时间:2017-06-06 16:34:59

标签: arduino

我正在研究一个涉及红外信号处理和控制伺服系统的Arduino Mega 2560项目。但是下面的简单草图会产生错误,说某些字段是多次定义的。

涉及的图书馆:ServoIRremote

重现错误的代码:

#include <Servo.h>
#include <IRremote.h>

void setup() { }

void loop() { }

错误说明:

libraries\IRremote\IRremote.cpp.o (symbol from plugin): In function `MATCH(int, int)':

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

libraries\Servo\avr\Servo.cpp.o (symbol from plugin):(.text+0x0): first defined here

c:/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions

collect2.exe: error: ld returned 1 exit status

exit status 1
Error compiling for board Arduino/Genuino Mega or Mega 2560.

如何解决此问题?

UPDATE /溶液

伺服库在ServoTimers.h中有以下定义:

typedef enum { _timer5, _timer1, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t;

基本上,前12个伺服系统由timer 5控制。如果您需要更多伺服系统,伺服13-24等也可以参考timer 1。在Arduino Mega 2560(每个定时器12个)上,标准伺服库可以控制多达48个伺服系统。

IRremote库使用定时器2接收IR信号。这基本上不与Servo库冲突。但是我已经改变了IRremoteInt.h以使用timer 3而不是timer 2,因为我还使用了中断驱动的超声波传感器(在timer 2上)。这就是我遇到上述问题的原因。

由于我没有为我的项目使用超过12个伺服器,我只是在伺服库中禁用了定时器1,3,4,产生了以下行(与上面的原始行相同):

typedef enum { _timer5, _Nbr_16timers } timer16_Sequence_t;

这会导致更多错误,因为枚举不再完整...如果你想做同样的事情,只需注释掉在你尝试编译草图时弹出错误的代码行。然后重新编译,一切都应该没问题。

现在一切正常,超声波传感器,伺服系统和红外接收。感谢。

1 个答案:

答案 0 :(得分:2)

Servo.h和IRremote.h都试图使用Timer1。他们不能拥有它,因此错误。您可以尝试使用ServoTimer2库来运行定时器2的伺服器,但请务必阅读它的文档,因为它不像Servo那样工作。