Эта заметка посвящена устранению непонятных предупреждений компилятора avr-gcc, когда используются константы, расположенные в памяти программ (flash):
имя_модуля.c:584: warning: uninitialized variable 'имя_переменной' put into program memory area"
имя_модуля.c:583: warning: '__progmem__' attribute ignored
Предупреждение возникает на некоторых версиях gcc/g++, когда используется макрос PROGMEM, определяемый заголовочным файлом avr/pgmspace.h. Пример кода, который генерирует предупреждение на строковые константы ERROR и CRLF:
#include < avr/pgmspace.h>
PROGMEM const char ERROR [] = " - err";
PROGMEM const char CRLF [] = "\r\n";
Этот баг можно устранить с помощью переопределения PROGMEM следующим образом:
#include < avr/pgmspace.h>
#ifdef PROGMEM
#undef PROGMEM
#endif
#define PROGMEM __attribute__((section (".progmem.data")))
Директива #include, подключающая заголовочный файл pgmspace.h, должна встречаться в проекте только один раз, и за ней сразу должен идти код переопределения макроса PROGMEM. Это лучше всего сделать с помощь отдельного заголовочного файла, который должен подключаться вместо заголовочного файла pgmspace.h. Пример такого файла types.h:
#ifndef __TYPES__
#define __TYPES__
#include < stdbool.h>
#include < avr\pgmspace.h>
#ifdef PROGMEM
#undef PROGMEM
#endif
#define PROGMEM __attribute__((section (".progmem.data")))
#define u8 unsigned char
#define u16 unsigned int
#define u32 uint32_t
#define false 0
#define true 1
// Тут могут быть добавлены другие
// определения #define и typedef:
...
#endif //__TYPES__
|