我目前正在从ICCAVR移植一个大型项目到Atmel Studio,因为我需要为正在处理的项目使用一些ASF库。
我在尝试将以下行转换为Atmel Studio时遇到以下代码示例错误
void debugoutf(__flash char * header, __flash char * msg);
定位地址空间'__flash'的错误指针必须在const中功能参数“标题”
我尝试使用文档中的宏,以便可以在Atmel Studio中进行编译。
#ifndef FLASHVAR_H_
#define FLASHVAR_H_
#include <avr/pgmspace.h>
#if defined(__ICCAVR__) // IAR C Compiler
#define FLASH_DECLARE(x) __flash x
#endif
#if defined(__GNUC__) // GNU Compiler
#define FLASH_DECLARE(x) x __attribute__((__progmem__))
#endif
IAR到AVR的转换
void debugout(FLASH_DECLARE (char * header), char * msg);
我的问题是我是否正确完成了转换,因为我不正确完成转换,因为在UART调试中什么都没打印出来。
在变量上使用__attribute__((__progmem__))
的问题是,每当您想从此类变量中读取数据时,都无法像从RAM中访问变量那样以通常的方式访问它。相反,您必须使用avr/pgmspace.h
header in avr-libc提供的特殊功能,例如avr/pgmspace.h
。
这很烦人,但是您不必那样做,因为他们为什么将pgm_read_byte
之类的named address spaces添加到最新版本的GCC中(假设您使用的是C,而不是C ++)。如果您的GCC版本支持,建议您停止使用__flash
,而改用__attribute__((__progmem__))
。如果编译器由于希望将存储在Flash中的项目标记为__flash
而给您错误或警告,则只需将const
添加到声明/定义中(在正确的位置)。如果您在执行此操作时遇到问题,请发布新问题或编辑此问题,使其包含const
。
对于您提供的示例代码,您应该尝试编写:
MCVE