Multiple Definitions يرجى إلقاء نظرة على HOWTO Multiple Definitions
توفر مكتبة FlashStorage_Samd ، استنادًا إلى وتعديلها من Cristian Maglie's FlashStorage ، وسيلة مريحة لتخزين واسترداد بيانات المستخدم باستخدام Amustiated-Eeprom ، من ذاكرة الفلاش غير المتطايرة من لوحات SAMD21/SAMD51.
يمكن أيضًا استخدام ذاكرة الفلاش ، التي تستخدم عمومًا لتخزين رمز البرامج الثابتة ، لتخزين / استرداد بيانات المستخدم وأسرع من EEPROM. بفضل كتابة البيانات والقراءة المخزنة ، يتم تقليل وقت الوصول إلى حد كبير لزيادة عمر الفلاش .
Arduino IDE 1.8.19+ لأردوينو.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+ للوحات Samd21/Samd51 (Xiao M0 ، Wio Terminal ، إلخ).IndustruinoSAMD core 1.0.3+ لمجالس SAMD21 (Industruino DG21 ، إلخ).IndustruinoSAML core 1.0.0+ للوحات SAML21 (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-masterFlashStorage_SAMD-master إلى دليل مكتبات Arduino مثل ~/Arduino/libraries/ .لتكون قادرًا على التجميع دون خطأ واكتشاف وعرض Board_name تلقائيًا على لوحات Arduino Samd (Nano-33-Iot ، إلخ) ، يجب عليك نسخ دليل Arduino Samd Compasse_patches بالكامل في دليل Arduino Samd (~/.Arduino15/حزم/Arduino/Hardware/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 الشهير . انظر تحسين توافق Arduino مع STL (Min و 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)
كلما تم إصلاح مشكلة خطأ المترجم المذكورة أعلاه مع إصدار Arduino Samd الجديد ، لا تحتاج إلى نسخ ملف Arduino.h بعد الآن.
لتكون قادرًا على التجميع دون خطأ واكتشاف وعرض Board_Name تلقائيًا على لوحات ADAFRUIT SAMD (ITSY-BITSY M4 ، وما إلى ذلك) ، يجب عليك نسخ الملفات في ADAFRUIT SAMD Packages_Patches في دليل ADAFRUIT SAMD (~/.ARDUINO15/Packages/ADAFRUIT/ADADWARE/ARMD/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.cppلتكون قادرًا على التجميع دون خطأ واكتشاف وعرض Board_Name تلقائيًا على لوحات SeeDuino Samd (Xiao M0 ، Wio Terminal ، إلخ) ، يجب عليك نسخ الملفات في SeeDuino Samd Packages_Patches في دليل Seeduino Samd (~/.Aruino15/حزم/seeduino/hardware/samd/1.8.3).
لنفترض أن إصدار SeeDuino 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لتكون قادرًا على التجميع دون خطأ وعرضه تلقائيًا وعرضه على لوحات Sparkfun Samd (Xiao Sparkfun_Redboard_turbo ، SparkFun_Samd51_Phing_Plus ، إلخ) ، يجب عليك نسخ ملفات samd samdages_patches in 1.8.
لنفترض أن إصدار 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 في العديد من الملفات. ولكن تأكد من استخدام ملف .h التالي Multiple Definitions .ino 1 .h .cpp
// 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 (إنها قاعدة جيدة للوصول إلى وضع هذا العدد في الاعتبار حتى لو كان المصنع لضمان عدد أكبر من الأدوات.
يجب أن تؤخذ نفس الحذر إذا كنت تستخدم مضاونة API EEPROM (انظر أدناه) مع وظيفة EEPROM.commit() .
بادئ ذي بدء ، يجب عليك إعلان كائن 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
}بعد إعادة ضبط متحكم microcontroller لاسترداد العمر المخزن ، يمكنك استخدام:
int user_age = age_storage.read(); قم بتضمين FlashStorage_SAMD.h للحصول على مضاهاة EEPROM مع ذاكرة الفلاش الداخلية.
انظر SHENEPEEPROM رسم للحصول على مثال.
تشبه واجهة برمجة التطبيقات إلى حد كبير واجهة برمجة تطبيقات Arduino Eeprom Library المعروفة ، ولكن مع 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 .FlashStorage_Samd/أمثلة/storenameAndsurname/StorenameAndsurname.ino
الخطوط 26 إلى 128 في 102e13e
فيما يلي عينة الإخراج الطرفي عند تشغيل مثال W5500_Blynk على ADAFRUIT SAMD51 ITSYBITSY_M4 باستخدام 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 => إعادة التشغيل 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() لتخزين الهيكل بأكمله. رؤية storenamaelsurname لكيفية القيام بذلك.
نعم ، في كل مرة تقوم فيها بتحميل رسم جديد ، يتم مسح المحتوى السابق لـ FlashStorage.
لا. إذا كان مجلس الإدارة الخاص بك يوفر مجموعة متكاملة ، فمن المستحسن استخدام ذلك لأن EEPROM لديها عمر أطول ، وعدد دورات الكتابة ، وما إلى ذلك).
في حالة عدم وجود eeprom متكامل أو حجمه صغير جدًا بالنسبة لحالة الاستخدام الخاصة بك ، يمكنك استخدام هذه المكتبة لاستخدام ذاكرة فلاش صغيرة مثل المحاكاة ، شريطة أن تضع في اعتبارك الحدود كما هو الحال في عدد محدود من الكتابة
إذا حصلت على أخطاء في التجميع ، في أكثر الأحيان ، قد تحتاج إلى تثبيت إصدار أحدث من جوهر لوحات Arduino.
في بعض الأحيان ، ستعمل المكتبة فقط إذا قمت بتحديث Core Board إلى أحدث إصدار لأنني أستخدم الوظائف المضافة حديثًا.
إرسال المشكلات إلى: مشكلات flashstorage_samd
EEPROM.put() و EEPROM.get() لقراءة/كتابة البنية بأكملها في eletisted-peeprommultiple-definitions .SAMD21E1xA و SAMD21G1xA و SAMD21J1xA![]() كريستيان ماجلي |
إذا كنت تريد المساهمة في هذا المشروع: