Salve, sto portando avanti un progetto che occupa molta memoria e se linko una certa libreria, Arduino Uno non basta ma Arduino Mega si.
Potrei modificare il codice con o senza questa libreria che in realta' richiamo in pochi punti del programma percio' mi domandavo se esiste un modo per eseguire l' #include e quelle 2 o tre chiamate solo in presenza di un Mega.
Naturalmente in automatico e senza dover remmare ogni volta le righe in questione.
PS: al limite andrebbe bene cambiare il valore di una variabile a inizio programma...
... che però funzioni all'interno dell'IDE ... è tutto da dimostrare ... :
Ho avuto un bel problema con un mio programma che usava una libreria che era diversa per ATmega ed ATtiny ... ovviamente avevo pensato al #ifdef ... ebbene, l'IDE fa di testa sua e comunque fa un pre-passaggio, probabilmente prima del pre-processore del compilatore e come vede #include ... lui include, sia che sia verificato o meno il #ifdef ... con gli ovvi casini ...
Parlo per la versione dell'IDE 1.0.5 ... non so poi ... ma non credo sia cambiato molto ... :
sarebbe bello sapere perché si ostinano a mettere mano al codice utente! è una tecnica "meschina", bisognerebbe lasciare fare i compilatori a chi fa i compilatori e gli IDE a chi fa gli IDE.
Se l'ide cmq non elimina la riga del define allora il compilatore non sbaglia.
Se fa casino, faccio in tempo a scoprirlo perche' viaggio con 350 byte liberi e se includo sforo di oltre 600.
Attualmente lavoro con la 1.6.1 e nei prossimi giorni avro' tempo per fare una prova.
Sara' mia cura aggiornarvi...
vbextreme:
sarebbe bello sapere perché si ostinano a mettere mano al codice utente! ...
... la risposta la trovi da solo se guardi l'utente medio che si presenta su questo forum
Non sa quasi nulla di C, non sa che esiste il main(), non sa che i prototipi delle funzioni vanno dichiarati, non sa ...
... potrei continuare all'infinito !
Per questi utenti ... c'è appunto l'IDE di Arduino che gli nasconde il 50% delle cose ... e che mette quindi le mani ovunque ...
Vero che l'IDE ci mette le mani, però non mi è mai successo che ignori/modifichi una #ifdef, le uso spesso proprio per decidere quali include fare in base a delle condizioni, anche legate al tipo di micro.
Però dato che al peggio non c'è mai limite con l'IDE di Arduino il solo modo per avere la certezza è provare caso per caso
Ho fatto qualche prova e accade che attivare o disattivare attraverso #if delle parti di codice funziona.
Cio' che non funziona invece e' l'allocazione della memoria, ovvero una buona parte viene comunque impegnata pur essendo il codice escluso.
Per capirci con tutto dentro siamo a 3286 byte, con il codice escluso scende a 2338 byte percio' ancora troppo per Uno quando remmando le righe si sta con 1717 byte.
Purtroppo non era cosi' facile.
PS: Si chiama Arduino perche' si puo' iniziare a produrre senza essere enciclopedie viventi, senno' si chiamava "roba complicata per pochi iniziati che non sanno che farsene"
@maxscorda dovresti allegare i due codici,quello con la #if è quella con i commenti.Sbagli qualcosa.
In ogni caso tocca impararsi il linguaggio, altrimenti ti fermi al secondo firmware.
Imparare la prototipazione di una funzione è la cosa più semplice del linguaggio.
A mio avviso sarebbe stato piu didattico, dato che è nato per quello, inserire un file.c magari chiamato arduino.c dentro ad ogni progetto dove è incluso il main() e quant altro, in più un secondo file con i classici setup e loop.Questo è quello che di solito fanno le "grandi case" vedi ad esempio MS.
Avrei forkato un ide esistente in modo da fornire a tutti un prodotto valido e non un qualcosa che nel mondo odierno non ha nome.
E se provprio volevano rendere facile la vita a tutti si scrivevano il loro Basic, così facendo invece creano solo confusione, mia opinione personale.
Avrei forkato un ide esistente in modo da fornire a tutti un prodotto valido e non un qualcosa che nel mondo odierno non ha nome.
E se provprio volevano rendere facile la vita a tutti si scrivevano il loro Basic, così facendo invece creano solo confusione, mia opinione personale.
Si si solo che sono partiti dicendo che il team arduino ha inventato un nuovo linguaggio semplificato, quando si tratta nella realtà di classi, funzioni e macro conosciute dai programmatori e sconosciute dal principiante e dall'artista digitale a cui in realtà si è rivolto il prodotto. Da vecchie discussioni con Banzi ho avuto l'impressione che il programmatore competente è un intruso. Il discorso è vecchio e ricordo che per certi versi gli dato ragione piena, in quanto ci sono utenti che vogliono raggiungere il risultato con semplicità e rapidità ma come ci sono riusciti non è importante, cioè in sostanza non gli interessa programmare ma realizzare l'applicazione.
Dal punto di vista di un programmatore C non si capisce come il progetto Arduino abbia avuto così tanti seguaci, poi io l'ho capito. Il motivo è che esistono nel mondo più persone interessate all'applicazione finale che ad acquisire competenza ed è alle prime che il progetto Arduino si rivolge, proprio perché più numerose.
OK per il miniframework che hanno introdotto ma questo non significa semplificare un linguaggio, il linguaggio rimane sempre c/c++, tutto tranne che semplice, sicuramente creare un compilatore BASIC avrebbe portato più frutti e meno complicazioni per tutti.
Dopotutto il BASIC è nato proprio per il concetto che hai illustrato tu.
Hanno scelto le strade più bizzarre per avere la via più semplice, ma forse si saranno accorti che non è cosi...
Perché non partire da un VERO IDE come Code::Blocks e forkarlo per le proprie esigenze?
Perché non utilizzare sia il c che il basic?
Perché reinventare la ruota quando esiste già?
Dopotutto utilizzare il codice scritto da altri sono le fondamenta dell'Open Source!
Non ho avuto molto tempo ma credo di aver gia' capito qual è il problema e corrisponde a quanto scrive @gpb01, ovvero certe librerie le linka comunque e a prescindere.
Nello specifico parliamo della sd.h. Infatti di questo gruppo remmando la sd.h, tutto il resto viene effettivamente escluso
#if (defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__))
#include <SPIflash.h>
#include <SPI.h>
// #include <SD.h>
#include "MemSet.h"; //tutti i parametri extra
#endif
Diciamo che se il problema resta solo questo, lo si affronta, poi sarebbe carino conoscere la ragione di questo comportamento...
Ps x @vbextreme: hai ragione su tutta la linea ma se l'informatica ci insegna qualcosa e' che vale cio' che puo' essere appreso a gradi progressivi senza per questo non produrre nel frattempo e nel contempo l'eta' e il mestiere m'insegnano che avrei fatto volentieri a meno di conoscere i meccanismi del preprocessore dedicando invece questo tempo ai miei progetti. Poi il discorso e' ampio ma non e' questa la sede per discussioni sui massimi sistemi
maxscorda:
Non ho avuto molto tempo ma credo di aver gia' capito qual è il problema e corrisponde a quanto scrive @gpb01, ovvero certe librerie le linka comunque e a prescindere.
Il problema è nel fatto che usate la definizione del processore per il compilatore, usate una vostra #define, p.e. "#define UNO" oppure "define MEGA2560", per gestire la compilazione condizionale e vedrete che funziona.
L'impiccio è proprio l'IDE che utilizza le definizione standard per il compilatore a suo uso e consumo e modifica di conseguenza il codice per il preprocessore.