Multiple Definitions鏈接器錯誤請查看如何修復Multiple Definitions鏈接器錯誤
FlashStorage_SAMD庫基於Cristian Maglie的FlashStorage並修改了,從SAMD21/SAMD51板的非揮發性閃存中,使用模擬 - EPROM來存儲和檢索用戶數據的方便方法。
通常用於存儲固件代碼的閃存也可以用來存儲 /檢索用戶的數據更多,並且比EEPROM更快。得益於緩衝的數據編寫和閱讀,閃光訪問時間大大減少以增加閃光燈的壽命。
Arduino IDE 1.8.19+ for Arduino。Arduino SAMD core 1.8.13+ 。Adafruit SAMD core 1.7.11+用於SAMD ARM Cortex-M0+和M4板(Nano 33 IoT等)。Seeeduino SAMD core 1.8.3+ 。IndustruinoSAMD core 1.0.3+ 。IndustruinoSAML core 1.0.0+ 。Sparkfun SAMD core 1.8.4+用於SAMD21/SAMD51板(Sparkfun_redboard_turbo,SparkFun_SAMD51_THIND_PLUS等)。 最好和最簡單的方法是使用Arduino Library Manager 。搜索flashstorage_samd ,然後選擇 /安裝最新版本。
安裝的另一種方法是:
FlashStorage_SAMD-master.zip 。FlashStorage_SAMD-master目錄FlashStorage_SAMD-master文件夾到arduino庫的目錄,例如~/Arduino/libraries/ 。To be able to compile without error and automatically detect and display BOARD_NAME on Arduino SAMD (Nano-33-IoT, etc) boards , you have to copy the whole Arduino SAMD Packages_Patches directory into Arduino SAMD directory (~/.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編譯器錯誤的必要條件。請參閱提高與STL(最小值和最大宏)的Arduino兼容性
...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等)板上自動檢測和顯示board_name ,您必須將Adafruit Samd packages_patches中的文件複製到Adafruit SAMD Directory(〜/.arduino15/packages/packages/adafruit/hardware/hardware/samd/1.7.7.7.7.7.7.7.11)中。
假設Adafruit SAMD Core版本為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.cppTo be able to compile without error and automatically detect and display BOARD_NAME on Seeeduino SAMD (XIAO M0, Wio Terminal, etc) boards , you have to copy the files in Seeeduino SAMD Packages_Patches into Seeeduino samd directory (~/.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_patches複製到sparkfun samparpfun sampfun sampfun samd directory(〜/.ardwarey/packages/packfaiges/packfages/packfaiges/packfun/packfun/packfun/packfun)。
假設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在許多文件中。但是,請確保僅在1 .h , .cpp或.ino文件中使用以下.h文件(不得包含在任何其他文件中),以避免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檢查HOWTO演示的新的多胎示例。
使用src_cpp或src_h lib#80來查看不同行為的討論
閃存的寫週期數量有限。典型的閃光記憶可以在開始“磨損”之前,可以將大約10000個循環寫入同一閃存塊,並開始失去保留數據的能力。
因此,請當心:不當使用該庫可以快速,永久破壞您的微觀的閃存,特別是您應該避免過多地調用write()功能,並確保在微型的整個生命中, write的呼叫數量遠低於上述10000的限制(即使是良好的規則規則,也要確保該數量的數量,即使是Micro保證的製造商,也要確保更大的cyc cyc cyc cyc cyc cyc cyc cyccycec)。
如果您使用EEPROM.commit()函數使用EEPROM API仿真(請參見下文),則必須採取相同的謹慎。
首先,您必須為要存儲在閃存中的每個數據聲明一個全局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仿真。
有關一個示例,請參見EmulateEprom草圖。
API與眾所周知的Arduino Eeprom庫API非常相似,但具有4個功能:
EEPROM.commit()或EEPROM.put() )編寫給flash一次的數據,則bool isValid()將返回true 。否則,模擬 - EPROM數據是“未定義的”,並且該函數返回false 。void commit()將EEPROM數據存儲在Flash中。小心地使用此功能:每個呼叫都將完整的模擬 - EPROM數據寫入閃存。這將減少剩餘的閃光燈循環。不要以循環方式調用此方法,否則您會盡快殺死閃光燈。void setCommitASAP(bool value = true)設置或清除_commitASAP private變量(默認是true )。如果_commitasap為false,則呼叫EEPROM.put()不會迫使EEPROM.commit()延長閃存壽命。您必須記住要手動調用EEPROM.commit()以將模擬 - EPROM數據保存到閃存中,否則將丟失數據。bool getCommitASAP()返回_commitASAP的當前值。flashstorage_samd/示例/storenameandsurname/storenameandsurname.ino
102E13E中的第26至128行
以下是在Adafruit SAMD51上運行示例W5500_blynk時的樣本終端輸出,使用W5500以太網屏蔽
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()以存儲整個結構。請參閱Storenameandsurname有關如何做的。
是的,每次您上傳新草圖時,閃光燈的先前內容都會刪除。
否。如果您的董事會提供了一個集成的EPROM,則建議使用它,因為EEPROM的壽命更長,寫週期數等)。
在沒有集成的EPROM或其大小太小的情況下,對於您的用例來說,您可以使用此庫將較小的閃存作為模擬EPROM,前提
如果您遇到彙編錯誤,則通常需要安裝Arduino Board的核心版本的較新版本。
有時,只有在您使用新添加的功能時,只有將板核更新為最新版本時,庫才能正常工作。
將問題提交給:flashstorage_samd問題
EEPROM.put()和EEPROM.get()函數以讀取/寫入仿真 - eprommultiple-definitions鏈接器錯誤。SAMD21E1xA , SAMD21G1xA和SAMD21J1xA![]() 克里斯蒂安·瑪格麗(Cristian Maglie) |
如果您想為這個項目做出貢獻: