将项目从 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 时出错
如何将 local.settings.json 从 azure 函数移植到 .NET 核心 Web 项目?