2017-01-27 8 views
0

ESP8266 core for Arduino을 사용하는 ESP8266에서 소프트웨어를 개발하는 것이 실제로 이해가 안되는 문제가 발생했습니다. 함수를 호출 할 때 String을 전달하면 기본적으로 프로그램이 중단됩니다.String 매개 변수가 직접 변수 대 변수 인 함수 호출

void SimpleFunc(String str) 
{ 
    ... 
} 

내가 String 매우 긴으로이 함수를 호출하는 두 가지 방법을 시도 : 나는 매개 변수로 String있는 기능을 가지고있다. 첫 번째 방법 새로운 String 변수를 생성하고 그것을 전달하는 것입니다 :

String veryLongString = "veeeerryyyy loooong ........."; //Much longer in reality!!! 
SimpleFunc(veryLongString); 

두 번째 방법String 직접 전달하는 것입니다 : 충돌에서 두 번째 스케치 결과를 실행

SimpleFunc("veeeerryyyy loooong ........."); 

. ... \ esp8266 \ 2.3.0 \ 코어 \ esp8266 \ umm_malloc/umm_malloc.c 라인 :: ~ 문자열()에서 1163

문자열에서

umm_assimilate_up 다음은 스택의 일부이다. ... \ esp8266의 \ 2.3.0 \ 코어 \ esp8266/WString.cpp 라인 720

_umm_free에서 esp8266 2.3.0 ... \ \ 코어 \ \ esp8266 \ umm_malloc/umm_malloc.c 라인 1,287

자유 at ... \ esp8266 \ 2.3.0 \ cores \ esp8266 \ umm_malloc/umm_malloc.c 라인 1733

String :: ~ String() at ... \ esp8266 \ 2.3.0 \ cores \ esp8266/WString.cpp 줄 720

이 방법으로 호출하는 방법의 차이점은 무엇입니까? 왜 첫 번째 접근 방식이 잘 작동하고 두 번째 접근 방식은 그렇지 않은 것입니까? 당신이 참조

void foo(std::string const &str) 

기본 문자의 어떤 사본이 이루어지지 않습니다에 의해 문자열을 호출하는 경우

+2

https://hackingmajenkoblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/ –

답변

3

. 값으로 호출하면

void food(std::string str) 

str이 매우 길어지면 메모리가 부족한 값 비싼 작업이 복사됩니다.