ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
754160
manul78 (05.05.2017 13:31 - 06.05.2017 14:41, просмотров: 5481)
При переходе на новую версию компилятора avr-gcc ( c древней 4.3.5 на 4.7.0 ) наткнулся на заморочки с размещением массивов и указателей в PROGMEM. Раньше было так: //Function table void (*sys_func[])(uint8_t* p_arg[],uint8_t num_args) PROGMEM = { print_help, print_args, handle_led }; //Command line alias table uint8_t funcname1[] PROGMEM = {"help"}; uint8_t funcname2[] PROGMEM = {"listarg"}; uint8_t funcname3[] PROGMEM = {"led"}; uint8_t *sys_func_names[] PROGMEM = { funcname1, funcname2, funcname3 }; Всё работало. Сейчас так: //Function table void (*sys_func[])(uint8_t* p_arg[], uint8_t num_args) PROGMEM = { print_help, print_args, handle_led }; //Command line alias table const uint8_t funcname1[] PROGMEM = {"help"}; const uint8_t funcname2[] PROGMEM = {"listarg"}; const uint8_t funcname3[] PROGMEM = {"led"}; const uint8_t * const sys_func_names[] PROGMEM = { funcname1, funcname2, funcname3 }; Пишет ошибки: Error variable 'sys_func' must be const in order to be put into read-only section by means of '__attribute__((progmem))' Error conflicting types for 'sys_func_names' Помимо этого, везде где используется PROGMEM я поставил const, ошибки исчезли но появилась куча Warning-ов, ну да х.. с ними. UPD: Это простейший интерпретатор. Командная оболочка AVR Я её решил использовать в качестве монитора, исключительно из-за легковесности. Около 1 кб. Под старую студию 4.19 и старый тулчайн всё работало и я не заморачивался. Вот перешёл на "семёрку" и новый тулчайн - пошли заморочки. В принципе, автор "оболочки" пишет, что такая реализация интерпретатора использует оригинальную фичу компилятора, эдакий "трюк", сродни полезному "багу". Вот думаю в новой версии он исправлен и эта конструкция уже не работает ?