Compilazione condizionale in base alla scheda.

Buongiorno.

C'è un qualche define per capire per quale scheda si sta compilando ? Per far si che il codice si adatti alla scheda in uso al momento.

https://forum.arduino.cc/index.php?topic=113656.msg1939434#msg1939434

NO, c'è la possibilità di sapere per quale MCU stai compilano, NON per quale scheda.

Baste che apri qualche libreria un po' complessa e vedi esattamente come fanno.

Se, ad esempio, april la swRTC di leo ... proprio all'inizio trovi:

//check if the micro is supported
#if defined (__AVR_ATmega48__) || defined (__AVR_ATmega88__) || defined (__AVR_ATmega168__) || defined (__AVR_ATmega328__) || defined (__AVR_ATmega48P__) || defined (__AVR_ATmega88P__) || defined (__AVR_ATmega168P__) || defined (__AVR_ATmega328P__)
#define ATMEGAx8
#elif defined (__AVR_ATtiny25__) || defined (__AVR_ATtiny45__) || defined (__AVR_ATtiny85__)
#define ATTINYx5
#elif defined (__AVR_ATmega8__) || defined (__AVR_ATmega8A__)
#define ATMEGA8
#elif defined (__AVR_ATtiny24__) || defined (__AVR_ATtiny44__) || defined (__AVR_ATtiny84__)
#define ATTINYx4
#elif defined (__AVR_ATmega640__) || defined (__AVR_ATmega1280__) || defined (__AVR_ATmega1281__) || defined (__AVR_ATmega2560__) || defined (__AVR_ATmega2561__)
#define ATMEGAx0
#elif defined (__AVR_ATmega644__) || defined (__AVR_ATmega644P__) || defined (__AVR_ATmega644PA__) || defined (__AVR_ATmega1284P__)
#define ATMEGA644
#elif defined (__AVR_ATtiny2313__) || defined (__AVR_ATtiny4313__)
#define ATTINYx313
#elif defined (__AVR_ATmega32U4__)
#define ATMEGAxU

... che ti da un'idea di cosa puoi controllare ;)

Guglielmo

Grazie però devo distinguere il ARM SAMD di zero dalla ESP32, e non trovo il nome di entrambi.

Per l'ESP32 il core dovrebbe definire sia ESP32 che ARDUINO_ARCH_ESP32.

Per le schede che montano SAMD dovresti avere le seguenti definizioni:

ARDUINO_SAMD_ZERO ARDUINO_ARCH_SAM ARDUINO_ARCH_SAMD

Guglielmo

Da github del IDE 1.5.3, spero valido ancora per il nuovo IDE:

“The uno.build.board property is used to set a compile-time variable ARDUINO_{build.board} to allow use of conditional code between #ifdefs. The Arduino IDE automatically generates a build.board value if not defined. In this case the variable defined at compile time will be ARDUINO_AVR_UNO.”

nid69ita:
Da github del IDE 1.5.3, spero valido ancora per il nuovo IDE …

Interessante, onestamente me l’ero persa:grin:

Quindi, in teoria, viene passato il parametro che sta in boards.txt e che si chiama xxxxx.build.board al compilatore e quindi definito ARDUINO_<il_valore_passato> … ::slight_smile:

Da provare … :slight_smile:

Guglielmo

Preso dal documento di testo nella cartella: C:\Program Files (x86)\Arduino\hardware\espressif\esp32 esp32.build.board=ESP32_DEV

La condizione sotto non funziona.

if defined ESP32_DEV

… se leggi bene i post qui sopra, davanti ci va preposto ARDUINO_ quindi la borad con ESP32 diventa:

ifdef ARDUINO_ESP32_DEV

Guglielmo

P.S.: Ho verificato con una UNO e funziona … #ifdef ARDUINO_AVR_UNO :slight_smile:

Questa è la prova che non so leggere. Così funziona, grazie.

x-giorgio-x: Questa è la prova che non so leggere.

:D :D :D :D ... no, è la prova che NON leggi attentamente ;)

Guglielmo

Mi pare anche altre define vengono passate al compilatore, alcune note: -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch}

Chissà cosa gli viene passato come build.arch ? Al link che ho messo sopra, dice {build.arch} - The MCU architecture (avr, sam, etc...) Quindi ARDUINO_ARCH_AVR ARDUINO_ARCH_SAM ??

Per una board WIFI_LoRa_32, dichiara: -DARDUINO_WIFI_LoRa_32 -DARDUINO_ARCH_ESP32LORA -DESP32 Per generico ESP8266, dichiara: -DARDUINO_ESP8266_ESP01 -DARDUINO_ARCH_ESP8266 -DARDUINO_BOARD="ESP8266_ESP01" -DESP8266

nid69ita: ... Chissà cosa gli viene passato come build.arch ?

... hai visto il mio post #4 ? ::)

Guglielmo

Ma anche build.arch allora lo mette il compilatore ?

nid69ita:
Ma anche build.arch allora lo mette il compilatore ?

Non credo dato che si chiamano ARDUINO_<architettura> … mi da l’idea di un qualche cosa creato sempre a linea comando con il ‘-D’ ::slight_smile:

Guglielmo

Tutti quei valori sono definiti nei vari platform.txt e boards.txt.

Non direttamente, build.arch non c'e' in nessuno dei due txt

Poi, non c'e' problema, per saperne i valori basta compilare con il verbose attivo ed in base a board vedi le varie -D

>nid69ita: … ho ritrovato il comando che cercavo … vai nella cartella hardware/tools/avr/bin e, dalla linea comando, lancia questo:

avr-gcc -mmcu=atmega328p -dM -E - < /dev/null

… buon divertimento :smiley:

Guglielmo

P.S.: Se cambi -mmcu ti da quelli relativi alla mcu selzionata (che, ovviamente, avr-gcc deve riconoscere)

Ho windows, non mi riconosce /dev/null (pare)

… ti perdi in un “bicchier d’acqua” ? ? ? :smiley: :smiley: :smiley: … metti solo nul :wink:

avr-gcc -mmcu=atmega328p -dM -E - < nul

Guglielmo