Multiple Definitions 링커 오류를 수정하는 방법 Multiple Definitions 링커 오류를 수정하는 방법을 살펴보십시오.
Cristian Maglie 's FlashStorage를 기반으로하고 수정 한 FlashStorage_SAMD 라이브러리는 SAMD21/SAMD51 보드의 비 휘발성 플래시 메모리에서 에뮬레이션-가파른 것을 사용하여 사용자 데이터를 저장하고 검색하는 편리한 방법을 제공합니다.
일반적으로 펌웨어 코드를 저장하는 데 사용되는 플래시 메모리는 더 많은 사용자의 데이터를 저장 / 검색하는 데 사용될 수 있으며 EEPROM보다 빠릅니다. 버퍼링 된 데이터 작성 및 읽기 덕분에 플래시 액세스 시간이 크게 줄어들어 플래시 수명을 높입니다 .
Arduino IDE 1.8.19+ .Arduino SAMD core 1.8.13+ .Adafruit SAMD core 1.7.11+ .Seeeduino SAMD core 1.8.3+ .IndustruinoSAMD core 1.0.3+ .IndustruinoSAML core 1.0.0+ .Sparkfun SAMD core 1.8.4+ (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-IOT 등) 보드에서 오류없이 컴파일하고 자동으로 보드 _name을 감지하고 표시하려면 Arduino Samd Packages_Patches 디렉토리 전체를 Arduino SAMD 디렉토리 (~/.arduino15/arduino/hardware/samd/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.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과의 Arduino 호환성 향상 (Min and 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 파일을 더 이상 복사 할 필요가 없습니다.
Adafruit Samd (Itsy-bitsy M4 등) 보드에서 오류없이 컴파일하고 자동으로 Board_Name을 감지하고 표시하려면 Adafruit Samd Packages_Patches에서 파일을 Adafruit SAMD Directory (~/.arduino15/adafruit/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.cppSeeeduino Samd (Xiao M0, Wio Terminal 등) 보드에서 오류없이 컴파일하고 자동으로 보드 _name을 감지하고 표시하려면 Seeeduino Samd Packages_patches에서 파일을 Seeeduino SAMD 디렉토리 (~/.arduino15/packages/seeeduino/samd/1.8.3)에 복사해야합니다.
Seeeduino 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.cppSparkFun Samd (Xiao SparkFun_Redboard_Turbo, SparkFun_SAMD51_Thing_Plus 등) 보드에서 오류없이 컴파일하고 자동으로 보드 _name을 감지하고 표시하려면 SparkFun Samd Packages_Patches 파일을 SparkFun SAMD Directory (~/. arduino15/sparkfun/smarwun/samd/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 , .cpp 또는 .ino 파일로 다음 .h 파일을 사용하십시오.
// 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을 사용하여 다른 행동에서 토론을 살펴보십시오.
플래시 메모리에는 제한된 양의 쓰기주기가 있습니다. 일반적인 플래시 메모리는 "마모"를 시작하기 전에 약 100000을 동일한 플래시 블록에 기록하고 데이터를 유지하는 능력을 잃기 시작할 수 있습니다.
따라서이 라이브러리의 부적절한 사용은 마이크로의 플래시 메모리를 빠르고 영구적으로 파괴 할 수 있습니다 . 특히 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(); 내부 플래시 메모리와 함께 Eeprom 에뮬레이션을 얻으려면 FlashStorage_SAMD.h 포함하십시오.
예를 들어 EmulateEeprom 스케치를 참조하십시오.
API는 잘 알려진 Arduino Eeprom 라이브러리 API와 매우 유사하지만 4 개의 추가 기능이 있습니다.
bool isValid() Emulated-Eyprom의 데이터가 유효한 경우 true 반환합니다 ( EEPROM.commit() 또는 EEPROM.put() 에 의해 적어도 한 번은 플래시에 기록 된 데이터). 그렇지 않으면 에뮬레이션 된 -eeprom 데이터는 "정의되지 않은"상태이며 함수는 false 반환합니다.void commit() eeprom 데이터를 플래시로 저장합니다. 신중하게 사용하십시오 : 모든 통화는 전체 에뮬레이션 된 가파른 데이터를 플래시하기 위해 작성합니다. 이렇게하면 나머지 플래시-쓰레기 사이클이 줄어 듭니다. 이 방법을 루프로 호출하지 마십시오. 그렇지 않으면 곧 플래시를 죽일 것입니다.void setCommitASAP(bool value = true) _commitASAP 개인 변수를 설정하거나 지우려면 (기본값은 안전 true ). _commitasap이 false 인 경우 EEPROM.put() 에 대한 호출은 EEPROM.commit() 플래시 수명을 연장하도록 강요하지 않습니다. 에뮬레이션 된 -eeprom 데이터를 플래시로 저장하려면 EEPROM.commit() 에게 수동으로 호출해야합니다. 그렇지 않으면 데이터가 손실됩니다.bool getCommitASAP() _commitASAP 의 현재 값을 반환합니다.FlashStorage_samd/examples/storenameandurname/storenameandurname.ino
102E13E의 26 ~ 128 행
다음은 예제를 실행할 때의 샘플 터미널 출력 Adafruit Samd51 ITSYBITSY_M4에서 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이 수명이 길고, 쓰기주기 수 등이 있기 때문에 사용하는 것이 좋습니다).
통합 가프 그롬이 없거나 크기가 너무 작지 않는 경우, 제한된 수의 쓰기로 제한을 명심하면이 라이브러리를 사용하여 작은 부분 플래시 메모리를 에뮬레이션 된 가파른 메모리로 사용할 수 있습니다.
컴파일 오류가 발생하면 종종 아르두노 보드 용 코어 버전을 설치해야 할 수도 있습니다.
때로는 새로 추가 된 기능을 사용하고 있기 때문에 보드 코어를 최신 버전으로 업데이트하는 경우에만 라이브러리가 작동합니다.
다음과 같은 문제를 제출하십시오 : FlashStorage_SAMD 문제
EEPROM.put() 및 EEPROM.get() 함수를 추가하여 Emulated-Eyprom에서 전체 구조물을 읽고 쓰십시오.multiple-definitions 링커 오류를 수정하십시오.SAMD21E1xA , SAMD21G1xA 및 SAMD21J1xA 와 같은 더 많은 보드에 지원 추가![]() 크리스티안 마그리 |
이 프로젝트에 기여하려면 :