본문 바로가기

IT 개발/Arduino

Arduino Sketch 버전을 1.5.x로 변경시 발생하는 컴파일 에러를 해결하는 방법


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_WSET
        at_command_wsec,                    // AT_WSEC
        at_command_wnet,                    // AT_WNET
        at_command_wjoin,                    // AT_WJOIN
        at_command_wstat,                    // AT_WSTAT
        at_command_scon_tcp_client,        // AT_SCON_TCP_CLIENT
        at_command_scon_tcp_server,        // AT_SCON_TCP_SERVER
        at_command_scon_udp,                // AT_SCON_UDP
        at_command_fdns,                    // AT_FDNS
        at_command_fwebs_down,            // AT_FWEBS_DOWN
        at_command_fwebs_up,                // AT_FWEBS_UP
        at_command_smgmt,                // AT_SMGMT
        at_command_ssend,                    // AT_SSEND
        at_command_ssend_data,            // AT_SSEND_DATA
        at_command_wleave                // AT_WLEAVE
};

// Read Point
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 =