如何以编程方式识别哪个微控制器连接到我的计算机上

问题描述 投票:-2回答:2

我最近购买了NodeMCU ESP8266并开始使用它。即使我为Arduino微控制器编写的几乎所有脚本都可以在ESP8266上正常工作,但还是存在一些差异。例如,从EEPROM读取或使用我的Esp8266中的内部VREF。

我知道可以使用以下代码识别连接的Arduino板:

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)

//Code in here will only be compiled if an Arduino Mega is used.

#elseif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)

//Code in here will only be compiled if an Arduino Uno (or older) is used.

#elseif defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega16U4__)

//Code in here will only be compiled if an Arduino Leonardo is used.

#endif 

但是,这适用于arduino微控制器。如何为esp8266微控制器执行此操作?

avr esp8266 nodemcu arduino-esp8266
2个回答
0
投票

就像您在问题中提到的那样,#if defined(__ xxxxx__)语句实际上不在微控制器上运行。它们是预处理器指令。 if语句决定将哪些代码传递给实际的编译器,以及忽略哪些代码。

您可以做的是编写可从eeprom中读取的代码,但是对于不同的微控制器(我建议为每个微控制器推荐一个独立的函数),您可以在编译时进行选择。

例如

#ifdef AVR_MICROCONTROLLER

read_from_eeprom(...)
{
  code for the avr chip
}

#else // I'm assuming there's no other options besides avr and esp
read_from_eeprom(...)
{
  code for esp chip
}
#endif

然后在编译时,使用-D标志指定您正在使用AVR或省略标签,尤其是。

gcc ... -D AVR_MICROCONTROLLER ...

我认为您提出此问题的原因可能是由于对__AVR_ATmega1280__等标签的来源感到困惑。基本上,它们不是编译器用来确定要编译哪个芯片的关键字。它们是由编写源文件的人员创建的,并且用于可移植性,因此同一文件可用于许多不同的平台/处理器。在我的回答中,我使用了命令行标签来定义AVR_MICROCONTROLLER标签。其他项目(例如在arduinos上运行的Marlin固件)也具有充满了define语句的配置文件,可用于精确配置代码的编译方式。长话短说,是的,对于其他微控制器也可以这样做,您可以通过编写自己的预处理程序if语句,然后根据要在其上运行代码的芯片选择在编译时设置哪些参数/变量来做到这一点。


1
投票
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
//Code in here will only be compiled if an Arduino Mega is used.
© www.soinside.com 2019 - 2024. All rights reserved.