Go Down

Topic: Freeze lors d'un Serial.print (Read 556 times) previous topic - next topic

Domos

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.



B@tto

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 ;)
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

skywodd

Bonjour,

Sans le code on peut rien faire ;)
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

fdufnews

Quote
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.

Domos

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:

Code: [Select]
// 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 ?

Domos

#5
Apr 14, 2013, 09:19 am Last Edit: Apr 14, 2013, 02:33 pm by Domos Reason: 1
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:

Code: [Select]
// 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.


Go Up