Multiple Definitions Linker -Fehler Bitte werfen Sie einen Blick auf HowTO, um Multiple Definitions für Linkerfehler zu beheben
Die FlashStorage_Stm32-Bibliothek, inspiriert von Cristian Maglies FlashStorage, bietet eine bequeme Möglichkeit, die Daten des Benutzers mithilfe von Emuled-Eprom aus dem nichtflüchtigen Flash-Speicher von STM32F/L/H/G/WB/MP1 zu speichern und abzurufen.
Der Flash -Speicher, der im Allgemeinen zum Speichern des Firmware -Codes verwendet wird, kann auch zum Speichern / Abrufen von mehr Benutzerdaten und schneller als von EEPROM verwendet werden. Dank des gepufferten Datenschreibens und Lesens wird die Flash -Zugriffszeit stark verkürzt, um die Lebensdauer des Blitzes zu erhöhen .
Derzeit unterstützt die Bibliothek sowohl den neuen STM32-Core V2.0.0+ als auch der vorherige STM32 Core V1.9.0-
Arduino IDE 1.8.19+ für Arduino.Arduino Core for STM32 v2.3.0+ für STM32 -Boards. Der beste und einfachste Weg ist die Verwendung Arduino Library Manager . Suchen Sie nach FlashStorage_Stm32 und wählen Sie die neueste Version aus / installieren Sie sie. Sie können diesen Link auch für detailliertere Anweisungen verwenden.
Eine andere Möglichkeit zu installieren ist:
FlashStorage_STM32-main.zip herunter.FlashStorage_STM32-main VerzeichnisFlashStorage_STM32-main Ordners in das Verzeichnis von Arduino Libraries wie ~/Arduino/libraries/ . Für Generic STM32F4 series -Boards wie STM32F407VE unter Verwendung von LAN8720 verwenden Sie bitte STM32 CORE v2.2.0 als Breaking Core v2.3.0 Erstellt den Kompilierfehler.
LAN8720 für einige STM32 -Boards verwenden
Sie müssen die Dateien stm32f4xx_hal_conf_default.h und stm32f7xx_hal_conf_default.h in STM32 STM32 -Verzeichnis (~/.arduino15/Pakete/STM32/Hardware/Stm32/2.2.0/System) kopieren, um die alten Dateien zu überschreiben.
Angenommen, die STM32 STM32 -Kernversion ist 2.2.0. Diese Dateien müssen in das Verzeichnis kopiert werden:
~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F4xx/stm32f4xx_hal_conf_default.h für STM32F4.~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F7xx/stm32f7xx_hal_conf_default.h für nucleo-144 STM32F7.Wenn eine neue Version installiert ist, denken Sie daran, diese Datei in das neue Versionsverzeichnis zu kopieren. Beispielsweise ist eine neue Version X.yy.zz. Diese Dateien müssen in das entsprechende Verzeichnis kopiert werden:
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/system/STM32F4xx/stm32f4xx_hal_conf_default.hTo use Serial1 on some STM32 boards without Serial1 definition (Nucleo-144 NUCLEO_F767ZI, Nucleo-64 NUCLEO_L053R8, etc.) boards , you have to copy the files STM32 variant.h into STM32 stm32 directory (~/.arduino15/packages/STM32/hardware/stm32/2.3.0). Sie müssen die Dateien ändern, die Ihren Boards entsprechen. Dies ist nur eine Abbildung, wie es geht.
Angenommen, die STM32 STM32 -Kernversion ist 2.3.0. Diese Dateien müssen in das Verzeichnis kopiert werden:
~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_F767ZI/variant.h für nucleo-144 nucleo_f767zi.~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_L053R8/variant.h für nucleo-64 nucleo_l053r8.Wenn eine neue Version installiert ist, denken Sie daran, diese Datei in das neue Versionsverzeichnis zu kopieren. Beispielsweise ist eine neue Version X.yy.zz. Diese Dateien müssen in das entsprechende Verzeichnis kopiert werden:
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/variants/NUCLEO_F767ZI/variant.h~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/variants/NUCLEO_L053R8/variant.hMultiple Definitions Linker -Fehler Die aktuelle Implementierung der Bibliothek unter Verwendung von xyz-Impl.h anstelle von Standard xyz.cpp erstellt möglicherweise bestimmte Multiple Definitions Linkerfehler in bestimmten Anwendungsfällen.
Sie können diese .hpp -Datei einfügen
// Can be included as many times as necessary, without `Multiple Definitions` Linker Error
# include " FlashStorage_STM32.hpp " // https://github.com/khoih-prog/FlashStorage_STM32 in vielen Dateien. Verwenden Sie jedoch unbedingt die folgende .h -Datei in nur 1 .h , .cpp oder .ino -Datei , die in keiner anderen Datei enthalten sein darf, um Multiple Definitions zu vermeiden, linker
// To be included only in main(), .ino with setup() to avoid `Multiple Definitions` Linker Error
# include " FlashStorage_STM32.h " // https://github.com/khoih-prog/FlashStorage_STM32 Überprüfen Sie das neue MultifileProject -Beispiel für eine HOWTO -Demo.
Schauen Sie sich die Diskussion in unterschiedlichem Verhalten unter Verwendung des SRC_CPP oder SRC_H Lib #80 an
Der Flash -Speicher hat eine begrenzte Menge an Schreibzyklen. Typische Flash -Erinnerungen können etwa 10000 Schreibzyklen in denselben Flash -Block ausführen, bevor es mit dem "Abnutzen" beginnt, und die Fähigkeit zu verlieren, Daten zu halten.
Also vorsichtig: Die unangemessene Verwendung dieser Bibliothek kann den Flash-Speicher Ihres Micro schnell und dauerhaft zerstören . Insbesondere sollten Sie vermeiden, den put() oder commit() zu oft aufzurufen und sicherzustellen, dass im gesamten Leben des Mikro die Anzahl der Anrufe, die put() oder commit() weit unterhalb der oben genannten Grenze bleiben (es ist eine gute Anzahl von Zyklen, eine gute Anzahl von Zykeln).
Fügen Sie FlashStorage_STM32.h ein, um eine EEPROM -Emulation mit dem internen Flash -Speicher zu erhalten.
Siehe Emulationseeeeeeeeeeeeeeakrom -Skizze für ein Beispiel.
Die API ist der bekannten Arduino eeprom.h -API sehr ähnlich, aber mit 4 zusätzlichen Funktionen:
bool isValid() gibt true zurück, wenn Daten im emulierten Effekt gültig sind (die Daten, die mindestens einmal von EEPROM.commit() oder EEPROM.put() ) geschrieben wurden. Andernfalls sind emulierte Effektdaten "undefiniert" und die Funktion gibt false zurück.void commit() speichern die EEPROM -Daten in Flash. Verwenden Sie dies mit Sorgfalt: Jeder Anruf schreibt die vollständigen emulierten E-E-E-E-Daten, um zu blinken. Dadurch werden die verbleibenden Blitzschreiberzyklen verringert. Nennen Sie diese Methode nicht in einer Schleife, sonst töten Sie Ihren Blitz bald.void setCommitASAP(bool value = true) um die private Variable _commitASAP festzulegen oder zu löschen (Standard ist true , um sicher zu sein). Wenn _commitasap falsch ist, erzwingt der Aufruf an EEPROM.put() das EEPROM.commit() nicht, die Flash -Lebensdauer zu verlängern. Sie müssen sich daran erinnern, EEPROM.commit() manuell anzurufen, um die emulierten Effektdaten in Flash zu speichern, oder Daten gehen verloren.bool getCommitASAP() , um den aktuellen Wert von _commitASAP zurückzugeben.Bi_Ethernet_blynk
Bi_Ethernet_blynk_email
Bi_Ethernet_wm_config
Lan8720_Ethernet_blynk
Lan8720_Ethernet_blynk_email
Lan8720_Ethernet_wm_config
......
und noch viele mehr zu Bibliotheken kommen.
FlashStorage_Stm32/Beispiele/StorenAmandsurname/StorenAmandsurname.ino
Zeilen 15 bis 106 in BB0DD71
Das Folgende ist die Beispielanschlussausgabe beim Ausführen von Beispiel Ethernet_STM32_LAN8720 auf STM32F4 Black_f407ve mit Lan8720 Ethernet mit der STM32Ethernet -Bibliothek.
Start Ethernet_STM32_LAN8720 on BLACK_F407VE
Ethernet Shield type : LAN8720 Ethernet & STM32Ethernet Library
Ethernet_Manager_STM32 v1 .3.2
DoubleResetDetector_Generic v1 .8.1
EEPROM size = 16384 , start = 0
Flag read = 0xd0d04321
No doubleResetDetected
SetFlag write = 0xd0d01234
[ETM] EEPROMsz: 4096
[ETM] EEPROM Length ():16384
[ETM] CCSum=0xaed,RCSum=0x4d385471
[ETM] ChkCrR:CrCCsum=0x21dd,CrRCsum=0x3338
[ETM] InitCfgFile,sz=60
[ETM] SaveEEPROM,Sz=16384,DataSz=0,WCSum=0x569
[ETM] CrCCSum=0xc30
[ETM] Start connectEthernet using DHCP
[ETM] MAC:FE-98-FC-DD-D9-BA
[ETM] Dynamic IP OK, connected
[ETM] IP:192.168.2.169
[ETM] bg: isForcedConfigPortal = false
[ETM] bg:Stay forever in CP:No ConfigDat
Connected! IP address: 192.168.2.169
Your stored Credentials :
MQTT Server = blank
Port = blank
MQTT UserName = blank
MQTT PWD = blank
Subs Topics = blank
Pubs Topics = blank
HStop doubleResetDetecting
ClearFlag write = 0xd0d04321
HHHHH[ETM] h:Updating EEPROM. Please wait for reset
[ETM] SaveEEPROM,Sz=16384,DataSz=0,WCSum=0x729
[ETM] CrCCSum=0x1087
[ETM] h:Rst
Start Ethernet_STM32_LAN8720 on BLACK_F407VE
Ethernet Shield type : LAN8720 Ethernet & STM32Ethernet Library
Ethernet_Manager_STM32 v1 .3.2
DoubleResetDetector_Generic v1 .8.1
EEPROM size = 16384 , start = 0
Flag read = 0xd0d04321
No doubleResetDetected
SetFlag write = 0xd0d01234
[ETM] EEPROMsz: 4096
[ETM] EEPROM Length ():16384
[ETM] CCSum=0x729,RCSum=0x729
[ETM] ChkCrR:CrCCsum=0x1087,CrRCsum=0x1087
[ETM] CrCCSum=1087,CrRCSum=1087
[ETM] Valid Stored Dynamic Data
[ETM] ======= Start Stored Config Data =======
[ETM] Header=STM32, BoardName=Black_V407VE
[ETM] StaticIP=blank
[ETM] Start connectEthernet using DHCP
[ETM] MAC:FE-98-FD-D6-DA-BA
[ETM] Dynamic IP OK, connected
[ETM] IP:192.168.2.170
[ETM] begin:Ethernet Connected.
Connected! IP address: 192.168.2.170
Your stored Credentials :
MQTT Server = mqtt_server
Port = 1883
MQTT UserName = mqtt_user
MQTT PWD = mqtt_pass
Subs Topics = Subs
Pubs Topics = Pubs
HStop doubleResetDetecting
ClearFlag write = 0xd0d04321
HSetFlag write = 0xd0d01234
[ETM] EEPROMsz:4096
[ETM] EEPROM Length():16384
[ETM] CCSum=0x729,RCSum=0x729
[ETM] ChkCrR:CrCCsum=0x1087,CrRCsum=0x1087
[ETM] CrCCSum=1087,CrRCSum=1087
[ETM] Valid Stored Dynamic Data
[ETM] ======= Start Stored Config Data =======
[ETM] Header=STM32, BoardName=Black_V407VE
[ETM] StaticIP=blank
[ETM] Start connectEthernet using DHCP
[ETM] MAC:FE-98-FD-D6-DB-BA
[ETM] Dynamic IP OK, connected
[ETM] IP:192.168.2.149
[ETM] begin:Ethernet Connected.
Connected! IP address: 192.168.2.149
Your stored Credentials :
MQTT Server = mqtt_server
Port = 1883
MQTT UserName = mqtt_user
MQTT PWD = mqtt_pass
Subs Topics = Subs
Pubs Topics = Pubs
HStop doubleResetDetecting
ClearFlag write = 0xd0d04321
HHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH
HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH
HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH
HHHHHHHHHH HHHHHHHHHH HHHHHHHHHH HDas Folgende ist der Probenanschlussausgang beim Ausführen von Beispiels StorenAmandsurname auf STM32H7 Nucleo-144 Nucleo_H743ZI2
Start StoreNameAndSurname on NUCLEO_H743ZI2
FlashStorage_STM32 v1 .2.0
EEPROM length: 16384
EEPROM is empty, writing WRITTEN_SIGNATURE and some example data:
Insert your name : My_Name
Insert your surname : My_Surname
<< Your name: My_Name
. Your surname: My_Surname
>> have been saved. Thank you!Start StoreNameAndSurname on NUCLEO_H743ZI2
FlashStorage_STM32 v1 .2.0
EEPROM length: 16384
Hi My_Name
My_Surname
, nice to see you again :-)
Clearing WRITTEN_SIGNATURE for next try
Done clearing signature in emulated EEPROM. You can reset nowIm Folgenden ist der Probenanschlussausgang beim Ausführen von Beispiels StorenAm und Name auf STM32L5 Nucleo-144 nucleo_l552ze_q
Start StoreNameAndSurname on NUCLEO_L552ZE_Q
FlashStorage_STM32 v1 .2.0
EEPROM length: 2048
EEPROM is empty, writing WRITTEN_SIGNATURE and some example data:
Insert your name : My_Name
Insert your surname : My_Surname
<< Your name: My_Name
. Your surname: My_Surname
>> have been saved. Thank you!Start StoreNameAndSurname on NUCLEO_L552ZE_Q
FlashStorage_STM32 v1 .2.0
EEPROM length: 2048
Hi My_Name
My_Surname
, nice to see you again :-)
Clearing WRITTEN_SIGNATURE for next try
Done clearing signature in emulated EEPROM. You can reset nowDas Folgende ist der Probenanschlussausgang beim Ausführen von Beispiels StorenAndsurname auf STM32F7 Nucleo-144 Nucleo_F767ZI
Start StoreNameAndSurname on NUCLEO_F767ZI
FlashStorage_STM32 v1 .2.0
EEPROM length: 16384
EEPROM is empty, writing WRITTEN_SIGNATURE and some example data:
Insert your name : My_Name
Insert your surname : My_Surname
<< Your name: My_Name
. Your surname: My_Surname
>> have been saved. Thank you!Start StoreNameAndSurname on NUCLEO_F767ZI
FlashStorage_STM32 v1 .2.0
EEPROM length: 16384
Hi My_Name
My_Surname
, nice to see you again :-)
Clearing WRITTEN_SIGNATURE for next try
Done clearing signature in emulated EEPROM. You can reset now Ja, Sie können eine struct mit mehr Feldern deklarieren und einen EEPROM.put() anrufen, um die gesamte Struktur zu speichern. Sehen Sie sich den StorlenAmands -Name an, wie es geht.
Nicht mit STM32.
Nein. Wenn Ihr Vorstand ein integriertes E-E-E-E-E-E-E-E-E-Eanz bietet, ist es ratsam, dies zu verwenden, da EEPROM eine längere Lebensdauer, die Anzahl der Schreibzyklen usw. hat).
In Ermangelung eines integrierten Effekts oder seiner Größe ist zu klein für Ihren Anwendungsfall. Sie können diese Bibliothek verwenden, um einen kleinen Portions-Flash-Speicher als emuliertes E-Effekt zu verwenden, sofern Sie die Grenzen wie in begrenzter Anzahl von Schreibungen beachten,
Wenn Sie Kompilierungsfehler erhalten, müssen Sie möglicherweise eine neuere Version des Kerns für Arduino -Boards installieren.
Manchmal funktioniert die Bibliothek nur, wenn Sie den Board Core auf die neueste Version aktualisieren, da ich neu hinzugefügte Funktionen verwende.
Senden Sie Probleme an: FlashStorage_Stm32 Probleme
multiple-definitions für Linkerfehler.allman -Stil hinzu. Die Bibliothek neu styleVielen Dank für alle für die Meldung von Fehler, neue Funktionen, die vorgeschlagen, testen und zur Entwicklung dieser Bibliothek beitragen.
![]() Cristian Maglie |
Wenn Sie zu diesem Projekt beitragen möchten:
Copyright (C) 2021-Khoi Hoang