Arduino Reset 되는 현상 및 Data 깨지는 현상 수정

2013. 12. 27. 13:422018년 이전 관심사/Arduino

반응형


Arduino Reset 되는 현상 및 Data가 깨지는 현상 수정 


Arduino Uno 기반의 WizFi250 Library를 작업 중, Arduino Board가 이유 없이 Reboot 되거나 Serial에 출력되는 메시지가 깨지는 현상을 경험 하였다.

위 문제는 SRAM이 부족한 Uno Board에 다수의 로그 메시지를 출력하려다 보니 SRAM의 메모리가 오버플로우 되어 발생한 것으로 확인 되었으며, SRAM 메모리를 오버해서 사용하려다 보니  모듈이 비정상 메시지를 출력하거나 Reboot 되는 것 같다.


아래 표를 보면 Uno Board는 SRAM을 2KB 밖에 사용하지 못하며, 반면 Flash Memory는 부트로더용 0.5KB를 뺀 31.5KB를 사용 할 수 있다.


Microcontroller 

ATmega328 

Operating Voltage 

5V 

Input Voltage(recommended) 

7-12V 

Input Voltage(limits) 

6-20V 

Digital I/O Pin 

14(of which 6 provide PWM output) 

Analog Input Pins 

DC Current per I/O pin 

40mA 

DC Current for 3.3V Pin 

50mA 

Flash Memory 

32KB(ATmega328) of which 0.5KB used by bootloader 

SRAM

2KB(ATmega328) 

EEPROM

1KB(ATmega328) 

Clock Speed

16MHz 


위 문제를 해결하기 위해 구글을 검색한 결과, SRAM에 저장되어야 하는 로그 메시지들을 비교적 여유가 있는 Flash Memory에 저장 하고 사용하는 방법을 알게 되었으며, 아래와 같이 cpp 파일에 PROGMEM 매크로를 사용하면 된다.

( 이는 Arduino Board 이외에 다른 AVR사의 MCU에서도 사용 가능 하다. )


#include <avr/pgmspace.h>


prog_char DBG_Start_Msg[]          PROGMEM = "DBG>>>>";

prog_char DBG_SPI_SEND[]          PROGMEM = "SPI Send";

prog_char DBG_SPI_RECV[]         PROGMEM = "SPI Recv";

prog_char DBG_ERROR_DATA_SIZE_TOO_BIG[]         PROGMEM = "Error : send-data-size if too big";

prog_char DBG_ERROR_RX_BUFF_OVERFLOW[]          PROGMEM = "Error : m_spi_rx_buffer overflow";

prog_char DBG_ERROR_NOT_FOUND_SUCCESS_STRING[]     PROGMEM = "Error : Timeout or Not Found Success";

prog_char DBG_NEED_SPI_NULL[]         PROGMEM = "Need SPI_NUL";



반응형