2015-04-23 22 views
2

“常量”修改器我有一个这样的文件:AVR-GCC并未看到PROGMEM

#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关键字,没有任何变化。

+0

尝试:为const char海峡[] PROGMEM = “你好!UART \ r \ n”; –

回答

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

应该工作。你正在创建一个非常量指针给const数据。

+0

这也会把\ 0放在最后? – MightyPork

+0

是的,它会终止字符串。 – Unimportant

+0

'str'是一个不是指针的数组。 – ouah

0

您的代码声明了一个非const指针const char一个(n个阵列)。也就是说,编译器是完全正确的变量str是非const,这是它指向一个声明const的东西。如果你想同时指针和指向的数组是const,那么这将是这样的:

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

或者等价地,这样的:

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

这两个意思完全一样的东西对方。