gcc中用于AVR的__attribute __((io)),__ attribute __((address))似乎没有任何作用

时间:2019-02-21 19:30:45

标签: gcc avr avr-gcc

我正在尝试使用AVR风格的gcc(https://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html#AVR-Variable-Attributes)专门提供的变量属性。

该手册说,这些特殊属性应允许我强制将变量放置在预定的存储器地址上。他们甚至举了一个例子:

volatile int porta __attribute__((address (0x600)));

但是,当我从上述文档编译和调试此代码示例时,使用此类属性声明的变量将放置在SRAM中由编译器和链接器确定的位置中,而不是根据请求位于地址0x600处。实际上,如果我从声明中完全删除该属性,则最终结果不会改变-变量被放置在相同的“任何”地址。当我使用“ io”和“ io_low”属性而不是“ address”时,也会发生同样的事情。

我正在使用针对8位MCU(ATMega64)的最新版本Atmel Studio 7.0.19.31中打包的gcc工具链。

因此产生一个问题:有人成功尝试使用这些特定于AVR的特殊属性吗?

重要说明:

  1. 我知道,通常要在gcc中的固定地址处完成变量的放置,您需要执行两步过程(使用section属性,然后修改链接描述文件),但是对于AVR而言,具体来说提供了这些单步属性,问题是如何使它们起作用。两步过程对我来说不是一个选择。
  2. 我知道一般来说,总能做到这一点: *(volatile int*)0x600 = your_data_here; 但这对我来说也不是一个选择,我需要声明一个实际的变量(因为我想将其映射到按位结构以访问单个位,而无需显式使用掩码和逻辑运算。

所以我真的在寻找一种使提供的属性起作用的方法,而不是一种解决方法。我想念什么?

1 个答案:

答案 0 :(得分:0)

typedef struct {
  uint8_t rx:4;
  uint8_t tx:4;
} Pio_TXRXMUX_t;
#define Pio_TXRXMUX (*(volatile Pio_TXRXMUX_t *)(0x22)) //PORTA on ATMEGA1280