Multiple Definitions يرجى إلقاء نظرة على HOWTO Multiple Definitions
توفر مكتبة FlashStorage_Stm32 ، المستوحاة من Cristian Maglie's FlashStorage ، وسيلة مريحة لتخزين واسترداد بيانات المستخدم باستخدام الأوبومر المحاكاة ، من ذاكرة الفلاش غير المتطايرة لـ STM32F/L/H/G/WB/MP1.
يمكن أيضًا استخدام ذاكرة الفلاش ، التي تستخدم عمومًا لتخزين رمز البرامج الثابتة ، لتخزين / استرداد بيانات المستخدم وأسرع من EEPROM. بفضل كتابة البيانات والقراءة المخزنة ، يتم تقليل وقت الوصول إلى حد كبير لزيادة عمر الفلاش .
حاليًا ، تدعم المكتبة كلاً من STM32 Core V2.0.0+ السابقة STM32 Core V1.9.0-
Arduino IDE 1.8.19+ لأردوينو.Arduino Core for STM32 v2.3.0+ لألواح STM32. أفضل وأسهل طريقة هي استخدام Arduino Library Manager . ابحث عن FlashStorage_Stm32 ، ثم حدد / تثبيت أحدث إصدار. يمكنك أيضًا استخدام هذا الرابط لمزيد من التعليمات التفصيلية.
طريقة أخرى للتثبيت هي:
FlashStorage_STM32-main.zip .FlashStorage_STM32-mainFlashStorage_STM32-main بالكامل إلى دليل مكتبات Arduino مثل ~/Arduino/libraries/ . للوحات Generic STM32F4 series ، مثل STM32F407VE ، باستخدام LAN8720 ، يرجى استخدام STM32 CORE v2.2.0 لأن Breaking Core v2.3.0 يخلق خطأ الترجمة.
لاستخدام LAN8720 على بعض لوحات STM32
يجب عليك نسخ الملفات STM32F4XX_HAL_CONF_DEFAULT.H و STM32F7XX_HAL_CONF_DEFAULT.H في دليل STM32 STM32 (~/.Arduino15/Packages/STM32/HARETWARE/STM32/2.2.0/SYSTEM) لإفراط في كتابة الملفات القديمة.
لنفترض أن الإصدار الأساسي 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.hلاستخدام Serial1 على بعض لوحات STM32 بدون تعريف Serial1 (Nucleo-144 Nucleo_f767zi ، Nucleo-64 Nucleo_L053R8 ، إلخ) ، يجب عليك نسخ ملفات STM32/STM32/STM32/STM32. يجب عليك تعديل الملفات المقابلة لألواحك ، وهذا مجرد توضيح كيفية القيام به.
لنفترض أن الإصدار الأساسي STM32 STM32 هو 2.3.0. يجب نسخ هذه الملفات في الدليل:
~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_F767ZI/variant.h for nucleo-144 nucleo_f767zi.~/.arduino15/packages/STM32/hardware/stm32/2.3.0/variants/NUCLEO_L053R8/variant.h للنووية-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-Impl.h بدلاً من xyz.cpp القياسي ، ربما ينشئ خطأ في ارتباط بعض 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 في العديد من الملفات. ولكن تأكد من استخدام ملف .h التالي Multiple Definitions .ino 1 .h .cpp
// 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 .
ألق نظرة على المناقشة في سلوك مختلف باستخدام SRC_CPP أو SRC_H LIB #80
تحتوي ذاكرة الفلاش على كمية محدودة من دورات الكتابة. يمكن أن تؤدي ذكريات الفلاش النموذجية حوالي 10000 دورات تكتب إلى نفس كتلة الفلاش قبل البدء في "التآكل" والبدء في فقدان القدرة على الاحتفاظ بالبيانات.
لذا ، احذر من ذلك: يمكن للاستخدام غير السليم لهذه المكتبة تدمير ذاكرة الفلاش الخاصة بك بسرعة وبشكل دائم ، على وجه الخصوص ، يجب عليك تجنب استدعاء put() أو commit() في كثير من الأحيان وتأكد من أن عدد المكالمات الدقيقة في الحياة الكاملة للمنظمة put() أو commit() تبقى أقل بكثير من الحد الأقصى المذكور من 10000 (إنها قاعدة جيدة للبلاغ.
قم بتضمين FlashStorage_STM32.h للحصول على مضاهاة EEPROM مع ذاكرة الفلاش الداخلية.
انظر SHENEPEEPROM رسم للحصول على مثال.
تشبه واجهة برمجة التطبيقات إلى حد كبير API Arduino Eeprom.H المعروفة ولكن مع 4 وظائف إضافية:
bool isValid() true إذا كانت البيانات الموجودة في eperrom محاكاة صالحة (البيانات المكتوبة إلى Flash مرة واحدة على الأقل بواسطة 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 .bi_ethernet_blynk
bi_ethernet_blynk_email
bi_ethernet_wm_config
lan8720_ethernet_blynk
lan8720_ethernet_blynk_email
lan8720_ethernet_wm_config
......
والكثير آخر للمكتبات تأتي.
FlashStorage_Stm32/أمثلة/storenameAndsurname/StorenameAndsurname.ino
الخطوط 15 إلى 106 في BB0DD71
فيما يلي عينة الإخراج الطرفي عند تشغيل مثال ethernet_stm32_lan8720 على STM32F4 Black_F407VE مع Ethernet LAN8720 باستخدام مكتبة STM32THERNET.
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 Hما يلي هو الناتج الطرفي العينة عند تشغيل مثال على storenameAndSurns على STM32H7 Nucleo-144 Nucleo_h743zi2
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فيما يلي عينة الناتج الطرفي عند تشغيل مثال على storenameAndSurns على STM32L5 Nucleo-144 Nucleo_l552ze_q
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 nowما يلي هو الناتج الطرفي العينة عند تشغيل مثال على storenameAndsurn on STM32F7 Nucleo-144 Nucleo_f767zi
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() لتخزين الهيكل بأكمله. رؤية storenamaelsurname لكيفية القيام بذلك.
ليس مع STM32.
لا. إذا كان مجلس الإدارة الخاص بك يوفر مجموعة متكاملة ، فمن المستحسن استخدام ذلك لأن EEPROM لديها عمر أطول ، وعدد دورات الكتابة ، وما إلى ذلك).
في حالة عدم وجود eeprom متكامل أو حجمه صغير جدًا بالنسبة لحالة الاستخدام الخاصة بك ، يمكنك استخدام هذه المكتبة لاستخدام ذاكرة فلاش صغيرة مثل المحاكاة ، شريطة أن تضع في اعتبارك الحدود كما هو الحال في عدد محدود من الكتابة
إذا حصلت على أخطاء في التجميع ، في أكثر الأحيان ، قد تحتاج إلى تثبيت إصدار أحدث من جوهر لوحات Arduino.
في بعض الأحيان ، ستعمل المكتبة فقط إذا قمت بتحديث Core Board إلى أحدث إصدار لأنني أستخدم الوظائف المضافة حديثًا.
إرسال المشكلات إلى: مشكلات flashstorage_stm32
multiple-definitions .allman . أعد تصريح المكتبةشكراً جزيلاً للجميع على الإبلاغ عن الأخطاء ، ميزة جديدة تقترح واختبار ومساهمة في تطوير هذه المكتبة.
![]() كريستيان ماجلي |
إذا كنت تريد المساهمة في هذا المشروع:
حقوق الطبع والنشر (ج) 2021- خوي هوانغ