【问题标题】:Preprocessor directive for certain address space某些地址空间的预处理器指令
【发布时间】:2015-09-30 00:53:18
【问题描述】:

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

我知道我可以说

#define DDRA 0xAA

这将使 DDRA = 0xAA,但我如何使它才能打字

DDRA = 0xBB;

会在地址位置 0x0071 中写入 0xBB 吗?

【问题讨论】:

  • #define DDRA (*reinterpret_cast<unsigned char*>(0x71))
  • 它不会使DDRA = 任何东西。
  • 为什么使用预处理指令而不是静态常量?
  • C 和 C++ 是两种不同的语言,因此请选择您所谈论的语言,因为这两种语言的答案大不相同。
  • 在 C 中,而不是这个:DDRA = 0xBB;,它只会导致编译器输出错误消息,而是使用这个:*(int8_t*)DDRA = 0xBB;,它将修改 0xAA 处的一个内存字节

标签: c++ c avr


【解决方案1】:

AVR-GCC 标头使用内部 _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 空间和内存开始之间的 32 字节偏移有关。

TL;DR: #define DDRA _SFR_IO8(0x71),但如果它实际上是标准 I/O 端口,则您的标准头应该已经这样做了。

【讨论】:

  • OP 没有声明底层平台是 AVR
  • @user3629249 实际上,他们做到了!他们将问题标记为“avr”。
  • 谢谢你黄昏。基本版本是写 #define DDRC (*(volatile uint8_t *)(0x71)) 这回答了问题
猜你喜欢
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多