我正在尝试使用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的特殊属性吗?
重要说明:
*(volatile int*)0x600 = your_data_here;
但这对我来说也不是一个选择,我需要声明一个实际的变量(因为我想将其映射到按位结构以访问单个位,而无需显式使用掩码和逻辑运算。所以我真的在寻找一种使提供的属性起作用的方法,而不是一种解决方法。我想念什么?
答案 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