warning: uninitialized variable 'ERROR' put into program memory area |
![]() |
Добавил(а) microsin |
Эта заметка посвящена устранению непонятных предупреждений компилятора 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__
|