J'utilise depuis peu un module Adafruit avec un chip de carte SD dessus en SPI, j'utilise avec la librairie SD. Je rencontre depuis peu des soucis au moment de l'appel de print le programme bug et mon watchdog reset le soft, je fait environ un 20 print et je flush tous les 15 tour de boucles, est ce que le fait de faire "pas mal " de print peux poser soucis ?
Quel est le microcontrolleur utilisé ? (déclenchement du watchdog )
Donner TOUTES les informations sur le montage ainsi que le code complet (CF BONNES PRATIQUES DU FORUM FRANCOPHONE)
Le micro que j'utilise est un SAMD21E17A et le watchdog lui fait un reset au bout de 10s, le programme bloque au niveau d'un print de temps en temps, j’écris dans mon fichier seulement des nombres (float,double) et des char[], pas de String ou autres type de données.
-ce module se comporte comme une carte SD mais , utilisé en mode 1 bit (SPI) , il n'est pas particulièrement rapide
-le chien de garde est-il indispensable pendant l'écriture des données sur le module ? est-il désactivable temporairement ?( je n'utilise pas encore les SAMD21)
-s'il n'est pas possible ou pas souhaitable de déactiver temporairement le chien de garde il faut trouver le moyen de le resetter après plusieurs écritures pour éviter qu'il ne se déclenche
Alors une chose que je trouve vraiment louche, c'est :
si je réduit le nombre de print ça fonctionne plus longtemps mais ça bug quand même au final mais sur un temps beaucoup plus long
Je pense que le soucis vient du module SPI (j'utilise donc ce module en mode 1 bit vu que je suis en SPI) avant avec une carte SD je n'avait jamais eu ce soucis
Oui aussi en SPI. A voir oui je peux tenter de faire un flush systématique après chaque écriture.
Question quand je fait un print dans le fichier de la carte est ce que ça utilise le baud du Serial? Car actuellement je suis en 115200 est ce que ça peux venir de la ?
Non, l'écriture dans un fichier se contente de remplir un buffer en mémoire. Le buffer en question, lorsqu'il est plein ou lorsqu'on demande un flush, est vidé dans la carte SD d'un seul coup.
Etrange c'est encore pire en faisant un flush a chaque fois. Par curiosité j'ai mis un compteur et la carte ne plante jamais au même moment, des fois au bout de seulement 30 flush la fois d'après, après 300 flush
Si on ne fait pas explicitement de flush, le buffer est vidé à chaque fois qu'il est plein. En principe, si ma mémoire est bonne, le buffer fait 512 octets. Ensuite c'est la SD card qui gère la chose et cela échappe complètement au contrôle de l'application.
Sinon, essayer de faire ce que je proposais au #7 "relancer le watchdog" dans les portions chronophages du code (au début des print, juste avant de lancer le flush). Le watchdog est là pour relancer l'application si elle se plante. On a parfaitement le droit de relancer le watchdog à n'importe quel moment si on pense qu'un enchaînement d'appels de fonctions va empêcher de retourner dans la boucle d'attente à temps pour relancer le watchdog.
Par contre si tu ne veux pas relancer le watchdog hors la boucle d'attente il faut alors identifier le fauteur de trouble et modifier la structure du programme pour que ce cas de figure ne se produise jamais.
L'option de désactiver le watchdog temporairement n'est pas toujours possible ni souhaitable dans la mesure où on introduit alors une "faiblesse" dans la sécurité du code.
Oui je fait un Watchdog.reset avant de faire mes print mais ça ne change rien, en fait à un moment donné le soft plante lors de l'exécution d'un print, c'est vraiment incroyable je ne comprends pas ce qui se passe.
Je ne pense pas que ce soit un soucis de RAM (je pensais aussi à ça au début) j'ai testé ce code ici et à la fin de mon setup il m'annonce 6100 de dispo.
Et non je n'utilise aucune interruption dans mon soft
je me demande si c'est pas parce que j'ai une puce lora en SPI aussi, et au final en cherchant la puce lora ici (avec la librairie RadioHead) fait une interrupt quand elle reçoit des données, et je me dis que ça bug peut être si je reçois un interrupt au moment d'un print...
La question que je me pose donc est la suivante: est-ce que sur mon bus SPI je peux avoir une interrupt de ma puce LORA pendant une écriture SD?