Multiple Definitions Veuillez jeter un œil à HowPo corriger l'erreur de linker Multiple Definitions
La bibliothèque Flashstorage_SAMD, basée et modifiée à partir de FlashStorage de Cristian Maglie, fournit un moyen pratique de stocker et de récupérer les données de l'utilisateur à l'aide de EepRom imitée, à partir de la mémoire flash non volatile des cartes SAMD21 / SAMD51.
La mémoire flash, généralement utilisée pour stocker le code du firmware, peut également être utilisée pour stocker / récupérer plus de données de l'utilisateur et plus rapidement que depuis EEPROM. Grâce à l' écriture et à la lecture des données tamponnées , le temps d'accès flash est considérablement réduit pour augmenter la durée de vie du flash .
Arduino IDE 1.8.19+ pour Arduino.Arduino SAMD core 1.8.13+ pour les cartes SAMD ARM Cortex-M0 +.Adafruit SAMD core 1.7.11+ pour les cartes SAMD ARM Cortex-M0 + et M4 (Nano 33 IoT, etc.).Seeeduino SAMD core 1.8.3+ pour les cartes SAMD21 / SAMD51 (Xiao M0, WIO Terminal, etc.).IndustruinoSAMD core 1.0.3+ pour les conseils SAMD21 (Industriino DG21, etc.).IndustruinoSAML core 1.0.0+ pour les planches SAML21 (Industrio 420 Maker, etc.).Sparkfun SAMD core 1.8.4+ pour les cartes SAMD21 / SAMD51 (SparkFun_redboard_Turbo, Sparkfun_Samd51_Thing_Plus, etc.). Le moyen le meilleur et le plus simple est d'utiliser Arduino Library Manager . Recherchez Flashstorage_SAMD , puis sélectionnez / installez la dernière version.
Une autre façon d'installer est de:
FlashStorage_SAMD-master.zip .FlashStorage_SAMD-masterFlashStorage_SAMD-master dans le répertoire des bibliothèques Arduino tels que ~/Arduino/libraries/ .Pour pouvoir compiler sans erreur et détecter et afficher automatiquement le nom de carte_nom sur les tableaux Arduino SAMD (nano-33-iot, etc.) , vous devez copier l'ensemble du répertoire Arduino SAMD Packages_Patches dans le répertoire Arduino SAMD (~ / .arduino15 / packages / arduino / matériel / samd / 1.8.13).
En supposant que la version Arduino SAMD est 1.8.13. Maintenant, un seul fichier doit être copié dans le répertoire:
~/.arduino15/packages/arduino/hardware/samd/1.8.13/platform.txtChaque fois qu'une nouvelle version est installée, n'oubliez pas de copier ces fichiers dans le nouveau répertoire de version. Par exemple, la nouvelle version est x.yy.zz
Ce fichier doit être copié dans le répertoire:
~/.arduino15/packages/arduino/hardware/samd/x.yy.zz/platform.txtEn supposant que la version Arduino SAMD est de 1.8.9. Ces fichiers doivent être copiés dans le répertoire:
~/.arduino15/packages/arduino/hardware/samd/1.8.9/platform.txt~/.arduino15/packages/arduino/hardware/samd/1.8.9/cores/arduino/Arduino.hChaque fois qu'une nouvelle version est installée, n'oubliez pas de copier ces fichiers dans le nouveau répertoire de version. Par exemple, la nouvelle version est x.yy.z
Ces fichiers doivent être copiés dans le répertoire:
~/.arduino15/packages/arduino/hardware/samd/x.yy.z/platform.txt~/.arduino15/packages/arduino/hardware/samd/x.yy.z/cores/arduino/Arduino.hCeci est obligatoire pour corriger la célèbre erreur du compilateur Arduino SAMD . Voir Améliorer la compatibilité Arduino avec le STL (MAX MACRO)
...arm-none-eabiincludec++7.2.1bitsstl_algobase.h:243:56: error: macro "min" passed 3 arguments, but takes just 2
min(const _Tp& __a, const _Tp& __b, _Compare __comp)
Chaque fois que le problème d'erreur du compilateur mentionné ci-dessus est résolu avec la nouvelle version Arduino SAMD, vous n'avez plus besoin de copier le fichier Arduino.h .
Pour pouvoir compiler sans erreur et détecter et afficher automatiquement la carte de carte sur les tableaux Adafruit SAMD (Itsy Bitsy M4, etc.) , vous devez copier les fichiers dans Adafruit SAMD Packages_Patches dans Adafruit SAMD Directory (~ / .arduino15 / packages / adafruit / matériel / samd / 1.7.11).
En supposant que la version Adafruit SAMD Core est de 1.7.11. Ce fichier doit être copié dans le répertoire:
~/.arduino15/packages/adafruit/hardware/samd/1.7.11/platform.txt~/.arduino15/packages/adafruit/hardware/samd/1.7.11/cores/arduino/Print.h~/.arduino15/packages/adafruit/hardware/samd/1.7.11/cores/arduino/Print.cppChaque fois qu'une nouvelle version est installée, n'oubliez pas de copier ce fichier dans le nouveau répertoire de version. Par exemple, la nouvelle version est x.yy.zz Ce fichier doit être copié dans le répertoire:
~/.arduino15/packages/adafruit/hardware/samd/x.yy.zz/platform.txt~/.arduino15/packages/adafruit/hardware/samd/x.yy.zz/cores/arduino/Print.h~/.arduino15/packages/adafruit/hardware/samd/x.yy.zz/cores/arduino/Print.cppPour pouvoir compiler sans erreur et détecter et afficher automatiquement la carte à bord_anneau sur des cartes de SeeDeduino SAMD (Xiao M0, WIO Terminal, etc.) , vous devez copier les fichiers dans ReeDuino SAMD Packages_Patches dans ReeDuino SAMD Directory (~ / .arduino15 / packages / SeeDuino / Hardware / SAMD / 1.8.3).
En supposant que la version de SeeDeduino SAMD Core est de 1.8.3. Ce fichier doit être copié dans le répertoire:
~/.arduino15/packages/Seeeduino/hardware/samd/1.8.3/platform.txt~/.arduino15/packages/Seeeduino/hardware/samd/1.8.3/cores/arduino/Arduino.h~/.arduino15/packages/Seeeduino/hardware/samd/1.8.3/cores/arduino/Print.h~/.arduino15/packages/Seeeduino/hardware/samd/1.8.3/cores/arduino/Print.cppChaque fois qu'une nouvelle version est installée, n'oubliez pas de copier ce fichier dans le nouveau répertoire de version. Par exemple, la nouvelle version est x.yy.zz Ce fichier doit être copié dans le répertoire:
~/.arduino15/packages/Seeeduino/hardware/samd/x.yy.zz/platform.txt~/.arduino15/packages/Seeeduino/hardware/samd/x.yy.zz/cores/arduino/Arduino.h~/.arduino15/packages/Seeeduino/hardware/samd/x.yy.zz/cores/arduino/Print.h~/.arduino15/packages/Seeeduino/hardware/samd/x.yy.zz/cores/arduino/Print.cppPour pouvoir se compiler sans erreur et détecter et afficher automatiquement la carte à carte sur SparkFun SAMD (Xiao Sparkfun_redboard_Turbo, SparkFun_Samd51_Thing_Plus, etc.
En supposant que la version SparkFun SAMD Core est de 1.8.3. Ce fichier doit être copié dans le répertoire:
~/.arduino15/packages/SparkFun/hardware/samd/1.8.3/cores/arduino/Print.h~/.arduino15/packages/SparkFun/hardware/samd/1.8.3/cores/arduino/Print.cpp~/.arduino15/packages/SparkFun/hardware/samd/1.8.3/cores/arduino51/Print.h~/.arduino15/packages/SparkFun/hardware/samd/1.8.3/cores/arduino51/Print.cppChaque fois qu'une nouvelle version est installée, n'oubliez pas de copier ce fichier dans le nouveau répertoire de version. Par exemple, la nouvelle version est x.yy.zz Ce fichier doit être copié dans le répertoire:
~/.arduino15/packages/SparkFun/hardware/samd/x.yy.zz/cores/arduino/Print.h~/.arduino15/packages/SparkFun/hardware/samd/x.yy.zz/cores/arduino/Print.cpp~/.arduino15/packages/SparkFun/hardware/samd/x.yy.zz/cores/arduino51/Print.h~/.arduino15/packages/SparkFun/hardware/samd/x.yy.zz/cores/arduino51/Print.cppMultiple Definitions L'implémentation actuelle de la bibliothèque, en utilisant xyz-Impl.h au lieu de xyz.cpp standard, crée peut-être certaines erreurs de liaison Multiple Definitions dans certains cas d'utilisation.
Vous pouvez inclure ce fichier .hpp
// Can be included as many times as necessary, without `Multiple Definitions` Linker Error
# include " FlashStorage_SAMD.hpp " // https://github.com/khoih-prog/FlashStorage_SAMD Dans de nombreux fichiers. Mais assurez-vous d'utiliser le fichier .h suivant dans seulement 1 .h , .cpp ou .ino File , qui ne doit être inclus dans aucun autre fichier , pour éviter l'erreur de linker Multiple Definitions
// To be included only in main(), .ino with setup() to avoid `Multiple Definitions` Linker Error
# include " FlashStorage_SAMD.h " // https://github.com/khoih-prog/FlashStorage_SAMD Vérifiez le nouvel exemple de multifileproject pour une démo HOWTO .
Jetez un œil à la discussion dans un comportement différent en utilisant le SRC_CPP ou SRC_H LIB # 80
La mémoire flash a une quantité limitée de cycles d'écriture. Les souvenirs flash typiques peuvent effectuer environ 10000 écritures de cycles au même bloc flash avant de commencer à "s'use" et commencer à perdre la capacité de conserver les données.
Donc , méfiez-vous: une mauvaise utilisation de cette bibliothèque peut détruire rapidement et en permanence la mémoire flash de votre micro , en particulier, vous devez éviter d'appeler la fonction write() trop souvent et de vous assurer que dans toute la vie du micro, le nombre d'appels pour write reste bien en dessous de la limite ci-dessus de 10000 (c'est un bon nombre de cycles pour garder ce nombre à l'esprit même si le fabricant de la micro garantit un plus grand nombre de cycles).
La même prudence doit être prise si vous utilisez l'émulation de l'API EEPROM (voir ci-dessous) avec la fonction EEPROM.commit() .
Tout d'abord, vous devez déclarer un objet Global FlashStorage pour chaque données que vous avez l'intention de stocker dans la mémoire flash.
Par exemple, si vous souhaitez stocker l'âge d'une personne, vous devez déclarer un age_storage comme ceci:
FlashStorage (age_storage, int ); Cette instruction signifie "Créez un FlashStorage pour stocker une variable int et l'appelez age_storage ". Vous pouvez maintenant utiliser age_storage comme un endroit pour stocker en toute sécurité un entier:
void readAndStoreUserAge ()
{
Serial. println ( " Please enter your age: " );
String age = Serial. readStringUntil ( ' n ' );
age_storage. write (age. toInt ()); // <-- save the age
}Après une réinitialisation du microcontrôleur pour récupérer l'âge stocké que vous pouvez utiliser:
int user_age = age_storage.read(); Incluez FlashStorage_SAMD.h pour obtenir une émulation EEPROM avec la mémoire flash interne.
Voir Erulateeprom Sketch pour un exemple.
L'API est très similaire à l'API bien connue de la bibliothèque Arduino EEPROM, mais avec 4 fonctions supplémentaires:
bool isValid() renvoie true si les données dans le eeprom imité sont valides (les données écrites pour flash au moins une fois par EEPROM.commit() ou EEPROM.put() ). Par ailleurs, les données en Eeprom sont "non définies" et la fonction renvoie false .void commit() Stockez les données EEPROM dans Flash. Utilisez-le avec soin: chaque appel écrit les données complètes de l'eeprom émulées à flasher. Cela réduira les cycles flash restants. N'appelez pas cette méthode dans une boucle ou vous tuerez bientôt votre flash.void setCommitASAP(bool value = true) pour définir ou effacer la variable privée _commitASAP (par défaut est true pour être sûr). Si _Commitasap est faux, l'appel à EEPROM.put() ne forcera pas le EEPROM.commit() pour prolonger la durée de vie du flash. Vous devrez vous soucier d'appeler manuellement EEPROM.commit() pour enregistrer les données imitables-eeprom dans le flash ou les données seront perdues.bool getCommitASAP() pour renvoyer la valeur actuelle de _commitASAP .Flashstorage_Samd / Exemples / StorenameAndurname / StorenameAndurname.ino
Lignes 26 à 128 en 102e13e
Ce qui suit est l'exemple de sortie de terminal lors de l'exécution de l'exemple W5500_Blynk sur Adafruit SAMD51 ITSYBITSY_M4 en utilisant W5500 Ethernet Shield
Start W5500_Blynk on ITSYBITSY_M4
[ 936 ] ChkCrR:CrCCSum= 0xaf50 ,CrRCSum= 0xffffffff
[ 936 ] CCSum= 0x0 ,RCSum= 0x0
[ 936 ] Invalid Stored Dynamic Data. Load default from Sketch
[ 937 ] SaveEEPROM,Sz= 1024 ,DataSz= 0 ,WCSum= 0x1d4d
[ 944 ] CrCCSum= 0x29a6
[ 944 ] MAC:FE-A8- 80 -C6-CE-A3
_pinCS = 0
W5100 init, using SS_PIN_DEFAULT = 10 , new ss_pin = 10 , W5100Class::ss_pin = 1
W5100::init: W5500, SSIZE = 8192
[ 2632 ] IP: 192.168.2.153
[ 2633 ] b:Stay in CfgPortal:No CfgDat
[ 2633 ] CfgIP= 192.168.2.153
F
Your stored Credentials :
MQTT Server = default -mqtt-server
Port = 1883
MQTT UserName = default -mqtt-username
MQTT PWD = default -mqtt-password
Subs Topics = default -mqtt-SubTopic
Pubs Topics = default -mqtt-PubTopic
FFFFF
[ 339285 ] SaveEEPROM,Sz= 1024 ,DataSz= 0 ,WCSum= 0x2e89
[ 339292 ] CrCCSum= 0x219f Save => Redémarrer Start W5500_Blynk on ITSYBITSY_M4
[ 1547 ] ChkCrR:CrCCSum= 0x219f ,CrRCSum= 0x219f
[ 1547 ] CCSum= 0x0 ,RCSum= 0x0
[ 1548 ] CrCCSum= 0x219f ,CrRCSum= 0x219f
[ 1548 ] ======= Start Stored Config Data =======
[ 1548 ] Hdr=W5X00,BName=Seeeduino_W5500_BlynkWM
[ 1548 ] Svr=account.duckdns.org,Tok=new_token1
[ 1549 ] Svr1=account.ddns.net,Tok1=new_token2
[ 1549 ] Prt= 8080 ,SIP= 192.168.2.220
[ 1549 ] connectEthernet: Use static_IP= 192.168.2.220
[ 1549 ] MAC:FE-A1-D4-BC- E8 -CB
W5100 init, using SS_PIN_DEFAULT = 10 , new ss_pin = 10 , W5100Class::ss_pin = 1
W5100::init: W5500, SSIZE = 8192
[ 3131 ] IP: 192.168.2.220
[ 3131 ] bg:ECon.TryB
[ 3131 ]
___ __ __
/ _ )/ /_ _____ / /__
/ _ / / // / _ / '_/
/____/_/_, /_ // _/_/_
/___/ v0.6.1 on Arduino Zero
[ 3132 ] BlynkArduinoClient.connect: Connecting to account.duckdns.org: 8080
[ 3244 ] Ready (ping: 6ms).
[ 3311 ] Connected to BlynkServer=account.duckdns.org,Token=new_token1
[ 3311 ] bg:EBCon
Conn2Blynk: server = account.duckdns.org, port = 8080
Token = new_token1, IP = 192.168.2.220
B
Your stored Credentials :
MQTT Server = new -mqtt-server
Port = 1883
MQTT UserName = new -mqtt-username
MQTT PWD = new -mqtt-password
Subs Topics = new -mqtt-SubTopic
Pubs Topics = new -mqtt-PubTopic
BBBBBBBBB BBBBBBBBBB BBBBBBBBBB BBBBBBBBBB BBBBBBBBBB BBBBBBBBBB BBBBBBBBBBStart StoreNameAndSurname on SEEED_XIAO_M0
FlashStorage_SAMD v1 .3.2
EEPROM length: 1024
EEPROM is empty, writing WRITTEN_SIGNATURE and some example data:
Insert your name : John
Insert your surname : Doe
<< Your name: John. Your surname: Doe >> have been saved. Thank you!
You can reset to check emulated-EEPROM data retention.Start StoreNameAndSurname on SEEED_XIAO_M0
FlashStorage_SAMD v1 .3.2
EEPROM length: 1024
Hi John Doe, nice to see you again :-)
Clearing WRITTEN_SIGNATURE for next try
Done clearing signature in emulated EEPROM. You can reset nowStart EEPROM_Clear on SEEED_XIAO_M0
FlashStorage_SAMD v1 .3.2
Emulated EEPROM length (bytes) = 1024
Done clearing emulated EEPROM. Time spent (ms) = 11
Start EEPROM_Clear on SEEED_XIAO_M0
FlashStorage_SAMD v1 .3.2
Emulated EEPROM length (bytes) = 2048
Done clearing emulated EEPROM. Time spent (ms) = 22Start EEPROM_Clear on SEEED_XIAO_M0
FlashStorage_SAMD v1 .3.2
Emulated EEPROM length (bytes) = 4096
Done clearing emulated EEPROM. Time spent (ms) = 42Start EEPROM_get on SEEED_XIAO_M0
FlashStorage_SAMD v1 .3.2
EEPROM length: 1024
EEPROM doesn ' t store valid data, writing WRITTEN_SIGNATURE and some example data
Float written to EEPROM: 123.456
Done writing custom object to EEPROM:
===============
Field1: 3.14159
Field2: 65
Name: Working!
===============
Reset to see how you can retrieve the values by using EEPROM_get! Start EEPROM_get on SEEED_XIAO_M0
FlashStorage_SAMD v1 .3.2
EEPROM length: 1024
EEPROM has valid data with WRITTEN_SIGNATURE. Now read some example data
Read float from EEPROM: 123.456
Read custom object from EEPROM:
===============
Field1: 3.14159
Field2: 65
Name: Working!
=============== Oui, vous pouvez déclarer une struct avec plus de champs et appeler un EEPROM.put() pour stocker toute la structure. Voir le nom de STORENAMENDSURS pour comment le faire.
Oui, chaque fois que vous téléchargez un nouveau croquis, le contenu précédent du Flashstorage est effacé.
Non. Si votre planche fournit un intégré-eneprom, il est conseillé de l'utiliser parce que EEPROM a une durée de vie plus longue, un nombre de cycles d'écriture, etc.).
En l'absence d'un intégré-heeprom ou sa taille est trop petit pour votre cas d'utilisation, vous pouvez utiliser cette bibliothèque pour utiliser une mémoire flash à petite partie comme émulé-eeprom, à condition que vous gardez à l'esprit les limites comme en nombre limité d'écritures
Si vous obtenez des erreurs de compilation, le plus souvent, vous devrez peut-être installer une version plus récente du noyau pour les tableaux Arduino.
Parfois, la bibliothèque ne fonctionnera que si vous mettez à jour le noyau de la carte vers la dernière version car j'utilise des fonctions nouvellement ajoutées.
Soumettre les problèmes à: Flashstorage_SAMD Problèmes
EEPROM.put() et EEPROM.get() pour lire / écrire toute la structure en eeprom imitémultiple-definitions .SAMD21E1xA , SAMD21G1xA et SAMD21J1xA![]() Cristian Maglie |
Si vous souhaitez contribuer à ce projet: