Freeze lors d'un Serial.print

Bonjour,

J'ai un souci avec mon programme qui freeze après un long moment de fonctionnement.

Avant de présenter du code, j'explique le programme en question:
J'ai un Arduino avec un DS18B20 + PCF8383 + SDcard 2Go + LED en sortie + SWITCH en entrée.

Le programme principale

  • Désactive l'interruption int0
  • Lit l'horloge RTC en i2c
  • Lit la t° sur le bus 1wire
  • "Affiche" date/heure + t° sur le port série.
  • Ecrit les 2 chaines sur une carte SD
  • Réactive l'INT0
  • Se met en veille.

L'interruption est provoquée par la RTC toute les mn.

Cela fonctionne très bien pendant 2 jours dernièrement puis parfois cela freeze lors du Serial.print de la t°.
Il affiche les premiers caractères puis blocage.

Auriez vous une piste pour comprendre le problème.
Est ce que la fonction Serial.print rend la main après l'envoie des caractères au port série ou rend la main directement et l'envoie se fait par interruption ?

merci de votre aide.

L'envoi n'est pas bloquant et se sert des interruptions, donc si tu ne le prévois pas effectivement ça peut poser des problèmes.

Avec ton code ça serait quand même bien plus facile de t'aider :wink:

Bonjour,

Sans le code on peut rien faire :wink:

L'interruption est provoquée par la RTC toute les mn.

L'interruption ne tombant que toutes les minutes,
il n'y a pas de risque d'avoir une nouvelle interruptions pendant la gestion de l'interruption courante.
le traitement que tu détailles ne prend pas une minute pour s'exécuter
donc pourquoi les masquer? C'est pas une bonne idée lorsqu'on fait des liaisons série.

Maintenant le problème se produisant sur une échelle de temps assez grande, je chercherai s'il n'y a pas une fuite mémoire. Ou alors il y a un processus que tu n'as pas décrit et qui tombe de manière asynchrone.

Merci pour ces réponse rapidse.

Voici le code: http://vesta.homelinux.free.fr/site/tmp/temp_logger.ino

Et voici le portion de code ou cela bloque:

	// Lecture temperature
	getTemp(temperature) ;
	Serial.print(temperature);                 // Blocage à ce niveau
	Serial.print("° ");
	
	// Ecriture dans fichier log
	cli() ;                                             // Je désactive les int. lors de l'écriture sur la carte SD (blocage ici ?)
	sprintf(logline, "%s %s", time, temperature) ;
	writedata2log(logline) ;
	sei() ;

Je teste en moment sans cli()/sei().
Peut-être faut-il un flush avant de passer par l'écriture en SD ?

Je ne comprends toujours pas.

J'ai testé en rajoutant un Serial.flush() ; juste avant d'écrire sur la carte SD mais j'ai toujours des problèmes:

	// Lecture date/heure
	getDate(time) ;
	Serial.print(time);
	Serial.print( F("  ") );
	
	// Lecture température
	getTemp(temperature) ;
	Serial.print(temperature);
	Serial.print("° ");
	Serial.flush() ;				// Attends fin émission série.
	
	// Ecriture dans fichier log
	cli() ;
	sprintf(logline, "%s %s", time, temperature) ;
	writedata2log(logline) ;
	sei() ;

	// Réinit alarme INT0 à +5mn
	setAlarm5mn() ;

En fait

  • soit je bloque les interruptions avec cli/sei pendant la phase d'écriture sur la carte SD et j'ai des freezes
  • soit je ne bloque pas les int et j'ai des erreurs d'ouverture ou d'écriture du fichier SD.

Mon interruption INT0 est bien désactivée, le Serial.flush attends normalement la fin de la sortie série, j'ai vérifié la conso. de la RAM.

Là, je ne vois plus ou est le problème.