Программирование AVR: решение проблем, FAQ warning: uninitialized variable 'ERROR' put into program memory area Fri, March 29 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

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__

 

 

Добавить комментарий


Защитный код
Обновить

Top of Page