Arduino Sketch 버전을 1.5.x로 변경시 발생하는 컴파일 에러를 해결하는 방법
아두이노 라이브러리를 작업하면서, Arduino Sketch 버전을 1.5.x로 변경하면 아래와 같은 컴파일 에러가 발생하는 경우가 있다.
error: variable ‘debugreceivingdatatable’ must be const in order to be put into read-only section by means of ‘attribute((progmem))’
error: variable ‘notistring_table’ must be const in order to be put into read-only section by means of ‘__attribute((progmem))’
error: variable ‘at_cmd_table’ must be const in order to be put into read-only section by means of ‘__attribute((progmem))’
위와 같은 문제가 발생하였을 때의 제 코드는 아래와 같습니다.
const char at_command_wset[] PROGMEM = "AT+WSET=0,%s";
const char at_command_wsec[] PROGMEM = "AT+WSEC=0,%s,%s";
const char at_command_wnet[] PROGMEM = "AT+WNET=1";
const char at_command_wjoin[] PROGMEM = "AT+WJOIN";
const char at_command_wstat[] PROGMEM = "AT+WSTAT";
const char at_command_scon_tcp_client[] PROGMEM = "AT+SCON=O,TCN,%s,%d,,%d";
const char at_command_scon_tcp_server[] PROGMEM = "AT+SCON=O,TSN,,,%d,%d";
const char at_command_scon_udp[] PROGMEM = "AT+SCON=O,UCN,%s,%d,%d,%d";
const char at_command_fdns[] PROGMEM = "AT+FDNS=%s,%d";
const char at_command_fwebs_down[] PROGMEM = "AT+FWEBS=0";
const char at_command_fwebs_up[] PROGMEM = "AT+FWEBS=1,A";
const char at_command_smgmt[] PROGMEM = "AT+SMGMT=%c";
const char at_command_ssend[] PROGMEM = "AT+SSEND=%c,%s,%d,%d";
const char at_command_ssend_data[] PROGMEM = "";
const char at_command_wleave[] PROGMEM = "AT+WLEAVE";
PROGMEM const char *at_cmd_table[] =
{
at_command_wset,
at_command_wsec,
at_command_wnet,
at_command_wjoin,
at_command_wstat,
at_command_scon_tcp_client,
at_command_scon_tcp_server,
at_command_scon_udp,
at_command_fdns,
at_command_fwebs_down,
at_command_fwebs_up,
at_command_smgmt,
at_command_ssend,
at_command_ssend_data,
at_command_wleave
};
strcpy_P((char *)tmpstr, (char*)pgm_read_word(&(at_cmd_table[AT_WNET])));
제일 좋은 것은 호환성을 위해 PROGMEM 키워드를 사용하지 않는 것이 제일 좋겠으나, Arduino Board 중 RAM Size가 현저히 작은 것들이 있기 때문에 사용 할 수 밖에 없었습니다. 이로 인해 아래와 같은 컴파일 에러가 발생 하였고 이를 해결 하기 위해서는 아래와 같으 수정하면 된다.
PROGMEM const char *at_cmd_table[] =
to
const char * const at_cmd_table[] PROGMEM =