Utilisation SD lib avec carte SD SPI

Bonjour,

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 ?

Voici la fonction qui s'occupe de faire les log

   log_vol.print("0");
    log_vol.print(F(";"));
    log_vol.print(q_dt.element.w);
    log_vol.print(F(";"));
    log_vol.print(q_dt.element.x);
    log_vol.print(F(";"));
    log_vol.print(q_dt.element.y);
    log_vol.print(F(";"));
    log_vol.print(q_dt.element.z);
    log_vol.print(F(";"));
    log_vol.print(abs(angle_calc));
    log_vol.print(F(";"));
    log_vol.print(altitude);
    log_vol.print(F(";"));
    log_vol.print(pression);
    log_vol.print(F(";"));
    log_vol.print(temperature);
    log_vol.print(F(";"));
    log_vol.print(accel_dso.acceleration.x);
    log_vol.print(F(";"));
    log_vol.print(accel_dso.acceleration.y);
    log_vol.print(F(";"));
    log_vol.print(accel_dso.acceleration.z);
    log_vol.print(F(";"));
    log_vol.print(resultante_dso_moy);
    log_vol.print(F(";"));
    log_vol.print(accel_event.acceleration.x);
    log_vol.print(F(";"));
    log_vol.print(accel_event.acceleration.y);
    log_vol.print(F(";"));
    log_vol.print(accel_event.acceleration.z);
    log_vol.print(F(";"));
    log_vol.print(resultante_icm_moy);
    log_vol.print(F(";"));
    log_vol.print(para_arme, 0);
    log_vol.print(F(";"));
    log_vol.print(declenchement_auto, 0);
    log_vol.print(F(";"));
    log_vol.print(type_declenchement, 0);
    log_vol.print(F("\n"));

    if(count_flush_log > 15)
    {
      log_vol.flush();
      
      count_flush_log = 0;
      SerialUSB.println(F("flush"));
    }else{
      count_flush_log++;
    }
  }

Log vol est un fichier ouvert comme ci log_vol = SD.open(log.csv", FILE_WRITE);

Bonjour

J'utilise depuis peu un module Adafruit avec un chip de carte SD dessus en SPI... le programme bug et mon watchdog reset le soft,

Quel module Adafruit ?

(sur ce forum si on veut de l'aide il ne faut pas faire de rétention d'informations , voir les " Bonnes Pratiques du Forum Francophone"

Oui désolé c'est ce module https://learn.adafruit.com/adafruit-spi-flash-sd-card

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.

  • quelques remarques :

-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

Je suis surpris qu'il faille 10s pour écrire ton log.
Il suffit de relancer le watchdog au milieu des print, pour voir si c'est bien là le problème.

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

sans fournir le code complet tu risque de n'avoir que peu de réponses......

Pour ma part je ne vois ren d elouche, que du 'lent' !!

je n'ai rien a ajouter , en l'état des infos fournis, aux réponses précédentes

La carte SD était aussi en mode SPI je suppose?

Peut-être faire un flush systématiquement. Ce qui limitera la quantité de données transférées entre le CPU et la carte.

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.

Ok donc peut être que ce buffer déborde en ne faisant pas des flush systématiquement, c’est une bonne piste je peux tester demain

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.

Plus de RAM disponible?
Tu utilises des interruptions?

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 sèche

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?