Bonjour,
Depuis quelques temps, je suis confronté à un problème :
Le code suivant fonctionne (ie. la led s'allume) (ok, il est relativement inutile, mais bon...) :
void setup()
{
Serial.begin(115200, SERIAL_8N1);
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
}
void loop()
{
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
}
mais le code suivant ne fonctionne pas (ie. la led ne s'allume pas) :
void setup()
{
Serial.begin(115200, SERIAL_8N1);
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
}
void loop()
{
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);makeWord(1);
}
Visiblement, le problème apparaît lorsque la taille du programme dépasse 4500 octets (à peu près).
Pour la compréhension du code, makeWord est définie dans WMath.cpp de la manière suivante :
unsigned int makeWord(unsigned int w) { return w; }
J'utilise cette fonction pour faire grossir la taille du code artificiellement (l'option -0s étant utilisée lors de la compilation) sans utiliser d'E/S ni de cli ou d'autres trucs dans le genre pouvant fausser l'interprétation des résultats.
Je ne vois pas d'autres explications possible qu'un bug, mais j'ai un peu de mal à le localiser (j'ai l'impression que ça vient des ISR, mais ça reste à prouver).
Le problème apparaît aussi lors de l'utilisation de la lib twi.c.
Avez-vous des idées de son origine ? J'utilise arduino 1.0.5...
Merci d'avance !