Multiple Definitions Пожалуйста, посмотрите на то, чтобы исправить ошибку линкеров Multiple Definitions
Библиотека FlashStorage_SAMD, основанная и модифицированная из FlashStorage Cristian Maglie, обеспечивает удобный способ хранения и извлечения данных пользователя с использованием эмулированного IEPROM, из нелетучивой флэш-памяти плат SAMD21/SAMD51.
Флэш -память, обычно используемая для хранения кода прошивки, также может использоваться для хранения / извлечения большего количества данных пользователя и быстрее, чем из EEPROM. Благодаря написанию и чтению буферизации , время доступа к вспышке значительно сокращается, чтобы увеличить срок службы вспышки .
Arduino IDE 1.8.19+ для Arduino.Arduino SAMD core 1.8.13+ для плат Samd Arm Cortex-M0+.Adafruit SAMD core 1.7.11+ для плат Samd Arm Cortex-M0+ и M4 (Nano 33 IOT и т. Д.).Seeeduino SAMD core 1.8.3+ для плат SAMD21/SAMD51 (XIAO M0, WIO TERMINAL и т. Д.).IndustruinoSAMD core 1.0.3+ для досок SAMD21 (Industruino DG21 и т. Д.).IndustruinoSAML core 1.0.0+ для советов SAML21 (Industruino 420Maker и т. Д.).Sparkfun SAMD core 1.8.4+ для плат SAMD21/SAMD51 (sparkfun_redboard_turbo, sparkfun_samd51_thing_plus и т. Д.). Лучший и самый простой способ - использовать Arduino Library Manager . Поиск flashstorage_samd , затем выберите / установите последнюю версию.
Другой способ установить - это:
FlashStorage_SAMD-master.zip .FlashStorage_SAMD-masterFlashStorage_SAMD-master Папка в каталог библиотек Arduino, такой как ~/Arduino/libraries/ .Чтобы иметь возможность компилировать без ошибок и автоматически обнаружить и отображать плату oard_name на платах Arduino Samd (Nano-33-IOT и т. Д.) , Вы должны скопировать весь каталог Arduino Samd Packages_Patches в каталог Arduino SAMD (~/.arduino15/packages/arduino/hardware/samd/1.8.13).
Предположим, что версия Arduino Samd составляет 1.8.13. Теперь только один файл должен быть скопирован в каталог:
~/.arduino15/packages/arduino/hardware/samd/1.8.13/platform.txtВсякий раз, когда установлена новая версия, не забудьте скопировать эти файлы в новый каталог версий. Например, новая версия - x.yy.zz
Этот файл должен быть скопирован в каталог:
~/.arduino15/packages/arduino/hardware/samd/x.yy.zz/platform.txtПредположим, что версия Arduino Samd составляет 1.8.9. Эти файлы должны быть скопированы в каталог:
~/.arduino15/packages/arduino/hardware/samd/1.8.9/platform.txt~/.arduino15/packages/arduino/hardware/samd/1.8.9/cores/arduino/Arduino.hВсякий раз, когда установлена новая версия, не забудьте скопировать эти файлы в новый каталог версий. Например, новая версия - x.yy.z
Эти файлы должны быть скопированы в каталог:
~/.arduino15/packages/arduino/hardware/samd/x.yy.z/platform.txt~/.arduino15/packages/arduino/hardware/samd/x.yy.z/cores/arduino/Arduino.hЭто обязательно исправить печально известную ошибку компилятора Arduino Samd . См. Улучшение совместимости Arduino с STL (Min и 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)
Всякий раз, когда вышеупомянутая проблема ошибки компилятора исправляется с новым релизом Arduino Samd, вам больше не нужно копировать файл Arduino.h .
Чтобы иметь возможность компилировать без ошибки и автоматически обнаружить и отображать платы Adafruit Samd (Itsy-bitsy M4 и т. Д.) , Вы должны скопировать файлы в Adafruit Samd Packages_patches в каталог Adafruit SAMD (~/.arduino15/packages/adafruit/hardware/samd/1.7.11).
Предположим, что основная версия Adafruit Samd составляет 1.7.11. Этот файл должен быть скопирован в каталог:
~/.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.cppВсякий раз, когда установлена новая версия, не забудьте скопировать этот файл в новый каталог версий. Например, новая версия x.yy.zz Этот файл должен быть скопирован в каталог:
~/.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.cppЧтобы иметь возможность компилировать без ошибок и автоматически обнаружить и отображать платы oard_name на платах Seeeduino Samd (Xiao M0, WIO и т. Д.) , Вы должны скопировать файлы в Seeeduino Samd Packages_patches в СИДЕВЕДУНЕЙНАЙСКОЙ САМД -САМД (~/.arduino15/Packages/Seeeduino/Hardware/SAMD/1.8.3).
Предположим, что Seeeduino Samd Core версия составляет 1.8.3. Этот файл должен быть скопирован в каталог:
~/.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.cppВсякий раз, когда установлена новая версия, не забудьте скопировать этот файл в новый каталог версий. Например, новая версия x.yy.zz Этот файл должен быть скопирован в каталог:
~/.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.cppЧтобы иметь возможность компилировать без ошибки и автоматически обнаружить и отображать Board_name на Sparkfun Samd (xiao sparkfun_redboard_turbo, sparkfun_samd51_thing_plus и т. Д.) , Вы должны скопировать файл Sparkfun Samd Packages_patches в Sparkfun SAMD Directory (~/.Arduino15/packages/hardware/1.8.8.
Предположим, что версия Sparkfun Samd Core составляет 1.8.3. Этот файл должен быть скопирован в каталог:
~/.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.cppВсякий раз, когда установлена новая версия, не забудьте скопировать этот файл в новый каталог версий. Например, новая версия x.yy.zz Этот файл должен быть скопирован в каталог:
~/.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 Текущая реализация библиотеки с использованием xyz-Impl.h вместо стандартной xyz.cpp , возможно, создает определенные ошибки линкера Multiple Definitions в определенных вариантах использования.
Вы можете включить этот файл .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 во многих файлах. Multiple Definitions обязательно используйте следующий файл .h только .h .ino .cpp
// 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 Проверьте новый пример многофилепроекта для демонстрации HOWTO .
Посмотрите на обсуждение в различном поведении, используя SRC_CPP или SRC_H LIB #80
Флэш -память имеет ограниченное количество циклов записи. Типичные воспоминания о вспышке могут выполнить около 10000 записей циклов в тот же флеш -блок, прежде чем начать «износить» и начать терять способность сохранять данные.
Так что будьте осторожны: ненадлежащее использование этой библиотеки может быстро и навсегда уничтожить флэш-память о вашем микроавтобусе , в частности, вам следует избегать того, чтобы вызовать функцию write() слишком часто и убедиться, что во всей жизни микросхемы, количество вызовов для write оставаясь намного ниже вышеуказанного предела 10000 (это хорошее правило правила, чтобы сохранить это число, даже если производитель micro гарантирует число циклов).
Та же самая осторожность должна быть принята, если вы используете эмуляцию API EEPROM (см. Ниже) функцию EEPROM.commit() .
Прежде всего, вы должны объявить глобальный объект FlashStorage для каждой данные, которые вы собираетесь сохранить в флэш -памяти.
Например, если вы хотите сохранить возраст человека, вы должны объявить такую age_storage , как это:
FlashStorage (age_storage, int ); Эта инструкция означает «Создать FlashStorage для хранения переменной int и назвать ее age_storage ». Теперь вы можете использовать age_storage в качестве места, чтобы безопасно хранить целое число:
void readAndStoreUserAge ()
{
Serial. println ( " Please enter your age: " );
String age = Serial. readStringUntil ( ' n ' );
age_storage. write (age. toInt ()); // <-- save the age
}После сброса микроконтроллера для получения хранимого возраста, который вы можете использовать:
int user_age = age_storage.read(); Включите FlashStorage_SAMD.h , чтобы получить эмуляцию EEPROM с внутренней флэш -памятью.
Смотрите эмулят -эскиз для примера.
API очень похож на известный API библиотеки Arduino Eeprom, но с 4 дополнительными функциями:
bool isValid() возвращает true если данные в эмулированном и-эпоме действительны (данные, записанные для вспышки, по крайней мере, один раз EEPROM.commit() или EEPROM.put() ). В противном случае данные эмулированного-эврома «не определены», а функция возвращает false .void commit() сохранить данные eEPROM во флэш -памяти. Используйте это с осторожностью: каждый вызов записывает полные данные об эмулированном эпохе для вспышки. Это уменьшит оставшиеся флеш-записи. Не называйте этот метод в цикле, иначе вы скоро убьете свою вспышку.void setCommitASAP(bool value = true) для установки или очистки частной переменной _commitASAP (по умолчанию true , чтобы быть безопасным). Если _commitasap является ложным, вызов EEPROM.put() не заставит EEPROM.commit() продлить срок службы вспышки. Вам придется помнить, что вы можете позвонить EEPROM.commit() вручную, чтобы сохранить данные эмулированного иэпром во флэш-память, или данные будут потеряны.bool getCommitASAP() для возврата текущего значения _commitASAP .Flashstorage_SAMD/Примеры/StorenamEandRsurname/StorenameandRsurname.ino
Строки с 26 до 128 в 102E13E
Ниже приведен выводный вывод терминала при запуске примера w5500_blynk на adafruit samd51 itsybitsy_m4 с использованием w5500 ethernet щит
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 => Перезагрузку 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!
=============== Да, вы можете объявить struct с большим количеством полей и вызвать EEPROM.put() для хранения всей структуры. Посмотрите на StorenameandRsurname, как это сделать.
Да, каждый раз, когда вы загружаете новый эскиз, предыдущий контент FlashStorage стирается.
Нет. Если ваша доска предоставляет интегрированный-эпох, желательно использовать это, потому что EEPROM имеет более длительное время жизни, количество циклов записи и т. Д.).
В отсутствие интегрированного эпоха или его размера слишком мал для вашего варианта использования, вы можете использовать эту библиотеку для использования небольшой порционной флэш-памяти в качестве эмулированного-эв.
Если вы получаете ошибки компиляции, чаще всего вам может потребоваться установить более новую версию Core для Arduino Poards.
Иногда библиотека будет работать только в том случае, если вы обновляете ядро платы до последней версии, потому что я использую недавно добавленные функции.
Отправить проблемы: flashstorage_samd.
EEPROM.put() и EEPROM.get() функционирует для чтения/записи всей структуры в эмулированном эпохеmultiple-definitions линкера.SAMD21E1xA , SAMD21G1xA и SAMD21J1xA![]() Кристиан Магли |
Если вы хотите внести свой вклад в этот проект: