Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
arnaud-clere opened this issue Apr 24, 2020 · 2 comments
Labels
enhancement New feature or request good first issue Good for newcomers help wanted Extra attention is needed

Comments

@arnaud-clere
Copy link
Collaborator

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
@arnaud-clere arnaud-clere added enhancement New feature or request v2 labels Apr 24, 2020
@arnaud-clere
Copy link
Collaborator Author

TEMPLATE_F303.zip

@arnaud-clere arnaud-clere added help wanted Extra attention is needed good first issue Good for newcomers and removed v2 labels Apr 24, 2020
@JulienDevillers
Copy link
Collaborator

Pour info, je ne crois pas que l'écriture en flash, influe sur le DMA. L'écriture en flash fige l'accès à la flash et donc empêche le code de continuer de s'exécuter (s'il est en flash, ce qui est généralement le cas) tant que l'écriture n'est pas terminée.

Sur le L0, L1, cela n'influe pas sur le DMA (voir AN4808 chapitre 2.2 " Processes
independent from the core, such as DMA or peripherals may continue to work as long as
they avoid accessing the NVM bank."
).
Je pense que c'est pareil sur le F3. La sheet ne parle pas de stall du DMA pendant les fonctions de flash.

Si jamais ça aide.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request good first issue Good for newcomers help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests

2 participants