Pages: [1] 2 3 4   Go Down
Author Topic: Inclusione condizionata di librerie ...  (Read 899 times)
0 Members and 1 Guest are viewing this topic.
Switzerland
Offline Offline
Faraday Member
**
Karma: 82
Posts: 4168
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ecco qui un bel problemino ...

... vorrei scrivere un singolo programma che, nel caso venga compilato per ATtiny85 includa la libreria "TinyWireM", mentre, nel caso venga compilato per ATmega328p includa la libreria "Wire" ... così da compilare senza errori in funzione del target dove deve essere eseguito ...

Occhio a dare una risposta troppo d'impulso ...  smiley-twist

Guglielmo
« Last Edit: January 27, 2014, 05:49:11 pm by gpb01 » Logged

Search is Your friend ... or I am Your enemy !

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20181
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Devo cercarti i particolari o posso risponderti in generale?
Esiste una variabile di sistema che determina il Controller in uso.
Code:
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
codice per ATmega328...
#else
Codice per gli altri Controller
#endif

Controlla un po la libreria fastSPI.
Non so come si chiama la variabile per il ATtiny85  ma se Ti serve solo l' uno o l' altro basta controllare se non é un ATmega328p

Ciao Uwe
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 82
Posts: 4168
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie Uwe, ma ... avevo ben evidenziato di NON rispondere troppo d'impulso ...  smiley-twist

La soluzione

Code:
#if defined( __AVR_ATtiny85__ )
   #include <TinyWireM.h>
#else
   #include <Wire.h>
#endif

... è ovviamente quella che uno da d'impulso, ma ... metti la libreria TinyWireM nella tua cartella delle librerie,  scrivi un semplice programmino, che non fa nulla (setup e loop anche vuoti), ma che in testa contiene quel "#if defined", e prova a compilarlo per Arduino UNO ... avrai una bella sorpresa !!!  smiley-twist smiley-twist smiley-twist

Ecco ... ti risparmi la fatica di scriverlo, compila questo per Arduino UNO ...

Code:
#if defined( __AVR_ATtiny85__ )
   #include <TinyWireM.h>
#else
   #include <Wire.h>
#endif

void setup() {}

void loop() {}


Altre idee che invece funzionano ???   smiley-lol

Guglielmo
« Last Edit: January 28, 2014, 12:27:11 am by gpb01 » Logged

Search is Your friend ... or I am Your enemy !

Offline Offline
Jr. Member
**
Karma: 3
Posts: 61
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se gli "addetti a i lavori"  fanno una "modifica"  all'IDE  il modo da poter salvare (come opzione) in un unico file sketc  e librerie
in molti casi sarebbe utile  soprattutto per quelle librerie un po in "ombra"  che pubblicate  in posti non ufficliali   rischiano di andare perdute
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 82
Posts: 4168
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@ elrospo : Non ho ben capito cosa vorresti che l'IDE facesse ... ma comunque l'argomento di questo thread è ...

... il funzionamento del "#ifdef" o "#if defined" assieme alla "#include" smiley-wink

Grazie,

Guglielmo
Logged

Search is Your friend ... or I am Your enemy !

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20181
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Guglielmo
Parli in indovinelli.  smiley-wink

In questo momento non posso fare prove perché non ho nessuna board definita con un ATtiny85 e non ho tempo di farlo.
In questo momento nella compilazione la libreria mi da un sacco di errori di registri non definite indipendentemente si includo la libreria in modo non condizionato o condizionato.
Da quel poco che so dedurre é che sembra che la libreria venga inclusa indipendentemente dalla condizione #if.

prendendo come esempio la libreria FastSPI_LED dovrebbe funzionare:
Code:
#if defined(ARDUINO) && ARDUINO >= 100
  #include "Arduino.h"
  #include <pins_arduino.h>
#else
  #include "WProgram.h"
  #include <pins_arduino.h>
#include "wiring.h"
#endif
#include "avr/interrupt.h"
#include "avr/io.h"
#include "FastSPI_LED.h"
...
// some spi defines
// Duemilanove and mini w/328
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
#define SPI_PORT PORTB
#define SPI_DDR  DDRB
#define SPI_PIN  PINB
#define SPI_MOSI 3       // Arduino pin 11.
#define SPI_MISO 4       // Arduino pin 12.
#define SPI_SCK  5       // Arduino pin 13.
#define SPI_SSN  2       // Arduino pin 10.
#define DATA_PIN 11
#define SLAVE_PIN 12
#define CLOCK_PIN 13
#define LATCH_PIN 10
#define TIMER_AVAILABLE 1

Ciao Uwe
« Last Edit: January 28, 2014, 02:11:20 am by uwefed » Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 82
Posts: 4168
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Guglielmo
In questo momento non posso fare prove perché non ho nessuna board definita con un ATtiny85 e non ho tempo di farlo.
In questo momento nella compilazione la libreria mi da un sacco di errori di registri non definite indipendentemente si includo la libreria in modo non condizionato o condizionato.

NON ti serve l'ATtiny85 ... sei già caduto sul problema, tanto è vero che mi dici "... mi da un sacco di errori di registri non definite indipendentemente se includo la libreria in modo non condizionato o condizionato" ...  smiley-mr-green smiley-mr-green smiley-mr-green

E' proprio questo il punto ...
... come vedi anche se la "#if defined", ma anche la "#ifdef", escludono una certa condizione, questa ... viene comunque compilata ... con i casini che ne conseguono e, con il fatto che quindi ... NON riesci a compilare il codice !!!

Guglielmo

P.S. : E' ovvio che dia un sacco di errori ... quelli sono registri del ATtiny85 che non esistono su Arduino UNO ... e difatti, NON essendo definito __AVR_ATtiny85__ non dovrebbe compilare quella lib ... invece ...  smiley-roll
« Last Edit: January 28, 2014, 02:09:19 am by gpb01 » Logged

Search is Your friend ... or I am Your enemy !

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 57
Posts: 3485
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
#if defined( __AVR_ATtiny85__ )
   #include <TinyWireM.h>
#else
   #include <Wire.h>
#endif

void setup() {}
void loop() {}

Cioè stà roba mi compila tutte e due ?
Qui allore è l'IDE che "sbaglia" dicendo al compilatore di prenderle tutte e due.

Altre idee che invece funzionano ???   smiley-lol
Si, rivedere il codice dell'IDE che analizza lo sketch per capire quali librerie compilare smiley-mr-green

P.S. hai provato sia con ide 1.0.5 che con 1.5.5 ?
« Last Edit: January 28, 2014, 03:19:48 am by nid69ita » Logged

my name is IGOR, not AIGOR

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 57
Posts: 3485
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Forse usare una define che modifichi un unico #include ma non ho mai provato
Code:
#if defined( __AVR_ATtiny85__ )
   #define  WIRELIB TinyWireM.h
#else
   #define WIRELIB Wire.h
#endif
#include <WIRELIB>

Anche se non sò come possa l'IDE analizzare corretamente questa se già non riesce con quella precedente

EDIT: compilare, compila (sia 1.0.5 che 1.5.5) , non so se funzia.
« Last Edit: January 28, 2014, 03:22:38 am by nid69ita » Logged

my name is IGOR, not AIGOR

Switzerland
Offline Offline
Faraday Member
**
Karma: 82
Posts: 4168
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

No Nid ... non compila correttamente, ma credo che tu non te ne accorgi perché probabilmente hai il "verbose" non attivo ... mettilo attivo in compilazione e vedrai ... smiley-wink

La strada che indichi si chiama "Computed Includes" ... ed è la seconda strada che ho provato anche io subito dopo aver visto il problema con la include normale, ma ... purtroppo non va neanche quella ... smiley-sad

Non da errore, ma da warning perché ... non trova il file da includere ... smiley-sad smiley-sad smiley-sad


Il problema del "#ifdef" in realtà, secondo me, deriva da questo ...

