Как программно определить, какой микроконтроллер подключен к моему компьютеру - PullRequest
0 голосов
/ 24 февраля 2020

Я недавно купил NodeMCU ESP8266 и начал играть с ним. Хотя почти все сценарии, которые я написал для микроконтроллеров Arduino, работают нормально на ESP8266, есть некоторые отличия. Например, чтение из EEPROM или использование внутреннего VREF в моем Esp8266.

Я знаю, что можно определить, какая плата 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?

Ответы [ 2 ]

1 голос
/ 24 февраля 2020
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
//Code in here will only be compiled if an Arduino Mega is used.

Можно ли сделать то же самое для других типов микроконтроллеров? Например тот, что в ESP8266? Что я должен искать?

Упомянутые макросы - это встроенные макросы , предоставляемые avr-g cc. Они используются для определения устройства, которое нужно скомпилировать, например, avr-lib c. На самом деле, эти макросы больше не являются встроенными в компилятор / препроцессор сегодня, но предоставляются файлом спецификации устройства device-specs/specs-<device>, который вставляет -D__AVR_<DEVICE>__ в командную строку препроцессора в соответствии с -mmcu=<device>.

Для AVR вы можете использовать #ifdef __AVR__ при компиляции для AVR, который по-прежнему является встроенным макросом из avr-g cc / avr-g ++.

ESP8266 - это совершенно другая архитектура; вы бы использовали xtensa-g ++ для компиляции кода для этого µ C, и это воплощение встроенного в G CC определяет __xtensa__ и __XTENSA__ (и определенно не __AVR__).

Однако, хотя поддержка устройств в инструментах AVR очень сложна, а avr-g cc распознает сотни различных опций -mmcu=<device>, это не относится к xtensa. Вам нужно определить свои собственные макросы, если вы хотите различать guish для разных производных xtensa.

Поскольку avr и xtensa - очень разные архитектуры, вы также можете указать спецификацию архитектуры c stuff в собственных модулях, таких как eeprom-avr.cpp, которые предоставляют read_from_eeprom или что-то еще для avr и включаются только в сборку при сборке для avr с avr-g ++, и аналогичный модуль только для xtensa eeprom-xtensa.cpp, который включается только при сборке с xtensa -g ++.

Как программно определить, компилируется ли код для AVR или ESP8266?

#if defined (__AVR__)
/* Code for AVR. */
#elif defined (__XTENSA__)
/* Code for ESP8266. */
#else
#error Compiling for unsupported target.
#endif
0 голосов
/ 24 февраля 2020

Как вы упомянули в своем вопросе, операторы #iffined (__ 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 или пропустите тег для esp.

gcc ... -D AVR_MICROCONTROLLER ...

Я чувствую, что причина, по которой вы задали этот вопрос, может быть вызвана путаницей в отношении происхождения тегов __AVR_ATmega1280__, et c .... По сути, они не являются ключевыми словами, используемыми компилятором, чтобы решить, для какого чипа компилироваться. Они созданы людьми, которые написали исходный файл, и они используются для переносимости, поэтому один и тот же файл может использоваться на разных платформах / процессорах. В своем ответе я использовал тег командной строки для определения тега AVR_MICROCONTROLLER. Другие проекты (например, прошивка Marlin, работающая на arduinos) также имеют конфигурационные файлы, полные операторов определения, которые можно использовать для точной настройки компиляции кода. Короче говоря, да, то же самое можно сделать для других микроконтроллеров, и вы сделаете это, написав свой собственный оператор препроцессора if, а затем выбрав, какие параметры / переменные должны быть установлены во время компиляции, в зависимости от чипа, на котором вы хотите запустить код.

...