2013. 12. 27. 13:42ㆍ2018년 이전 관심사/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 |
6 |
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";
'2018년 이전 관심사 > Arduino' 카테고리의 다른 글
[Arduino]Eclipse에서 Serial Monitor 사용하기 (0) | 2014.02.16 |
---|---|
[Arduino]Eclipse 환경에서 258 Compile Error 시 해결 방법 (0) | 2014.01.17 |
[Arduino+WizFiShield] WizFiShield 초기 세팅 및 예제 구동 (0) | 2013.10.11 |
[Arduino] 이클립스(Eclipse) 환경에서 아두이노(Arduino) 개발 하기 (7) | 2013.10.09 |
Arduino Inventor's KIT 구매 (0) | 2013.10.06 |