Comment puis-je exécuter un extrait de code une seule fois dans la durée de vie d'un programme? Il peut être désactivé et réactivé plusieurs fois. La seule option pour exécuter à nouveau l'extrait de code doit être de flasher à nouveau la carte.
Le code est une section d'étalonnage que je ne veux pas réexécuter. Si j'utilise EEPROM ou Flash, nous définirons un indicateur sur vrai ou faux. Ainsi, lorsque nous lisons pour la première fois cet emplacement de mémoire, quelle serait la valeur aléatoire dans cette zone de mémoire?
Quelle est la meilleure méthode pour implémenter cela en C embarqué?
microcontroller
c
embedded
ganeshredcobra
la source
la source
Réponses:
Votre microcontrôleur peut avoir de l'EEPROM, de la mémoire OTP, des bits de fusible utilisateur, où vous pouvez définir un indicateur.
Il n'y a pas de "meilleure méthode en C embarqué", l'écriture de mémoire non volatile est différente dans chaque microcontrôleur.
Éditer:
ÉCLAT
Le contenu de la mémoire flash est effacé lors de la programmation de l'appareil. Après la programmation, tous les octets non écrits contiennent 0xFF. Consultez la fiche technique pour trouver une zone qui peut être programmée en toute sécurité à partir du firmware en cours d'exécution.
EEPROM
Bien que cela ne soit pas garanti dans les fiches techniques, toutes les EEPROM que j'ai vues jusqu'à présent contenaient 0xFF: s lorsqu'elles sont expédiées de l'usine (sauf celles préprogrammées avec une adresse MAC unique, mais cela est explicitement documenté). Certains appareils / logiciels de programmation peuvent également effacer ou programmer le contenu de l'EEPROM. Certains peuvent être protégés en écriture, de façon permanente ou réversible.
OTP
La mémoire programmable unique contient toujours des valeurs initiales bien définies, documentées dans la fiche technique.
C'est toujours une bonne idée d'inclure une bonne somme de contrôle comme CRC32 avec les données écrites, pour se protéger contre la corruption de données causée par des pièces défectueuses, des erreurs de transmission, des rayons cosmiques, peu importe.
la source
Tu as dit:
D'autres ont dit d'utiliser EEPROM pour stocker un indicateur pour indiquer quand la fonction run_once () a été exécutée. Cependant, cela a un inconvénient qui est que si vous reflasher le microcontrôleur, le drapeau ran_it_once dans EEPROM a déjà été défini et la fonction run_once () ne sera pas exécutée. Si votre microcontrôleur a intégré l'EEPROM, il peut être possible d'effacer l'indicateur ran_it_once lorsque vous reflasher le microcontrôleur, si le programmeur le prend en charge.
Une meilleure façon consiste à avoir des numéros de version dans l'EEPROM et le code. Lorsque le code s'exécute à la mise sous tension, il doit lire le numéro de version de l'EEPROM et le comparer au numéro de version stocké dans le code. S'ils ne correspondent pas, la fonction run_once () est appelée et le dernier acte du code run_once () consiste à écrire le numéro de version du firmware dans l'EEPROM. Chaque fois que vous modifiez le code source du firmware, vous devez incrémenter le numéro de version intégré.
la source
Choisissez un microcontrôleur qui peut écrire / effacer sa propre mémoire de programme. Après avoir exécuté le code en question, demandez à la dernière partie dudit code de remplacer la première instruction par un saut qui la contourne. En option, vous pouvez également effacer le reste (peut-être le remplacer par nop), de sorte qu'il n'y a absolument aucune chance qu'il soit à nouveau exécuté.
Ce message s'autodétruit dans 5..4 ...
la source
Comme vous utilisez ce code pour l'étalonnage, ma suggestion serait de créer un processus de souffle qui exécute le code d'étalonnage comme première étape et ne pas même l'avoir sur la version de production finie de la carte. Ceci est similaire à la réponse de apalopohapa, sauf différent dans le sens où vous auriez deux charges de programme distinctes: avoir un processus de souffle qui flashe la première charge de programme qui exécute tous les étalonnages et crache les données de cela. Prenez ensuite ces données et incorporez-les aux données de la deuxième charge de programme.
L'un des avantages de cette approche est que vous minimisez absolument la quantité d'espace de stockage dont vous avez besoin - vous n'avez pas besoin de stocker votre code unique, uniquement les données qu'il génère. En ayant un processus de souffle qui charge deux programmes distincts, vous vous isolez également un peu des bogues dans le code d'initialisation qui pourraient persister autrement. Vous avez également une certaine flexibilité supplémentaire si vous souhaitez réexécuter votre code d'étalonnage: au lieu d'avoir à écrire du code supplémentaire pour effacer tout bit indiquant que votre code a été exécuté (ce qui pourrait déjà être effacé accidentellement), vous réexécutez simplement votre processus de souffle.
la source