Multiple Definitions kesalahan linker Harap lihat HowTo Fix Multiple Definitions kesalahan tautan
Perpustakaan FlashStorage_SAMD, berdasarkan dan dimodifikasi dari Cristian Maglie's FlashStorage, menyediakan cara yang nyaman untuk menyimpan dan mengambil data pengguna menggunakan EEEPROM yang ditiru, dari memori flash non-volatile papan SAMD21/SAMD51.
Memori flash, umumnya digunakan untuk menyimpan kode firmware, juga dapat digunakan untuk menyimpan / mengambil lebih banyak data pengguna dan lebih cepat dari EEPROM. Berkat penulisan dan membaca data buffered , waktu akses flash sangat dikurangi untuk meningkatkan kehidupan flash .
Arduino IDE 1.8.19+ untuk Arduino.Arduino SAMD core 1.8.13+ untuk papan SAMD ARM CORTEX-M0+.Adafruit SAMD core 1.7.11+ untuk papan SAMD ARM CORTEX-M0+ dan M4 (Nano 33 IoT, dll.).Seeeduino SAMD core 1.8.3+ untuk papan SAMD21/SAMD51 (Xiao M0, terminal WIO, dll.).IndustruinoSAMD core 1.0.3+ untuk dewan SAMD21 (Industruino DG21, dll.).IndustruinoSAML core 1.0.0+ untuk dewan SAML21 (Industruino 420maker, dll.).Sparkfun SAMD core 1.8.4+ untuk papan SAMD21/SAMD51 (sparkfun_redboard_turbo, sparkfun_samd51_thing_plus, dll.). Cara terbaik dan termudah adalah dengan menggunakan Arduino Library Manager . Cari FlashStorage_SAMD , lalu pilih / instal versi terbaru.
Cara lain untuk menginstal adalah dengan:
FlashStorage_SAMD-master.zip .FlashStorage_SAMD-masterFlashStorage_SAMD-master ke direktori perpustakaan Arduino seperti ~/Arduino/libraries/ .Untuk dapat mengkompilasi tanpa kesalahan dan secara otomatis mendeteksi dan menampilkan papan board_name di papan Arduino SAMD (Nano-33-IOT, dll) , Anda harus menyalin seluruh direktori Arduino Samd Packages_Patches ke dalam direktori Arduino SAMD (~/.arduino15/paket/arduino/hardware/samd/1.8.8.8.8).
Misalkan versi Arduino SAMD adalah 1.8.13. Sekarang hanya satu file yang harus disalin ke direktori:
~/.arduino15/packages/arduino/hardware/samd/1.8.13/platform.txtSetiap kali versi baru diinstal, ingatlah untuk menyalin file ini ke direktori versi baru. Misalnya, versi baru adalah x.yy.zz
File ini harus disalin ke direktori:
~/.arduino15/packages/arduino/hardware/samd/x.yy.zz/platform.txtSeandainya versi Arduino SAMD adalah 1.8.9. File -file ini harus disalin ke direktori:
~/.arduino15/packages/arduino/hardware/samd/1.8.9/platform.txt~/.arduino15/packages/arduino/hardware/samd/1.8.9/cores/arduino/Arduino.hSetiap kali versi baru diinstal, ingatlah untuk menyalin file -file ini ke direktori versi baru. Misalnya, versi baru adalah x.yy.z
File -file ini harus disalin ke direktori:
~/.arduino15/packages/arduino/hardware/samd/x.yy.z/platform.txt~/.arduino15/packages/arduino/hardware/samd/x.yy.z/cores/arduino/Arduino.hIni wajib untuk memperbaiki kesalahan kompiler Arduino Samd yang terkenal kejam . Lihat Tingkatkan Kompatibilitas Arduino dengan STL (Min dan 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)
Setiap kali masalah kesalahan kompiler yang disebutkan di atas ditetapkan dengan rilis Arduino SAMD baru, Anda tidak perlu menyalin file Arduino.h lagi.
Untuk dapat mengkompilasi tanpa kesalahan dan secara otomatis mendeteksi dan menampilkan papan board_name di ADAFRUIT SAMD (ITSY-BITSY M4, dll) papan , Anda harus menyalin file di ADAFRUIT SAMD Packages_Patches ke Direktori Samd Adafruit (~/.arduino15/paket/Adafruit/Hardware/Samd/1.7.7.7).
Seandainya versi inti SAMD Adafruit adalah 1.7.11. File ini harus disalin ke direktori:
~/.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.cppSetiap kali versi baru diinstal, ingatlah untuk menyalin file ini ke direktori versi baru. Misalnya, versi baru adalah x.yy.zz file ini harus disalin ke direktori:
~/.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.cppUntuk dapat mengkompilasi tanpa kesalahan dan secara otomatis mendeteksi dan menampilkan papan board_name pada papan seeduino samd (Xiao M0, terminal wio, dll) , Anda harus menyalin file di samd package_patches ke direktori samd seeeduino (~/.arduino15/paket/package/sawwarino/samd/samd/samd/.
Misalkan versi inti Samd Seeeduino adalah 1.8.3. File ini harus disalin ke direktori:
~/.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.cppSetiap kali versi baru diinstal, ingatlah untuk menyalin file ini ke direktori versi baru. Misalnya, versi baru adalah x.yy.zz file ini harus disalin ke direktori:
~/.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.cppUntuk dapat mengkompilasi tanpa kesalahan dan secara otomatis mendeteksi dan menampilkan papan board_name pada sparkfun samd (xiao sparkfun_board_turbo, sparkfun_samd51_thing_plus, dll) papan , Anda harus menyalin file samd packfun/pangkuan/samdware/samdware/. ~/.Duino.
Seandainya Versi Inti SAMD Sparkfun adalah 1.8.3. File ini harus disalin ke direktori:
~/.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.cppSetiap kali versi baru diinstal, ingatlah untuk menyalin file ini ke direktori versi baru. Misalnya, versi baru adalah x.yy.zz file ini harus disalin ke direktori:
~/.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 kesalahan linker Implementasi pustaka saat ini, menggunakan xyz-Impl.h alih-alih standar xyz.cpp , mungkin membuat kesalahan penghubung Multiple Definitions tertentu dalam kasus penggunaan tertentu.
Anda dapat memasukkan file .hpp ini
// Can be included as many times as necessary, without `Multiple Definitions` Linker Error
# include " FlashStorage_SAMD.hpp " // https://github.com/khoih-prog/FlashStorage_SAMD di banyak file. Tetapi pastikan untuk menggunakan file .h berikut hanya dalam 1 .h , .cpp atau file .ino , yang tidak boleh dimasukkan dalam file lain , untuk menghindari kesalahan tautan 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 Periksa contoh multifileproject baru untuk demo HOWTO .
Lihat diskusi dalam perilaku yang berbeda menggunakan SRC_CPP atau SRC_H LIB #80
Memori flash memiliki siklus tulis dalam jumlah terbatas. Kenangan flash yang khas dapat melakukan sekitar 10.000 menulis siklus ke blok flash yang sama sebelum mulai "aus" dan mulai kehilangan kemampuan untuk menyimpan data.
Jadi berhati-hatilah: penggunaan perpustakaan ini yang tidak tepat dapat dengan cepat dan permanen menghancurkan memori flash mikro Anda , khususnya Anda harus menghindari untuk memanggil fungsi write() terlalu sering dan memastikan bahwa dalam seluruh umur mikro jumlah panggilan untuk write tetap jauh di bawah batas 10.000 (ini adalah aturan yang baik untuk mengingat nomor itu bahkan jika produsen penjamin micro) nomor micro yang lebih baik) untuk mengingat nomor itu bahkan jika produsen penjamin micro) nomor micro yang lebih baik).
Perhatian yang sama harus diambil jika Anda menggunakan emulasi API EEPROM (lihat di bawah) dengan fungsi EEPROM.commit() .
Pertama -tama, Anda harus mendeklarasikan objek FlashStorage global untuk setiap data yang ingin Anda simpan di memori flash.
Misalnya jika Anda ingin menyimpan usia seseorang, Anda harus mendeklarasikan age_storage seperti ini:
FlashStorage (age_storage, int ); Instruksi ini berarti "Buat FlashStorage untuk menyimpan variabel int dan menyebutnya age_storage ". Sekarang Anda dapat menggunakan age_storage sebagai tempat untuk menyimpan integer dengan aman:
void readAndStoreUserAge ()
{
Serial. println ( " Please enter your age: " );
String age = Serial. readStringUntil ( ' n ' );
age_storage. write (age. toInt ()); // <-- save the age
}Setelah reset mikrokontroler untuk mengambil usia yang disimpan yang dapat Anda gunakan:
int user_age = age_storage.read(); Sertakan FlashStorage_SAMD.h untuk mendapatkan emulasi EEPROM dengan memori flash internal.
Lihat sketsa emulateEeprom untuk contoh.
API sangat mirip dengan API perpustakaan Arduino Eeprom yang terkenal, tetapi dengan 4 fungsi tambahan:
bool isValid() mengembalikan true jika data dalam emulated-eeprom valid (data yang ditulis untuk berkedip setidaknya sekali oleh EEPROM.commit() atau EEPROM.put() ). Jika tidak, data yang ditiru-eeprom "tidak ditentukan" dan fungsi mengembalikan false .void commit() Simpan data EEPROM di Flash. Gunakan ini dengan hati-hati: Setiap panggilan menulis data Imulated-Eeprom lengkap untuk berkedip. Ini akan mengurangi sisa siklus flash-write. Jangan sebut metode ini dalam satu loop atau Anda akan segera membunuh flash Anda.void setCommitASAP(bool value = true) untuk mengatur atau menghapus variabel pribadi _commitASAP (default adalah true untuk aman). Jika _CommitaSap salah, panggilan ke EEPROM.put() tidak akan memaksa EEPROM.commit() untuk memperpanjang masa pakai flash. Anda harus ingat untuk menghubungi EEPROM.commit() secara manual untuk menyimpan data yang ditiru-eeprom ke dalam flash atau data akan hilang.bool getCommitASAP() untuk mengembalikan nilai _commitASAP saat ini.FlashStorage_samd/Contoh/StoreneMeAndSurname/StoreneMeAndSurname.ino
Baris 26 hingga 128 dalam 102e13e
Berikut ini adalah output terminal sampel saat menjalankan contoh w5500_blynk pada Adafruit samd51 itsybitsy_m4 menggunakan 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 => Reboot 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!
=============== Ya, Anda dapat mendeklarasikan struct dengan lebih banyak bidang dan memanggil EEPROM.put() untuk menyimpan seluruh struktur. Lihat Nama StorenAeMeAndSURN untuk cara melakukannya.
Ya, setiap kali Anda mengunggah sketsa baru, konten FlashStorage sebelumnya dihapus.
Tidak. Jika dewan Anda menyediakan eeprom terintegrasi, disarankan untuk menggunakannya karena EEPROM memiliki masa hidup yang lebih lama, jumlah siklus tulis, dll.).
Dengan tidak adanya eeprom terintegrasi atau ukurannya terlalu kecil untuk kasus penggunaan Anda, Anda dapat menggunakan perpustakaan ini untuk menggunakan memori flash porsi kecil sebagai yang ditiru-eeprom, asalkan Anda mengingat batas-batasnya seperti dalam jumlah tertulis yang terbatas dalam jumlah terbatas yang terbatas
Jika Anda mendapatkan kesalahan kompilasi, lebih sering daripada tidak, Anda mungkin perlu menginstal versi inti yang lebih baru untuk papan Arduino.
Terkadang, perpustakaan hanya akan berfungsi jika Anda memperbarui inti papan ke versi terbaru karena saya menggunakan fungsi yang baru ditambahkan.
Kirim masalah ke: masalah flashstorage_samd
EEPROM.put() dan EEPROM.get() berfungsi untuk membaca/menulis seluruh struct dalam emulated-eeprommultiple-definitions .SAMD21E1xA , SAMD21G1xA dan SAMD21J1xA![]() Cristian Maglie |
Jika Anda ingin berkontribusi pada proyek ini: