Allora, i test che ho fatto oggi consistono in questo:
Preso ide arduino 1.0.1, creata una entry in boards.txt che avesse come build.core=arduino e come build.mcu=atmega1284p e come build.variant=standard
Avviato ide arduino, preso sketch blink e modificato aggiungendo Serial.begin(57600) su setup e Serial.println("bing") tra lo spegnimento e l'accenzione del led dello sketch penso più famoso del mondo.
Prelevato il file hex dalla cartella temporanea creata, caricato nel simulatore (non faccio nomi ma non il giocattolo), collegato un virtual terminal al 1284p ed un analizzatore di segnali avviata la simulazione e ottenuto onda quadra ad 1 hz e messaggi bing che popolavano lo schermo del virtual terminal.
Spero di essere stato abbastanza chiaro.
Ora veniamo alle cose serie.
Mi sono preso uno dei famosi core che dovrebbero fare il mestiere di supportare il famoso atmega1284p.(QUESTA)
Analizzando il codice di tutti i file ho riscontrato che vi sono in molti file differenze illusorie, ovvero righe di codice scritte in maniera diversa ma che alla fine danno lo stesso risultato.
Vi sono anche differenze che non sono illusorie, e ho riscontrato anche che nelle librerie dedicate al 1284p vi sono mancanze (es. in quella che ho io non è definita la costante INPUT_PULLUP, forse perchè è derivata da una versione arduino core più vecchia).
Alcune cose mi hanno incuriosito, e ve le riporto sotto :
File Arduino.h
Nel codice arduino core
extern const uint16_t PROGMEM port_to_mode_PGM[];
Nel codice 1284p core
extern const uint16_t port_to_mode_PGM[];
File Wstring.h
Nel codice arduino core
class __FlashStringHelper;
#define F(string_literal) (reinterpret_cast<__FlashStringHelper *>(PSTR(string_literal)))
Nel codice 1284p core
class __FlashStringHelper;
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
File Print.cpp
Nel codice arduino core
size_t Print::print(const __FlashStringHelper *ifsh)
{
const char PROGMEM *p = (const char PROGMEM *)ifsh;
size_t n = 0;
while (1) {
unsigned char c = pgm_read_byte(p++);
if (c == 0) break;
n += write(c);
}
return n;
}
Nel codice 1284p core
size_t Print::print(const __FlashStringHelper *ifsh)
{
const char *p = (const char PROGMEM *)ifsh;
size_t n = 0;
while (1) {
unsigned char c = pgm_read_byte(p++);
if (c == 0) break;
n += write(c);
}
return n;
}
Alla fine secondo me si riduce tutto a questo, ma perchè manca PROGEMEM??
e questo è quanto.
Anche wiring_analog.h sembra contenere sostanziose differenze ma se si analizza bene il flusso logico del codice (e se non ho le travecole) è praticamente lo stesso funzionamento.
Ora datemi il tempo di indossare il casco e la tuta che sono pronto a ricevere tutte le vostre mazzate!!
P.S. poi di interessante ho letto pure QUESTO