2010년 6월 13일 일요일

아뒤노에서 긴 문자열 사용하기 (How to do big strings in Arduino)


아뒤노는 문자 스트링을 매우 쉽게 저장하고 사용할 수 있게 해 주지만 이 문자열들은 변수와 동일하게 램에 저장되기 때문에 많은 양의 문자열을 저장할 수 없다. 그러므로 긴 문자열을 read-only인 프로그램 메모리에 집어넣고 사용하는 법을 설명하겠다.

많은 스케치(아뒤노 프로그램)은 긴 문자열을 가지고 있는 경우가 많다. 간단한 CLI를 만들었거나 작은 웹 페이지를 저장하고 있을수도 있다. 일반적으로 아래와 같은 식으로 문자열을 저장한다.

char hellostr[] =  "<html><head><title>hello world</title></head>
                   <body><p align=center><h1>hello world</h1></p>
                   </body></html>";

// and then sometime later

Serial.println( hellostr );

문제는 hellostr이 다른 변수와 함께 램에 저장된다는 것이다. 아뒤노의 ATmega 칩은 단지 1KB의 램을 가지고 있다. 코드가 더 복잡해져서 긴 문자열과 여러개의 라이브러리를 사용하면 이해할 수 없는 신기한 문제가 생기기 시작할 것이다. 아뒤노는 프로그램이 칩이 가지고 있는것보다 더 많은 램을 사용하기 시작해도 경고를 해 주지 못한다.

이 문제를 해결하기 위해 문자열을 PROGMEM(PROGram MEMory)에 저장할 수 있다. 즉 프로그램 코드를 저장하는 플래쉬 롬을 사용하는 것이다. PROGMEM 문자열을 사용하는건 약간의 편법을 사용해야 하지만 아래의 printProgStr()이라는 함수를 사용하면 별다른 문제 없이 쉽게 사용할 수 있다.

const char hellostr[] PROGMEM = "...";     // notice added 'const' and 'PROGMEM'

// given a PROGMEM string, use Serial.print() to send it out
void printProgStr(const prog_char str[])
{
  char c;
  if(!str) return;
  while((c = pgm_read_byte(str++)))
    Serial.print(c,BYTE);
}

// and then at some point

printProgStr( hellostr );

문자열을 Serial.print() 이외에서 사용하려면 별도 함수를 만들어 거기에 글자별로 처리하는 코드를 넣어주면 된다.




댓글 없음:

댓글 쓰기