avr-gcc没有看到" const" PROGMEM的修饰符

时间:2015-04-23 18:47:10

标签: c gcc avr avr-gcc

我有一个这样的文件:

#include <avr/io.h>
#include <avr/pgmspace.h>

const PROGMEM char* str = "Hello UART!\r\n";

我试图用Makefile编译它,这是最后一个命令:

avr-gcc -std=gnu99 -mmcu=atmega328p -DF_CPU=16000000UL -I. -Ilib/
    -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
    -Wall -Wno-main -Wno-strict-prototypes -Wno-comment -g2 -Wextra
    -Wfatal-errors -Wno-unused-but-set-variable -ffunction-sections
    -fdata-sections -Wl,--gc-sections -Wl,--relax -Os main.c lib/uart.c
    --output main.elf

我收到以下错误:

main.c:9:21: error: variable 'str' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
 const PROGMEM char* str = "Hello UART!\r\n";
                     ^
compilation terminated due to -Wfatal-errors.
Makefile:71: recipe for target 'main.elf' failed
make: *** [main.elf] Error 1

我的代码出了什么问题?

我尝试在声明的不同位置移动PROGMEM关键字,而不做任何更改。

2 个答案:

答案 0 :(得分:4)

const char str[] PROGMEM = "Hello UART!\r\n";

应该有效。您正在创建一个指向const数据的非const指针。

答案 1 :(得分:0)

您的代码声明了一个非const指向(n数组)const char的指针。也就是说,编译器完全正确,变量str是非const,它指向的是const。如果你想要指针和指向数组都是const,那就是:

const PROGMEM char* const str = "Hello UART!\r\n";

或等效地,这:

PROGMEM char const * const str = "Hello UART!\r\n";

这两者的意思完全相同。