gcc OnLineDocs ... la frase di mezzo :

"Even if a conditional fails, the controlled text inside it is still run through initial transformations and tokenization. Therefore, it must all be lexically valid C."

... che, secondo me, va letto come : "Anche se la condizione è falsa, il testo in essa contenuto (cioè quello che uno mette dentro al #ifdef) viene comunque trattato, per cui deve essere sintatticamente valido per il C."

Chiaramente, la libreria TiniWireM.h contiene cose che in C sono sintatticamente valide se il processore è il ATtiny85, ma non più valide se il processore è un altro e ... li casca l'asino.

Guglielmo

Edit : la cosa è indipendente dalla versione del IDE che si usa e ... anche dalla Toolchain (provato anche con la 3.4.3)
« Last Edit: January 28, 2014, 03:52:43 am by gpb01 » Logged

Search is Your friend ... or I am Your enemy !

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 57
Posts: 3485
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

"Even if a conditional fails, the controlled text inside it is still run through initial transformations and tokenization. Therefore, it must all be lexically valid C."

Mi sembra una cosa stupida. Se non la voglio includere c'e' un motivo. Perchè analizzarla comunque?
Un conto è una define per una macro o una costante per debug, ma comunque non mi interessa ne faccia l'analisi.
Alquanto strana come "decisione" del gcc.
Logged

my name is IGOR, not AIGOR

Switzerland
Offline Offline
Faraday Member
**
Karma: 82
Posts: 4168
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mi sembra una cosa stupida. Se non la voglio includere c'e' un motivo. Perchè analizzarla comunque?
...

Nid, concordo con te, e purtroppo questa cosa crea dei bei casini che, credo vadano ad aggiungersi a quelli che già crea di perse l'IDE.
Ad esempio ... il fatto che nei "Computed Includes" non trova i files (... perché non sa seguire più le path) ... ho idea che sia qualche cosa introdotto dall' IDE e non da gcc smiley-wink

Guglielmo
Logged

Search is Your friend ... or I am Your enemy !

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il problema è probabilmente quello che fa l'ide qunado tagliuzza le cose per crare il file main in cpp a partire dall'INO.

Attivate le scritte di debug e controllate in che cartella temporanea compila, entrate nella cartella e cercate il main() (nomesckecth.cpp se ricordo bene) e verificate cosa è successo alle ifdef.


Se sono scomparse, e trovate entrambe le include, alloa aprite un bug (se state usando l'ultima versione di ide, si intende! se no aggiornate)
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Switzerland
Offline Offline
Faraday Member
**
Karma: 82
Posts: 4168
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il problema è probabilmente quello che fa l'ide qunado tagliuzza le cose per crare il file main in cpp a partire dall'INO.

NO lesto, questa volta la colpa, se così la vogliamo chiamare (... visto che mi sembra cosa ben documentata) è di gcc ...

Se si mette il "verbose" e si segue quello che fa, all'inizio prende il programma, c'aggiunge qualche cosa ed inizia a creare un primo obj ...

Dato questo :

Code:
#ifdef PIPPO
   #include "TinyWireM.h"
#endif

void setup() {}

void loop() {}

... nella directory temporanea lo trovi modificato così :

Code:
#line 1 "sketch_jan28a.ino"
#ifdef PIPPO
   #include "TinyWireM.h"
#endif

#include "Arduino.h"

void setup();
void loop();
#line 5
void setup() {}

void loop() {}

... come vedi il "#ifdef" rimane ... smiley-wink

Guglielmo
Logged

Search is Your friend ... or I am Your enemy !

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 102
Posts: 6548
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Come primissima riga metti un
Code:
char foo;
Cosi almeno eviti l'errore dell'IDE già segnalato e non ancora risolto, neanche sulla 1.5.6 in sviluppo.

Non funziona neanche con la mia proposta.
E' un errore del preprocessore dell'IDE.  smiley-sweat
« Last Edit: January 28, 2014, 08:11:53 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Pages: [1] 2 3 4   Go Up
Jump to: