При переходе на новую версию компилятора 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 и старый тулчайн всё работало и я не заморачивался. Вот перешёл на "семёрку" и новый тулчайн - пошли заморочки. В принципе, автор "оболочки" пишет, что такая реализация интерпретатора использует оригинальную фичу компилятора, эдакий "трюк", сродни полезному "багу". Вот думаю в новой версии он исправлен и эта конструкция уже не работает ?