gpt4 book ai didi

c++ - 修复关于 C/C++ 和寄存器访问的知识差距

转载 作者:太空宇宙 更新时间:2023-11-04 01:19:34 25 4
gpt4 key购买 nike

诚然,我是 C++ 的新手。不幸的是,我看到的大多数代码要么使用 asm 调用,要么定义一个主体位于汇编文件中的 extern 函数。

这就是为什么我非常兴奋地找到下面的代码。我一直在研究codebase现在3天了。

在句法上我理解下面的每一行代码;除了重要的那个,因为我不明白它是如何工作的!

  1. types.h 定义了 u32uintptr(我见过)
  2. 当 C 和 C++ 代码混合时,需要 ifdef __cplusplus。特别是因为 extern C 是特定于 C++ 的。如果 gcc 有 -fno-exceptions 参数可以省略
  3. volatile 用于防止编译器进行任何优化,因为地址必须是完美的,因为它正在写入/读取寄存器。

综上所述,我仍然不知道这段代码实际上是如何写入或读取寄存器的。

#include <circle/types.h>
#ifdef __cplusplus
extern "C" {
#endif

static inline u32 read32 (uintptr nAddress)
{
return *(u32 volatile *) nAddress;
}

static inline void write32 (uintptr nAddress, u32 nValue)
{
*(u32 volatile *) nAddress = nValue;
}

#ifdef __cplusplus
}
#endif

#endif

*(unsigned int *) 是什么意思?这如何用于读取和写入寄存器? nAddress 不是必须是物理地址吗

最佳答案

您正在寻找“memory mapped input-output”。

CPU 与外部硬件通信的最常见方式是通过内存总线——与访问普通内存的总线相同。

首先,请记住,CPU 与内存的交互不仅涉及读取和写入,还涉及总线错误处理(无效访问)、仲裁(多个设备访问同一内存)和路由(CPU 可能想访问多个存储设备)。为了处理这个问题,使用了一个总线协议(protocol)

要写入或读取外部存储器,CPU 必须启动一个事务。其确切顺序由使用的总线协议(protocol)定义,但通常涉及如下步骤:

  • 发送交易地址、类型、长度等
  • 接收响应 - 允许或拒绝(总线错误)。
  • 如果允许交易,则传输实际数据。

发起交易的设备称为masterinitiator,而负责处理交易的设备称为slave>目标

决定由哪个从机处理事务的设备称为解码器路由器。因此事务通常会从主设备到解码器,然后再到从设备。

总线协议(protocol)本质上提供了一种向设备传输数据或从设备传输数据的方法。该设备可以是存储设备或任何其他设备。在存储设备的情况下,其 Controller 通过向存储单元阵列写入数据或从存储单元阵列读取数据来处理事务。

如果您熟悉面向对象编程,您可以认为 CPU 通过接口(interface) 连接到外部设备,允许在指定地址进行读写。这个接口(interface)的实现可以做任何。这就是内存映射 I/O 的完成方式——CPU 连接到一堆设备,每个设备都在特定地址范围内接收事务。将数据写入一个地址,该数据将由存储设备接收,该存储设备将其存储到存储单元阵列,将数据写入另一个地址,然后将被 SD Controller 接收,并将被解释为“发送 SEND_STATUS 命令到SD 卡”。

如果你也熟悉现代操作系统,你可以想到“一切皆文件”的抽象概念。有些文件只是普通文件,例如他们充当内存。其他文件不同。就像在 Linux 上读取 /proc/cpuinfo 可以为您提供有关 CPU 的信息一样,在某个地址读取可以为您提供有关当前挂起的 IRQ 的信息,或者告诉您邮箱此时有多少传入消息.

总线协议(protocol)的例子是AXIAHB . AHB 更简单,AXI 更复杂且协议(protocol)更快。对于 Raspberry PI,很可能是用于将 CPU 连接到硬件的 AXI 协议(protocol)。


所以关于你的问题,这两个函数用于通过内存映射 I/O 访问外部设备的寄存器。你做对的其他一切:

  • volatile 用于防止编译器删除、重新排序或以任何方式更改这些内存访问 - 没有此硬件将无法执行我们希望它执行的操作。
  • u32 之所以被使用,是因为许多设备除了 32 位访问之外甚至不支持任何东西以保持硬件简单。

关于c++ - 修复关于 C/C++ 和寄存器访问的知识差距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47581590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com