Проблема с использованием __attribute__((__progmem__))
для переменной заключается в том, что всякий раз, когда вы хотите прочитать данные из такой переменной, вы не можете просто обращаться к ней обычным способом, как если бы вы обращались к переменной из ОЗУ. Вместо этого вы должны использовать специальные функции, предоставляемые заголовком avr/pgmspace.h
в avr-lib c, например pgm_read_byte
.
Это довольно раздражает, но у вас нет сделать это таким образом, потому что они добавили именованные адресные пространства , такие как __flash
, в последние версии G CC (при условии, что вы используете C, а не C ++). Я рекомендую вам прекратить использование __attribute__((__progmem__))
и использовать вместо него __flash
, если ваша версия G CC поддерживает это. Если компилятор выдает ошибку или предупреждение, потому что ожидает, что элементы, хранящиеся в fla sh, будут помечены как const
, вы можете просто добавить const
в объявление / определение (в правильной позиции). Если у вас возникли проблемы с этим, пожалуйста, напишите новый вопрос или отредактируйте этот вопрос так, чтобы он содержал MCVE .
. Для приведенного вами примера кода вы должны попробовать написать:
void debugoutf(const __flash char * header, const __flash char * msg);