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

Posted

技术标签:

【中文标题】将项目从 ICCAVR 移植到 Atmel Studio 7.0 _flash 问题【英文标题】:Porting project from ICCAVR to Atmel Studio 7.0 _flash problem 【发布时间】:2020-02-27 05:45:49 【问题描述】:

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

下面的代码示例在尝试将以下行转换为 Atmel Studio 时遇到此错误

void debugoutf(__flash char * header, __flash char * msg);

指向地址空间“__flash”的错误指针必须是 const in 函数参数'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

IAR 到 AVR 的转换

void debugout(FLASH_DECLARE (char * header), char * msg);

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

【问题讨论】:

您是否尝试按照错误提示执行操作?即:#define FLASH_DECLARE(x) const (x) __attribute__((__progmem__)) 我使用了问题中所示的宏 ...当你添加 const 时会发生什么? 【参考方案1】:

在变量上使用__attribute__((__progmem__)) 的问题在于,每当您想从此类变量中读取数据时,您不能像从 RAM 中访问变量那样以通常的方式访问它。相反,您必须使用avr/pgmspace.h header in avr-libc 提供的特殊功能,例如pgm_read_byte

这很烦人,但您不必那样做,因为他们为什么将named address spaces 之类的__flash 添加到最新版本的 GCC(假设您使用的是 C,而不是 C++)。如果您的 GCC 版本支持,我建议您停止使用 __attribute__((__progmem__)) 并改用 __flash。如果编译器给你一个错误或警告,因为它希望存储在闪存中的项目被标记为const,你可以简单地将const添加到声明/定义中(在正确的位置)。如果您在执行此操作时遇到问题,请发布新问题或编辑此问题,使其包含MCVE。

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

void debugoutf(const __flash char * header, const __flash char * msg);

【讨论】:

以上是关于将项目从 ICCAVR 移植到 Atmel Studio 7.0 _flash 问题的主要内容,如果未能解决你的问题,请参考以下文章

将 Linux 兼容项目从 Windows 移植到 Linux [关闭]

将 WCF 项目从 VS 2008 移植到 2010 时出错

ATMEL Studio 添加自己的库

如何将 local.settings.json 从 azure 函数移植到 .NET 核心 Web 项目?

将应用程序从 Eclipse 移植到 Android Studio 时出错

如何将项目从一个 STMFx 系列移植到同一系列中的另一个