Multiple Definitions Erro do vinculador Por favor, dê uma olhada no como corrigir Multiple Definitions erro de vinculador
A biblioteca FlashStorage_STM32, inspirada no FlashStorage de Cristian Maglie, fornece uma maneira conveniente de armazenar e recuperar os dados do usuário usando a E-eeprom emulada, a partir da memória flash não volátil do STM32F/L/H/G/WB/MP1.
A memória flash, geralmente usada para armazenar o código do firmware, também pode ser usada para armazenar / recuperar mais dados do usuário e mais rápido que a EEPROM. Graças à redação e leitura de dados em buffer , o tempo de acesso flash é bastante reduzido para aumentar a vida útil do flash .
Atualmente, a biblioteca suporta o novo STM32 CORE v2.0.0+ e o STM32 CORE V1.9.0- anterior
Arduino IDE 1.8.19+ para Arduino.Arduino Core for STM32 v2.3.0+ para placas STM32. A melhor e mais fácil maneira é usar Arduino Library Manager . Pesquise FlashStorage_STM32 e selecione / instale a versão mais recente. Você também pode usar este link para obter instruções mais detalhadas.
Outra maneira de instalar é:
FlashStorage_STM32-main.zip .FlashStorage_STM32-main diretórioFlashStorage_STM32-main para o diretório das bibliotecas Arduino, como ~/Arduino/libraries/ . Para placas Generic STM32F4 series , como STM32F407VE , usando LAN8720 , use o STM32 CORE v2.2.0 como Breaking Core v2.3.0 cria o erro de compilação.
Para usar o LAN8720 em algumas placas STM32
Você deve copiar os arquivos STM32F4XX_HAL_CONF_DEFAULT.H e STM32F7XX_HAL_CONF_DEFAULT.H no diretório STM32 STM32 (~/.ararino15/packages/stm32/hardware/stm32/2.2.0/sistema) para sobrecarregar os filmes.
Supondo que a versão Core STM32 STM32 seja 2.2.0. Esses arquivos devem ser copiados no diretório:
~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F4xx/stm32f4xx_hal_conf_default.h PARA STM32F4.~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F7xx/stm32f7xx_hal_conf_default.h para nucleo-144 stm32f7.Sempre que uma nova versão estiver instalada, lembre -se de copiar esse arquivo no novo diretório de versão. Por exemplo, uma nova versão é x.yy.zz, esses arquivos devem ser copiados no diretório correspondente:
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/system/STM32F4xx/stm32f4xx_hal_conf_default.hPara usar o Serial1 em algumas placas STM32 sem definição serial1 (nucleo-144 nucleo_f767zi, núcleo-64 núcleo_l053r8, etc.) placas , você deve copiar o diretório STM32/STM32/STM32 (~/.UDUINO15/Packages/Packações STM32 STM32 (~/.. Você precisa modificar os arquivos correspondentes às suas placas, isso é apenas uma ilustração de como fazer.
Supondo que a versão Core STM32 STM32 seja 2.3.0. Esses arquivos devem ser copiados no diretório:
~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_F767ZI/variant.h PARA NUCLEO-144 NUCLEO_F767ZI.~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_L053R8/variant.h PARA NUCLEO-64 NUCLEO_L053R8.Sempre que uma nova versão estiver instalada, lembre -se de copiar esse arquivo no novo diretório de versão. Por exemplo, uma nova versão é x.yy.zz, esses arquivos devem ser copiados no diretório correspondente:
~/.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 Erro do vinculador A implementação atual da biblioteca, usando xyz-Impl.h em vez de padrão xyz.cpp , possivelmente cria certos erros de linker Multiple Definitions em certos casos de uso.
Você pode incluir este arquivo .hpp
// Can be included as many times as necessary, without `Multiple Definitions` Linker Error
# include " FlashStorage_STM32.hpp " // https://github.com/khoih-prog/FlashStorage_STM32 em muitos arquivos. Mas não deixe de usar o seguinte arquivo .h em apenas 1 .h , .cpp ou .ino arquivo , que não deve ser incluído em nenhum outro arquivo , para evitar o erro Multiple Definitions do vinculador
// 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 Verifique o novo exemplo do MultifileProject para uma demonstração HOWTO .
Dê uma olhada na discussão em comportamentos diferentes usando o src_cpp ou src_h lib #80
A memória flash tem uma quantidade limitada de ciclos de gravação. As memórias flash típicas podem executar cerca de 10000 gravações de ciclos para o mesmo bloco de flash antes de começar a "desgastar" e começar a perder a capacidade de reter dados.
Assim , cuidado: o uso inadequado desta biblioteca pode destruir de maneira rápida e permanentemente a memória flash do seu micro , em particular você deve evitar chamar o put() ou commit() funções com muita frequência e garantir que, em toda a vida do micro, o número de chamadas para put() ou commit() permaneça bem abaixo do limite acima de 10000 (é um grande número de regra para manter o número de um grande número de regra para manter o número de imagens, ou seja, o número é o número de um grande número.
Inclua FlashStorage_STM32.h para obter uma emulação de EEPROM com a memória flash interna.
Veja o esboço EmulareeProm para um exemplo.
A API é muito semelhante à bem conhecida API Arduino EEPROM.H, mas com 4 funções adicionais:
bool isValid() retorna true se os dados na eeprom emulada forem válidos (os dados gravados para flash pelo menos uma vez por EEPROM.commit() ou EEPROM.put() ). Caso contrário, os dados emulados-eeprom são "indefinidos" e a função retorna false .void commit() Armazene os dados da EEPROM no Flash. Use isso com cuidado: cada chamada grava os dados completos da EEPROM emulada para piscar. Isso reduzirá os restantes ciclos flash-write. Não chame esse método em um loop ou você matará seu flash em breve.void setCommitASAP(bool value = true) para definir ou limpar a variável privada _commitASAP (o padrão é true para ser seguro). Se _Commitasap for falso, a chamada para EEPROM.put() não forçará o EEPROM.commit() a prolongar a vida útil do flash. Você precisará se lembrar de ligar para EEPROM.commit() para salvar manualmente os dados emulados-eeprom em flash ou dados serão perdidos.bool getCommitASAP() para retornar o valor atual de _commitASAP .Bi_ethernet_blynk
BI_ETHERNET_BLYNK_EMAIL
Bi_ethernet_wm_config
LAN8720_ETHERNET_BLYNK
LAN8720_ETHERNET_BLYNK_EMAIL
LAN8720_ETHERNET_WM_CONFIG
......
E muito mais para as bibliotecas vêm.
FlashStorage_STM32/Exemplos/storenameandsurname/storenameandsurname.ino
Linhas 15 a 106 em BB0DD71
A seguir, é apresentada a saída do terminal de amostra ao executar o exemplo Ethernet_STM32_LAN8720 no STM32F4 BLACK_F407VE com LAN8720 Ethernet usando a biblioteca STM32Ethernet.
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 HA seguir, é apresentado a saída do terminal de amostra ao executar o exemplo de storenameandsurn no 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 nowA seguir, é apresentado a saída do terminal de amostra ao executar o exemplo de storenameandsurn no 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 nowA seguir, é apresentada a saída do terminal de amostra ao executar o exemplo de storenameandsurn no 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 Sim, você pode declarar uma struct com mais campos e chamar um EEPROM.put() para armazenar toda a estrutura. Veja o StorenameandSurname para como fazê -lo.
Não com STM32.
Não. Se a sua placa fornecer uma e-mail integrada, é aconselhável usar isso porque a EEPROM tem uma vida útil mais longa, número de ciclos de gravação etc.).
Na ausência de uma prome integrada ou seu tamanho é muito pequeno para o seu caso de uso, você pode usar esta biblioteca para usar uma pequena porção de memória flash como emulada-eeprom, desde que você tenha em mente os limites, como no número limitado de gravações
Se você receber erros de compilação, na maioria das vezes, pode ser necessário instalar uma versão mais recente do núcleo para as placas Arduino.
Às vezes, a biblioteca só funcionará se você atualizar o núcleo da placa para a versão mais recente, porque estou usando funções recém -adicionadas.
Envie questões para: FlashStorage_STM32 Issues
multiple-definitions .allman . Restyle a bibliotecaMuito obrigado a todos pela reportagem de bugs, novos recursos sugerindo, testando e contribuindo para o desenvolvimento desta biblioteca.
![]() Cristian Maglie |
Se você deseja contribuir com este projeto:
Copyright (C) 2021- Khoi Hoang