1 #include <avr/io.h> 2 #include <avr/pgmspace.h> 3 4 int main() { 5 prog_uint8_t p=44,t; // ошибка пропущен обязательный модификатор static 6 t=pgm_read_byte_near(&p); // будет прочитан не p 7 } В строке 5 переменные должны располагаться в программной памяти, но всё совсем криво и никаких ошибок или предупреждений не возникает. Компилятор резервирует место в программной памяти, но значения туда не помещает. Значения туда копируются на этапе инициализации переменных, но тк программная память доступна только для чтения, данные в эту область фактически не копируются и там оказываются случайные данные. В строке 6 происходит копирование данных в переменную, которая расположена в программной памяти, а фактически происходит копирование в озу, по тому же адресу, где в это время расположена совсем другая переменная. При этом нет даже предупреждений (хотя бы о мнимом преобразовании типов).
А какие варианты фикса имеются? Я не gcc писатель, если имеются готовые решения, я с радостью приложу патчик к пакету :)
я, честно говоря, даже не в курсе где их искать, вернее не понятно по каким ключевым словам. В первом приближении достаточно в <avr/pgmspace.h> во все типы программной памяти добавить модификатор static. const добавлять не стоит (хотя очень хочется для строчки 6) -- будут проблемы с указателями и ссылками. PS.: На днях сделаю тест для баги с обработкой логических операций в операторе if, надо только вспомнить в каком месте я с ним боролся.
Если правки относятся к avr/pgmspace.h, то багу стоит перенести на avr-libc + проверить с последней сборкой avr-libc!
Не воспроизводится с: avr-gcc-4.5.1-alt2 avr-libc-1.7.0-alt2