Embedded 将项目从ICCAVR移植到Atmel Studio 7.0的闪存问题

Embedded 将项目从ICCAVR移植到Atmel Studio 7.0的闪存问题,embedded,atmega,atmel,iar,atmelstudio,Embedded,Atmega,Atmel,Iar,Atmelstudio,我目前正在将一个大型项目从ICCAVR移植到Atmel Studio,因为我需要为我正在进行的项目使用一些ASF库 我在下面的代码示例中遇到了这个错误,原因是试图将下面的代码行转换为Atmel Studio void debugoutf(__flash char * header, __flash char * msg); 指向地址空间“\uuu flash”的错误指针必须为常量 函数参数“header” 我尝试在文档中使用宏,以便它可以在Atmel Studio中编译 #ifndef FLA

我目前正在将一个大型项目从ICCAVR移植到Atmel Studio,因为我需要为我正在进行的项目使用一些ASF库

我在下面的代码示例中遇到了这个错误,原因是试图将下面的代码行转换为Atmel Studio

void debugoutf(__flash char * header, __flash char * msg);
指向地址空间“\uuu flash”的错误指针必须为常量 函数参数“header”

我尝试在文档中使用宏,以便它可以在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

我的问题是我是否正确地完成了转换,因为我认为我没有正确地完成转换,因为在UART调试中没有打印任何内容

在变量上使用
\uuuuuu attribute\uuuu((\ uuuu progmem\uuuuu))的问题在于,无论何时您想要从这样一个变量中读取数据,您都不能像从RAM中访问变量那样以通常的方式访问它。相反,您必须使用提供的特殊功能,如
pgm\u read\u byte

这很烦人,但你不必这样做,因为为什么他们会像
\uu flash
一样添加到最新版本的GCC中(假设你使用的是C,而不是C++)。如果您的GCC版本支持,我建议您停止使用
\uuuuuuu属性((\uuuuu progmem\uuuuuu))
,而是使用
\uuuuu flash
。如果编译器希望flash中存储的项目标记为
const
,因此给您一个错误或警告,您只需将
const
添加到声明/定义中(在正确的位置)。如果您在这方面有困难,请发布一个新问题或编辑此问题,使其包含一个新问题

对于您给出的示例代码,您应该尝试编写:

void debugoutp(常量flash char*头,常量flash char*msg);

您是否尝试按错误所述操作?也就是说:
#define FLASH_DECLARE(x)const(x)__attribute_((__progmem_))
我使用了问题中所示的宏……添加const时会发生什么?
void debugout(FLASH_DECLARE (char * header), char * msg);