Skip to content

Implémenter une sauvegarde des paramètres de respiration sur mémoire Flash #36

@arnaud-clere

Description

@arnaud-clere

Il faut intégrer l'implémentation des deux fonctions déclarées dans

//! Non volatile memory (typically Flash)

Dans le fichier :
https://github.com/Recovid/Controller/blob/master/C_Controller/lowlevel/stm32f303/flash.c

De sorte que le code de ihm_communication.c puisse lancer la sauvegarde asynchrone des paramètres validés. Cette fonction sera appelée en phase expiration pour ne pas perturber le driver moteur qui fonctionne en DMA.

Le fichier attaché implémente la fonction mais il faut encore l'intégrer.

De Hugo Van Reeth :
Le fichier à regarder est "Flash_save.c/h", dans lequel on trouve une fonction de Save et une fonction de Restore des paramètres. Il est plus simple d'écrire tous les paramètres d'un coup car il faut faire un erase de Flash avant écriture.

Quelques détails :
La structure de settings suivante n'existe pas dans le code (les paramètres individuels sont encapsulés dans ihm_communication.c) :
typedef struct attribute ((aligned(4))){
int version; // should always be first, since we use a pointer to this for union
int setting_FR_pm;
int setting_VT_mL;
int setting_PEP_cmH2O;
int setting_Vmax_Lpm;
int setting_EoI_ratio;
int setting_Pmax_cmH2O;
int setting_Pmin_cmH2O;
int setting_VTmin_mL;
int setting_FRmin_pm;
int setting_VMmin_Lm;
int magic; // usefull to check that all settings were written until the end
int crc; // should always be the last thing to write in Flash
} Settings_t;

J'ai donc rajouté par rapport aux settings de base

  • en premier une Version
  • à la fin un "magic" qui contient un int fixe qui permet de savoir au moins que tous les paramètres ont été écrit (double vérification avec le CRC qui peut tomber juste par hasard) (ca peut etre enlevé sur le CRC est robuste, ce qui n'est pas le cas dans mon exemple).
  • puis un crc (j'ai fait un XOR de base, je ne sais pas ce que vous comptez utiliser comme type de CRC).
    • Les fonctions de lecture/écriture sont :
    int Save_Settings(Settings_t* settings, int pageAddress);
    int Restore_Settings(Settings_t* settings, int pageAddress);
    Ces fonctions gèrent les erase de flash, les lecture/ecriture, et les calculs CRC. Il peut être intéressant de rajouter une vérification des valeurs des settings à postériori (si ils sont dans une fourchette cohérente, ...)
    • Pour les lectures/ecritures en Flash, plutot que de faire paramètre par paramètre, je copie directement le contenu mémoire de la structure complète en Flash sans me soucier du type de chaque setting. Avec cette mécanique, on peut rajouter/enlever des paramètres (de n'importe quel type int, float, char...) dans la structure sans avoir à retoucher les fonctions de lecture/ecriture Flash. C'est plus simple que d'écrire un par un les paramètres, qui pourraient avoir des types différents.
    Par contre, il faut toujours que la version soit en premier dans la structure car je fais pointer mes pointeurs d'écriture dessus.
    • J'écris à la derniere page de la Flash (addresse 0x0807F800). J'ai modifié le .ld pour enlever cette page de la mémoire programme.
    • Le fichier main.c permet de tester ça :
    -> Restore des paramètres au démarrage de la carte
    -> Si appui court sur le bouton de la Nucleo => ecriture de données random dans la strcture, et sauvegarde en Flash
    -> Si appui long (>1s) sur le bouton de la Nucleo => ecriture de valeurs par défaut dans la strcture, et sauvegarde en Flash

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions