Multiple Definitionsリンカーエラーを修正する方法Multiple Definitionsを修正する方法をご覧くださいリンカーエラー
Cristian MaglieのFlashstorageに基づいて変更されたFlashStorage_Samdライブラリは、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+ 。IndustruinoSAMD core 1.0.3+ (Industruino DG21など)。IndustruinoSAML core 1.0.0+ (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-masterディレクトリに抽出しますFlashStorage_SAMD-masterフォルダー〜 ~/Arduino/libraries/などのArduinoライブラリのディレクトリへ。エラーなしでコンパイルし、Arduino Samd(Nano-33-oiTなど)ボードでboard_nameを自動的に検出して表示できるようにするには、Arduino samd packages_patche_patchesディレクトリをArduino samdディレクトリ(〜/.arduino15/packages/arduino/hardware/hardd/1.8.13)にコピーする必要があります。
Arduino Samdバージョンが1.8.13であると仮定します。これで、1つのファイルのみをディレクトリにコピーする必要があります。
~/.arduino15/packages/arduino/hardware/samd/1.8.13/platform.txt新しいバージョンがインストールされているときはいつでも、このファイルを新しいバージョンディレクトリにコピーすることを忘れないでください。たとえば、新しいバージョンはx.yy.zzです
このファイルは、ディレクトリにコピーする必要があります。
~/.arduino15/packages/arduino/hardware/samd/x.yy.zz/platform.txtArduino 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(MINおよびMAX MACRO)との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_patchをAdafruit Samdディレクトリ(〜/.Arduino15/Packages/Adafruit/Hardware/Samd/1.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.cppSeeduino Samd(Xiao M0、Wioターミナルなど)ボードでエラーなしでコンパイルし、seeduino samd(xiao m0、wioターミナルなど)でboard_nameを自動的に検出して表示できるようにするには、Seeduino samd packages_patcheをseeduino samdディレクトリ(〜/.arduino15/packages/seeduino/hardware/samd/1.8.3)にコピーする必要があります。
Seeduino Samdコアバージョンが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エラーなしでコンパイルし、Sparkfun samd(xiao sparkfun_redboard_turbo、sparkfun_samd51_thing_thing_plusなど)でbeard_nameを自動的に検出して表示できるようにするには、Sparkfun samd packages_patchesをSparkfun samdディレクトリ(〜/.arduino15/packages/hardwun/hardwun/1.8.3)にコピーする必要があります。
SparkFun Samdコアバージョンが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.cppの代わりにxyz-Impl.hを使用した現在のライブラリの実装は、特定のユースケースで特定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ファイルを他のファイルに含めてはいけないわずか1 .h 、 .cppまたは.inoファイルで必ず使用してください。
// 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 Demoについては、新しいMultileProjectの例を確認してください。
src_cppまたはsrc_h lib#80を使用して、さまざまな動作の議論をご覧ください
フラッシュメモリの書き込みサイクルは限られています。典型的なフラッシュメモリは、同じフラッシュブロックにサイクルを書き込み、「摩耗」し始め、データを保持する能力を失い始めます。
したがって、このライブラリの不適切な使用は、マイクロのフラッシュメモリを迅速かつ永久に破壊する可能性があります。特に、 write()関数を頻繁に呼び出すことを避け、マイクロの寿命全体で、 write制限を10000の上限以下に留まることを確認する必要があります(マイクロのメーカーが大規模なサイクルを保証する場合でも、その数を念頭に置くのは良い概要です)。
EEPROM.commit()関数を使用してEEPROM APIエミュレーション(以下を参照)を使用している場合、同じ注意を払う必要があります。
まず、フラッシュメモリに保存する各データのグローバルFlashStorageジオブジェクトを宣言する必要があります。
たとえば、人の年齢を保存したい場合は、次のようなage_storageを宣言する必要があります。
FlashStorage (age_storage, int );この命令は、「 int変数を保存してage_storageと呼ぶためのFlashStorageを作成する」を意味します。これで、 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エミュレーションを取得します。
例については、emulateeepromスケッチを参照してください。
APIは、よく知られているArduino Eeprom Library APIに非常に似ていますが、4つの追加機能があります。
bool isValid()エミュレートエプロムのデータが有効な場合にtrueを返します( EEPROM.commit()またはEEPROM.put()によって少なくとも1回は点滅するように書かれたデータ)。それ以外の場合は、エミュレートされたEepromデータは「未定義」であり、関数はfalseを返します。void commit() eepromデータをフラッシュに保存します。これを慎重に使用してください。すべてのコールで、完全なエミュレートエプロムデータを書き込み、フラッシュします。これにより、残りのフラッシュワイトサイクルが減少します。この方法をループで呼び出さないでください。そうしないと、すぐにフラッシュを殺します。void setCommitASAP(bool value = true) _commitASAPプライベート変数を設定またはクリアする(デフォルトは安全であることはtrue )。 _commitasapがfalseの場合、 EEPROM.put()への呼び出しはEEPROM.commit()フラッシュ寿命を延長するように強制しません。 EEPROM.commit()を手動で呼び出すことを忘れないでください。エミュレートされたEepromデータをフラッシュに保存するか、データが失われます。bool getCommitASAP() _commitASAPの現在の値を返します。flashstorage_samd/examples/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を参照してください。
はい、新しいスケッチをアップロードするたびに、FlashStorageの以前のコンテンツが消去されます。
いいえ。ボードが統合されたエプロムを提供する場合、EEPROMの寿命、書き込みサイクルの数などが長いため、それを使用することをお勧めします。
統合されたエリートまたはそのサイズがユースケースには小さすぎる場合、このライブラリを使用して、限られた数の書き込みのような制限に留意してください。
コンピレーションエラーが発生した場合、多くの場合、Arduinoボード用のCoreの新しいバージョンをインストールする必要がある場合があります。
私は新しく追加された機能を使用しているため、ボードコアを最新バージョンに更新する場合にのみライブラリが機能する場合があります。
問題を提出してください:FlashStorage_Samdの問題
EEPROM.put()およびEEPROM.get()関数を追加して、エミュレートエプロムの構造全体を読み取り/書き込みますmultiple-definitionsリンカーエラーを修正します。SAMD21E1xA 、 SAMD21G1xA 、 SAMD21J1xAなど、より多くのボードにサポートを追加します![]() クリスティアン・マグリー |
このプロジェクトに貢献したい場合: