Как обнаружить Genuino 101 внутри кода?

Я использую пользовательскую библиотеку для Arduino Mega, которая использует библиотеку AES для шифрования AES-128.

Однако, когда я пытаюсь использовать эту библиотеку в макетной плате Intel Genuino 101, появляется ошибка компиляции, связанная с тем, что язык ассемблера, написанный в библиотеке AES, был совместим только с устройствами Atmel.

И мой вопрос заключается в том, есть ли способ, чтобы мой код мог автоматически обнаружить плату GENUINO, написав какую-то проверку подписи этой платы, и, следовательно, я могу исключить часть шифрования, если она может успешно обнаружить GENUINO 101.

Если у вас возникнут вопросы, пишите мне, спасибо.

, 👍1

Обсуждение

Нет, вы не хотите, чтобы _ваш код_ обнаруживал Genuino 101. Ваш код не может работать, пока он не будет скомпилирован. Вы хотите, чтобы _компилятор_ определял, компилируется ли он для Arduino на основе AVR или для чего-то несовместимого (будь то ARC, ARM или Intel, не имеет значения). То, что вы хотите, называется [условной компиляцией] (https://en.wikipedia.org/wiki/Conditional_compilation), и именно об этом ответ KIIV., @Edgar Bonet

Да, верно. Простите меня за недоразумение. Это я точно спросил., @goddland_16


1 ответ


Лучший ответ:

1

Arduino определяет некоторые макросы, поэтому вы можете использовать условную компиляцию. Например, это из boards.txt:

  • используйте ARDUINO_AVR_PROMICRO, если это относится к варианту платы
  • используйте ARDUINO_ARCH_AVR, если он предназначен для Arduino с AVR

Также avr-gcc определяет макросы в соответствии с настройками процессора (это должно быть аналогично и для других платформ):

  • используйте __AVR_ATmega32U4__, если он предназначен только для одного MCU
  • используйте __AVR__, если он совместим со всеми микроконтроллерами на базе AVR

И примеры кода:

#if defined(__AVR_ATmega88__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__)
// что-то для семейства ATmegaXX8...
#else
// ...
#endif

#ifdef __AVR__ 
// Код, относящийся к AVR
#else
// Код для других архитектур
#endif

Подробнее о предопределенных макросах в avr-gcc.

,

Поскольку библиотека совместима со всеми Arduino на основе AVR, вероятно, лучше протестировать #if __AVR__ (или #ifdef __AVR__), а не конкретные микроконтроллеры., @Edgar Bonet

@KIIV Я пробовал #ifdefined __AVR__, и он принимает, но для #ifdefined(__AVR_ATmega328__) я не смог найти ожидаемого решения. Можете ли вы предложить какую-либо ссылку, которая объясняет больше об этом?, @goddland_16

@goddland_16 Это был пример. Arduino MEGA 2560 использует __AVR_ATmega2560__. Вы можете проверить этикетку на MCU., @KIIV

Правильный макрос архитектуры Arduino — «ARDUINO_ARCH_AVR», а не «DARDUINO_ARCH_AVR»., @per1234

@per1234: исправлено, ошибка копирования и вставки, как обычно..., @KIIV

@KIIV да, проверил. Рабочий и для UNO это [__AVR_ATmega328P__]., @goddland_16