Multiple Definitions Error de enlazador Eche un vistazo a cómo solucionar Multiple Definitions Error de enlazador
La biblioteca FlashStorage_SAMD, basada y modificada de Cristian Maglie's FlashStorage, proporciona una forma conveniente de almacenar y recuperar los datos del usuario utilizando EMULET-EPROM, desde la memoria flash no volátil de los tableros SAMD21/SAMD51.
La memoria flash, generalmente utilizada para almacenar el código de firmware, también se puede utilizar para almacenar / recuperar más datos del usuario y más rápido que EEPROM. Gracias a la escritura y lectura de datos almacenados , el tiempo de acceso flash se reduce enormemente para aumentar la vida útil del flash .
Arduino IDE 1.8.19+ para Arduino.Arduino SAMD core 1.8.13+ para tableros Samd Arm Cortex-M0+.Adafruit SAMD core 1.7.11+ para tableros Samd Arm Cortex-M0+ y M4 (Nano 33 IoT, etc.).Seeeduino SAMD core 1.8.3+ para tableros SAMD21/SAMD51 (Xiao M0, Terminal WIO, etc.).IndustruinoSAMD core 1.0.3+ para juntas SAMD21 (Industruino DG21, etc.).IndustruinoSAML core 1.0.0+ para tableros SAML21 (Industruino 420maker, etc.).Sparkfun SAMD core 1.8.4+ para tableros SAMD21/SAMD51 (SparkFun_Redboard_Turbo, SparkFun_Samd51_thing_Plus, etc.). La mejor y más fácil forma es usar Arduino Library Manager . Busque flashstorage_samd , luego seleccione / instale la última versión.
Otra forma de instalar es:
FlashStorage_SAMD-master.zip .FlashStorage_SAMD-masterFlashStorage_SAMD-master al directorio de las bibliotecas Arduino, como ~/Arduino/libraries/ .Para poder compilar sin error y detectar y mostrar automáticamente Board_Name en las placas Arduino Samd (Nano-33-IoT, etc.) , debe copiar todo el directorio Arduino Samd Packages_Patches en Arduino Samd Directory (~/.arduino15/paquetes/Arduino/hardware/samd/1.8.13).
Suponiendo que la versión Arduino SAMD es 1.8.13. Ahora solo se debe copiar un archivo en el directorio:
~/.arduino15/packages/arduino/hardware/samd/1.8.13/platform.txtCada vez que se instala una nueva versión, recuerde copiar estos archivos en el directorio de nueva versión. Por ejemplo, la nueva versión es x.yy.zz
Este archivo debe copiarse en el directorio:
~/.arduino15/packages/arduino/hardware/samd/x.yy.zz/platform.txtSuponiendo que la versión Arduino SAMD es 1.8.9. Estos archivos deben copiarse en el directorio:
~/.arduino15/packages/arduino/hardware/samd/1.8.9/platform.txt~/.arduino15/packages/arduino/hardware/samd/1.8.9/cores/arduino/Arduino.hCada vez que se instale una nueva versión, recuerde copiar estos archivos en el directorio de nueva versión. Por ejemplo, la nueva versión es x.yy.z
Estos archivos deben copiarse en el directorio:
~/.arduino15/packages/arduino/hardware/samd/x.yy.z/platform.txt~/.arduino15/packages/arduino/hardware/samd/x.yy.z/cores/arduino/Arduino.hEsto es obligatorio para corregir el famoso error del compilador Arduino Samd . Ver Mejor la compatibilidad de Arduino con el STL (Min y 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)
Cada vez que se soluciona el problema de error del compilador mencionado anteriormente con la nueva versión de Arduino SAMD, ya no necesita copiar el archivo Arduino.h .
Para poder compilar sin error y detectar y mostrar automáticamente los tableros de AdaFruit Samd (Itsy-Bitsy M4, etc.) , debe copiar los archivos en los paquetes de AdaFruit SAMD_Patches en el directorio AdaFruit SAMD (~/.arduino15/paquetes/Adafruit/hardware/samd/1.7.11).
Suponiendo que la versión de AdaFruit SAMD es 1.7.11. Este archivo debe copiarse en el directorio:
~/.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.cppCada vez que se instala una nueva versión, recuerde copiar este archivo en el directorio de nueva versión. Por ejemplo, la nueva versión es x.yy.zz Este archivo debe copiarse en el directorio:
~/.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.cppPara poder compilar sin error y detectar y mostrar automáticamente los tableros de Seeeduino samd (Xiao M0, WIO Terminal, etc.) , debe copiar los archivos en los paquetes Seeeduino samd_patches en el directorio Seeeduino Samd (~/.
Suponiendo que la versión de Seeeduino Samd es 1.8.3. Este archivo debe copiarse en el directorio:
~/.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.cppCada vez que se instala una nueva versión, recuerde copiar este archivo en el directorio de nueva versión. Por ejemplo, la nueva versión es x.yy.zz Este archivo debe copiarse en el directorio:
~/.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.cppPara poder compilar sin error y detectar automáticamente y mostrar Board_Name en las tablas SparkFun Samd (Xiao SparkFun_Redboard_Turbo, SparkFun_Samd51_Thing_Plus, etc) , debe copiar el archivo SparkFun Samd Packages_Patches en Directory Samd Samd (~/.
Suponiendo que la versión SparkFun Samd Core es 1.8.3. Este archivo debe copiarse en el directorio:
~/.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.cppCada vez que se instala una nueva versión, recuerde copiar este archivo en el directorio de nueva versión. Por ejemplo, la nueva versión es x.yy.zz Este archivo debe copiarse en el directorio:
~/.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 Error de enlazador La implementación actual de la biblioteca, utilizando xyz-Impl.h en lugar del estándar xyz.cpp , posiblemente crea ciertos errores de enlazador Multiple Definitions en ciertos casos de uso.
Puede incluir este archivo .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 en muchos archivos. Pero asegúrese de usar el siguiente archivo .h en solo 1 .h , .cpp o archivo .ino , que no debe incluirse en ningún otro archivo , para evitar Multiple Definitions Error de enlazador
// 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 Verifique el nuevo ejemplo de mulifileproject para obtener una demostración HOWTO .
Eche un vistazo a la discusión en un comportamiento diferente utilizando el src_cpp o src_h lib #80
La memoria flash tiene una cantidad limitada de ciclos de escritura. Los recuerdos de flash típicos pueden realizar alrededor de 10000 ciclos de escritura al mismo bloque de flash antes de comenzar a "desgastarse" y comenzar a perder la capacidad de retener datos.
Así que tenga cuidado: el uso inadecuado de esta biblioteca puede destruir de manera rápida y permanente la memoria flash de su micro , en particular, debe evitar llamar a la función write() con demasiada frecuencia y asegurarse de que en toda la vida de los micro, el número de llamadas para write se mantenga por debajo del límite anterior de 10000 (es una buena regla de tumba para tener ese número en mente incluso si el fabricante del micro garantiza un número más grande de ciclos).
Se debe tener la misma precaución si está utilizando la emulación de la API EEPROM (ver más abajo) con la función EEPROM.commit() .
En primer lugar, debe declarar un objeto Global FlashStorage para cada datos que tiene la intención de almacenar en la memoria flash.
Por ejemplo, si desea almacenar la edad de una persona, debe declarar un age_storage como este:
FlashStorage (age_storage, int ); Esta instrucción significa "crear un FlashStorage para almacenar una variable int y llamarla age_storage ". Ahora puede usar age_storage como un lugar para almacenar de forma segura un entero:
void readAndStoreUserAge ()
{
Serial. println ( " Please enter your age: " );
String age = Serial. readStringUntil ( ' n ' );
age_storage. write (age. toInt ()); // <-- save the age
}Después de un reinicio del microcontrolador para recuperar la edad almacenada que puede usar:
int user_age = age_storage.read(); Incluya FlashStorage_SAMD.h para obtener una emulación EEPROM con la memoria flash interna.
Vea el boceto EmulateeProm para obtener un ejemplo.
La API es muy similar a la conocida API de la Biblioteca Eeprom Arduino, pero con 4 funciones adicionales:
bool isValid() devuelve true si los datos en el EeProm emulado son válidos (los datos escritos para flashear al menos una vez por EEPROM.commit() o EEPROM.put() ). De lo contrario, los datos emulados-EEPR están "indefinidos" y la función devuelve false .void commit() almacene los datos de EEPROM en flash. Use esto con cuidado: cada llamada escribe los datos completos de EEGROM emulados para flash. Esto reducirá los ciclos de escritura flash restantes. No llame a este método en un bucle o pronto matará su flash.void setCommitASAP(bool value = true) para establecer o borrar la variable privada _commitASAP (el valor predeterminado es true para ser seguro). Si _ComMitasAP es falso, la llamada a EEPROM.put() no obligará al EEPROM.commit() a extender la vida flash. Tendrá que recordar llamar EEPROM.commit() manualmente para guardar los datos emulados-EEPR en Flash o se perderán los datos.bool getCommitASAP() para devolver el valor actual de _commitASAP .FlashStorage_Samd/Ejemplos/StorenamEndsurname/Storenameandsurname.ino
Líneas 26 a 128 en 102E13E
La siguiente es la salida del terminal de muestra cuando se ejecuta el ejemplo W5500_BLYNK en AdaFruit SAMD51 ITSYBITSY_M4 usando 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 => Reiniciar 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!
=============== Sí, puede declarar una struct con más campos y llamar a un EEPROM.put() para almacenar toda la estructura. Vea el Storenameandndsurname sobre cómo hacerlo.
Sí, cada vez que subes un nuevo boceto, se borra el contenido anterior del flashstorage.
No. Si su junta proporciona un EEGROMEPROM integrado, es aconsejable usarlo porque EEPROM tiene una vida útil más larga, número de ciclos de escritura, etc.).
En ausencia de una E-Ee-Errem o su tamaño integrado es demasiado pequeño para su caso de uso, puede usar esta biblioteca para usar una memoria de una pequeña porción de memoria Flash como emulada-Error, siempre que tenga en cuenta los límites como en un número limitado de escrituras.
Si recibe errores de compilación, la mayoría de las veces, es posible que deba instalar una versión más nueva del núcleo para las tablas Arduino.
A veces, la biblioteca solo funcionará si actualiza el núcleo del tablero a la última versión porque estoy usando funciones recientemente agregadas.
Enviar problemas a: Problemas FlashStorage_Samd
EEPROM.put() y EEPROM.get() para leer/escribir toda la estructura en EMULET-EPROMmultiple-definitions .SAMD21E1xA , SAMD21G1xA y SAMD21J1xA![]() Maglie de Cristian |
Si desea contribuir a este proyecto: