Multiple Definitionsリンカーエラーを修正する方法Multiple Definitionsを修正する方法をご覧くださいリンカーエラー
Cristian MaglieのFlashstorageに触発されたFlashStorage_Stm32ライブラリは、STM32F/L/H/G/WB/MP1の不揮発性フラッシュメモリからユーザーのデータを保存および取得する便利な方法を提供します。
一般的にファームウェアコードの保存に使用されるフラッシュメモリは、EEPROMよりも多くのユーザーのデータを保存 /取得し、より速く保存 /取得するためにも使用できます。バッファリングされたデータライティングと読み取りのおかげで、フラッシュアクセス時間が大幅に短縮され、フラッシュの寿命が増加します。
現在、ライブラリは新しいSTM32 Core V2.0.0+と以前のSTM32 Core V1.9.0-の両方をサポートしています。
Arduino IDE 1.8.19+ arduinoの場合。Arduino Core for STM32 v2.3.0+ for STM32ボード。 最良かつ最も簡単な方法はArduino Library Manager使用することです。 FlashStorage_Stm32を検索し、最新バージョンを選択 /インストールします。このリンクをより詳細な指示に使用することもできます。
インストールする別の方法は次のとおりです。
FlashStorage_STM32-main.zipをダウンロードします。FlashStorage_STM32-mainディレクトリに抽出しますFlashStorage_STM32-mainフォルダー全体を~/Arduino/libraries/などのArduinoライブラリのディレクトリにコピーします。LAN8720を使用して、 STM32F407VEなどのGeneric STM32F4 seriesボードの場合、Breaking Core v2.3.0としてSTM32 Core v2.2.0を使用して、コンパイルエラーを作成します。
一部のSTM32ボードでLAN8720を使用します
ファイルSTM32F4XX_HAL_CONF_DEFAULT.HおよびSTM32F7XX_HAL_CONF_DEFAULT.HをSTM32 STM32ディレクトリ(〜/.Arduino15/パッケージ/STM32/ハードウェア/STM32/2.2.0/システム)にコピーする必要があります。
STM32 STM32コアバージョンが2.2.0であると仮定します。これらのファイルは、ディレクトリにコピーする必要があります。
~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F4xx/stm32f4xx_hal_conf_default.h for STM32F4。~/.arduino15/packages/STM32/hardware/stm32/2.2.0/system/STM32F7xx/stm32f7xx_hal_conf_default.h for Nucleo-144 STM32F7。新しいバージョンがインストールされているときはいつでも、このファイルを新しいバージョンディレクトリにコピーすることを忘れないでください。たとえば、新しいバージョンはx.yy.zzです。これらのファイルは、対応するディレクトリにコピーする必要があります。
~/.arduino15/packages/STM32/hardware/stm32/x.yy.zz/system/STM32F4xx/stm32f4xx_hal_conf_default.hSerial1定義なしの一部のSTM32ボードでSerial1を使用するには、Nucleo-144 Nucleo_F767zi、Nucleo-64 Nucleo_L053R8など)ボードを使用するには、STM32 variant.hをSTM32 STM32ディレクトリ(〜/.Arduino15/STM32/STM32/STM32/STM32/STM32/STM32/STM32/STM32)にコピーする必要があります。ボードに対応するファイルを変更する必要があります。これは単なる方法です。
STM32 STM32コアバージョンが2.3.0であると仮定します。これらのファイルは、ディレクトリにコピーする必要があります。
~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_F767ZI/variant.h nucleo-144 nucleo_f767zi~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_L053R8/variant.h for Nucleo-64 Nucleo_l053r8新しいバージョンがインストールされているときはいつでも、このファイルを新しいバージョンディレクトリにコピーすることを忘れないでください。たとえば、新しいバージョンはx.yy.zzです。これらのファイルは、対応するディレクトリにコピーする必要があります。
~/.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リンカーエラーを修正する方法標準xyz.cppの代わりにxyz-Impl.hを使用した現在のライブラリの実装は、特定のユースケースで特定Multiple Definitionsリンカーエラーを作成する可能性があります。
この.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多くのファイルで。ただし、 Multiple Definitionsリンカーエラーを回避するために、次の.hファイルを他のファイルに含めてはいけないわずか1 .h 、 .cppまたは.inoファイルで必ず使用してください。
// 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 HOWTO Demoについては、新しいMultileProjectの例を確認してください。
src_cppまたはsrc_h lib#80を使用して、さまざまな動作の議論をご覧ください
フラッシュメモリの書き込みサイクルは限られています。典型的なフラッシュメモリは、同じフラッシュブロックにサイクルを書き込み、「摩耗」し始め、データを保持する能力を失い始めます。
したがって、このライブラリの不適切な使用は、マイクロのフラッシュメモリを迅速かつ永久に破壊する可能性があります。特に、 put() put() commit() commit()頻繁に呼び出すことを避ける必要があります。
FlashStorage_STM32.hを含めて、内部フラッシュメモリでEEPROMエミュレーションを取得します。
例については、emulateeepromスケッチを参照してください。
APIは、よく知られているArduino Eeprom.h 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の現在の値を返します。bi_ethernet_blynk
bi_ethernet_blynk_email
bi_ethernet_wm_config
lan8720_ethernet_blynk
lan8720_ethernet_blynk_email
LAN8720_ETHERNET_WM_CONFIG
......
そして、さらに多くの図書館がやってくる。
FlashStorage_stm32/examples/storenameandsurname/storenameandsurname.ino
BB0DD71の15〜106行
STM32ethernetライブラリを使用してLAN8720 Ethernetを使用したSTM32F4 BLACK_F407VEを使用して、STM32F4 BLACK_F407VEでサンプルEthernet_Stm32_LAN8720を実行するときのサンプル端子出力が次のとおりです。
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 HSTM32H7 NUCLEO-144 NUCLEO_H743ZI2でStorenameandsurnameの例を実行するときのサンプル端子出力は次のとおりです。
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 now以下は、STM32L5 Nucleo-144 Nucleo_L552Ze_QでStorenameandsurnameの例を実行するときのサンプル端子出力です。
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 nowSTM32F7 NUCLEO-144 NUCLEO_F767ZIでStorenameandsurnameの例を実行するときのサンプル端子出力は次のとおりです。
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はい、より多くのフィールドでstructを宣言し、 EEPROM.put()を呼び出して構造全体を保存できます。それを行う方法については、storenameandsurnameを参照してください。
STM32ではありません。
いいえ。ボードが統合されたエプロムを提供する場合、EEPROMの寿命、書き込みサイクルの数などが長いため、それを使用することをお勧めします。
統合されたエリートまたはそのサイズがユースケースには小さすぎる場合、このライブラリを使用して、限られた数の書き込みのような制限に留意してください。
コンピレーションエラーが発生した場合、多くの場合、Arduinoボード用のCoreの新しいバージョンをインストールする必要がある場合があります。
私は新しく追加された機能を使用しているため、ボードコアを最新バージョンに更新する場合にのみライブラリが機能する場合があります。
問題を提出してください:FlashStorage_Stm32の問題
multiple-definitionsリンカーエラーを修正します。allmanスタイルを使用してアスチルを追加します。図書館を停止しますこのライブラリの開発を提案、テスト、貢献しているバグの報告、新機能、皆さんに感謝します。
![]() クリスティアン・マグリー |
このプロジェクトに貢献したい場合:
Copyright(c)2021- Khoi Hoang