特定地址的预处理器指令 space

Preprocessor directive for certain address space

假设我想定义一个指令,它可以接受一个 int8_t 并将其存储到指定的内存位置,比如 0x0071。我该怎么做?

我知道我可以说

#define DDRA 0xAA

这将使 DDRA = 0xAA,但我如何才能使输入

DDRA = 0xBB;

将在地址位置 0x0071 写入 0xBB?

AVR-GCC headers 使用内部 _SFR_IO8 宏定义 I/O 端口,例如在 <avr/iom328p.h>:

#define PORTB _SFR_IO8(0x05)

此宏在 <avr/srf_defs.h> 中定义为:

#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)

反过来,由同一文件中的 _MMIO_BYTE 宏解析:

#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))

__SFR_OFFSET的定义是……有点晦涩。它与 AVR I/O space 和内存开始之间的 32 字节偏移有关。

TL;DR:#define DDRA _SFR_IO8(0x71),但是如果它实际上是一个标准 I/O 端口,那么对于您来说,标准 headers 应该已经这样做了。