아두이노 Arduino

[아두이노]메모리가 부족할 때 처리방법(프로그램 저장 공간, 전역 변수, 지역변수)

끄적끄적아무거나 2022. 5. 9. 18:08
반응형

 

목차

     

     

     

     

     

    Arduino 메모리(Memory) 공간이 작을 때

     

    아두이노 스케치에서 코드를 작성하고 컴파일(Compile)을 진행하면 아래와 같은 메세지를 받을 수 있습니다. 

     

    스케치는 프로그램 저장 공간 3242 바이트(10%)를 사용. 최대 32256 바이트.
    전역 변수는 동적 메모리 226바이트(11%)를 사용, 1822바이트의 지역변수가 남음.  최대는 2048 바이트.

     

    앞서 아두이노를 구성하는 메모리(Memory) 공간에 대해 살펴 보았습니다. 메모리에 대해 잘 이해가 안되시면 괄호안의 링크를 참조하시길 바랍니다. (https://scribblinganything.tistory.com/519)

     

    여기서 프로그램 저장 공간은 프로그램 메모리(Program Memroy, Flash Memory)를 의미 합니다. 다음으로 전역 변수(Global variable)과 지역 변수(Local variable)은 데이터 메모리(Data Memory)에 저장됩니다. 

     

    프로그램 메모리의 공간이 데이터 메모리보다 사이즈가 큽니다. 프로그램은 한번 올라가면 Loop로 반복 시행되고 데이터 메모리의 변수 값은 프로그램 상황에 따라 할당(Allocate) 했다가 해제(Release) 하기도 하기 때문입니다.

     

     

     

     

    Arduino 데이터 메모리 부족하여 프로그램 메모리 사용하기

     

    만일 변수(Variable) 사용이 많아 데이터 메모리 공간이 부족할 때 PROGMEM 방식으로 변수를 선언하면 프로그램 메모리 공간에 변수를 선언할 수 있습니다. 

     

    PROGMEM 사용 방법은 아래와 같습니다. (Syntax)

     

    const 데이터종류 변수명[] PROGMEM = {입력값};

    데이터 종류에는 char나 int와 같은 데이터를 지정합니다. 변수명은 입력하고 싶은 변수명을 넣으면 됩니다. 

     

    아래 기본 메모리를 사용할 때와 프로그램 메모리에서 변수를 사용하는 예제를 통해 쉽게 이해해보도록 하겠습니다.

     

     

     

     

    아래 예제는 일반 데이터 메모리 공간을 사용한 예제 입니다.

     

    기본 예제>>

    void setup() {
      Serial.begin(9600);
      while (!Serial) {
        ;
      }
    }
    
    void loop() {
        String c_list = "Hello world world world world world world world world world Hello";
        Serial.println(c_list);
        delay(100);
    }

     

    결과>>

    스케치는 프로그램 저장 공간 2844 바이트(8%)를 사용. 최대 32256 바이트.
    전역 변수는 동적 메모리 264바이트(12%)를 사용, 1784바이트의 지역변수가 남음.  최대는 2048 바이트.

    전역변수는 264바이트를 사용 했습니다.

     

     

     

     

    아래 예제는 PROGMEM을 사용해서 변수를 프로그램 메모리에 사용했을 경우 입니다.

     

    예제 코드>>

    void setup() {
      Serial.begin(9600);
      while (!Serial) {
        ;
      }
    }
    
    const char c_list[] PROGMEM = "Hello world world world world world world world world world Hello";
     
    char character;
    
    void loop() {
        for(int i = 0 ; i < strlen_P(c_list) ; i++){
            character = pgm_read_byte_near(&(c_list[i]));
            Serial.print(character);
        }
        delay(100);
        Serial.print('\n');
    }

     

     

    결과>>

    스케치는 프로그램 저장 공간 1692 바이트(5%)를 사용. 최대 32256 바이트.
    전역 변수는 동적 메모리 184바이트(8%)를 사용, 1864바이트의 지역변수가 남음.  최대는 2048 바이트.

    전역 변수는 184바이트를 사용했습니다. 앞서 264바이트에서 줄어들었음을 알 수 있습니다. 

     

     

     

     

    반응형