avr-gcc 没有看到带有 PROGMEM 的 "const" 修饰符
avr-gcc not seeing "const" modifier with 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
关键字,没有任何变化。
您的代码声明了一个非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";
这两个意思完全一样。
const char str[] PROGMEM = "Hello UART!\r\n";
应该可以。您正在创建指向常量数据的非常量指针。
我有这样一个文件:
#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
关键字,没有任何变化。
您的代码声明了一个非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";
这两个意思完全一样。
const char str[] PROGMEM = "Hello UART!\r\n";
应该可以。您正在创建指向常量数据的非常量指针。