特定地址的预处理器指令 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 应该已经这样做了。
假设我想定义一个指令,它可以接受一个 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 应该已经这样做了。