2012-10-09 5 views
4

나는 상당히 큰 Arduino 프로젝트 (Eclipse에서)를 사용하여 디버깅 메시지를 Serial.print ("some string text") 명령을 사용하여 계속 디버깅 할 수있다.Arduino : SRAM을 점유하는 Serial.print ("일부 문자열 텍스트") 명령이 있습니까?

내가 알아 채는 한 가지는 내가 프로젝트에서 가질 수있는 수의 한계에 도달한다는 것입니다. 내가 너무 많은 것을 넣으면, 프로그램은 아주 이상한 곳에서 멈춘다. 예 : 인쇄 명령을 새로 추가하기 전에 종종 오래 실행됩니다.

내 프로젝트 .hex 파일은 현재 약 20k입니다. Arduino Uno는 약 30kb를 올바르게 제한합니까? 너무 커서는 안됩니다.

그래서 실제 문제가 아마도 이러한 일련의 명령이 내 벼락치기를 가득 채우고 있다고 생각합니다. 어느 것이 2kb입니다. 나는 많은 라이브러리를 사용하고있다.

SRAM을 점유하는 Serial.print ("some string text") 명령이 있습니까? 확실히 gcc는이 문자열을 프로그램 공간에 넣습니다. 하지만 어쩌면 그들은 아닌가요?

아니면 다른가요? 나는 어딘가에 serial.print 버퍼가 있다는 대체 이론을 가지고 있으며 아마도 너무 많은 메시지를 채울 것이다.

+1

+1. 방금 AVR에 대해 동일한 문제가있었습니다. 그러나 플래시에서 읽기가 RAM보다 느리기 때문에 RAM에서 가장 필요한 문자열을 유지할 수있는 균형점을 찾을 수도 있습니다. – glglgl

+0

감사합니다. 알고있는 것도 좋습니다. 왜 SRAM에서 기본적으로 빠져 나가지 않는지 설명합니다. – SpiRail

+0

이것이 유일한 이유는 아닙니다. RAM 접근은 훨씬 쉽습니다. Flash에 자주 액세스하려면 추가 작업이 필요합니다. – glglgl

답변

11

그래, 문자열은 기본적으로 RAM에 저장됩니다. 그들은 플래시 메모리에도 있지만 Arduino가 부팅 할 때 RAM에로드됩니다. 당신이 1.0 이상 아두 이노 IDE 버전을 사용하는 경우

그러나 F() 매크로 RAM로로드 귀찮게 직접 플래시에서가 아니라 문자열을 읽을 수있는 컴파일러를 알 수 있습니다 :

Serial.Println(F("This string is read from Flash!")); 

이 저장됩니다 RAM은 플래시보다 RAM이 적기 때문에 좋은 점입니다. 자세한 내용은 여기를 참조하십시오. * http://www.arduino.cc/playground/Main/Printf

+0

우수. 나는 가능한 한 빨리 이것을 시도 할 것이다. 내가 원시 arduino ide가 아닌 eclipse를 사용하고 있는데, arduino.h를 추가한다는 사실이이 함수를 사용하기에 충분할 것이라고 생각한다. – SpiRail

+0

@SpiRail : 잘 모르겠다 ... – Marty

+1

관련 질문이 있습니다. 디버그 인쇄 기능을 "#define debug (M) Serial.print ("Debug : "); Serial로 정의했다고 가정 해 봅시다. println ((M)) "- 문자열"Debug : "의 각 인스턴스가 더 많은 메모리를 사용합니까? 대신이 문자열을 전역 변수로 설정해야합니까? – vitiral

0

예 기본적으로 RAM에 저장됩니다. @Marty의 솔루션을 사용할 수 있습니다.

또는 MemoryFree 라이브러리를 사용하여 메모리를 추적 할 수도 있습니다.

3

이것은 내 코드가 아니지만 다음 해결책을 찾았습니다. http://www.utopiamechanicus.com/article/low-memory-serial-print/ 은 디버깅에 매우 좋습니다. 인쇄물, 플래시 메모리 사용량 및 매크로의 적절한 결합으로 변환은 종종 '.'을 제거하는 것처럼 쉽습니다. Serial.print().

나는 C++과 arduino의 멍청한 놈이다. 누군가가 유용하다고 여기기를 바랍니다.

관련 문제