从ICCAVR移植项目到Atmel Studio 7.0 _flash问题

问题描述 投票:0回答:1

我目前正在从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调试中什么都没打印出来。

embedded atmega atmel iar atmelstudio
1个回答
0
投票

在变量上使用__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
© www.soinside.com 2019 - 2024. All rights reserved.