Fonctionnement de la classe Serial sur de gros codes

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 !

johwn:
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...) :

...
mais le code suivant ne fonctionne pas (ie. la led ne s'allume pas) :

Avez-vous des idées de son origine ? J'utilise arduino 1.0.5...

Merci d'avance !

Bonjour
"Chez moi" elle s'allume
UNO R2
IDE 1.0.5 r2
Taille binaire du croquis : 6 246 octets (d'un max de 32 256 octets)

J'ai oublié de préciser, il s'agit d'une arduino uno r3, mais je sais pas si ça change grand chose...

Salut,

Vu que dans le titre tu nous parles de Serial, ça veut dire que dans le cas où ça ne marche pas, si tu vire le Serial.begin() ça marche ?

Oui... Je trouve ça assez étrange...

Le code fonctionne chez moi : Uno R3, IDE 1.0.5, Mac X OS 10.7

Il fonctionne également avec l'IDE 1.5.6-r2