首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C/C++知识中的空白修复与寄存器访问

C/C++知识中的空白修复与寄存器访问
EN

Stack Overflow用户
提问于 2017-11-30 19:54:58
回答 2查看 372关注 0票数 0

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

这就是为什么我非常兴奋地发现下面的代码。我已经学习代码库 3天了。

从语法上讲,我理解下面代码的每一行;除了那行很重要的代码,因为我不知道它是如何工作的!

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

尽管如此,我仍然不知道这段代码实际上是如何从寄存器中写入或读取的。

代码语言:javascript
复制
#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不是必须是物理地址吗

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-30 20:43:32

你在找"内存映射输入输出“。

CPU与外部硬件对话的最常见方式是通过内存总线--用于访问正常内存的同一总线。

首先,请记住,CPU与内存的交互不仅涉及读和写,还包括总线错误处理(无效访问)、仲裁(多个设备访问相同内存)和路由(CPU可能希望访问多个内存设备)。要处理此问题,需要使用总线协议。

要写入或读取外部内存,CPU必须启动事务。它的确切顺序由已使用的总线协议定义,但通常涉及以下步骤:

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

发起超越的设备称为主设备或启动程序,而负责处理事务的设备称为从设备或目标。

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

总线协议提供了一种将数据传送到设备或从设备传输数据的方法。这个设备可以是一个内存设备或其他任何东西。在存储器装置中,其控制器通过向存储器单元阵列或从存储器单元阵列写入或读取数据来处理超越。

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

如果你也熟悉现代操作系统,你可以想到“一切都是一个文件”的抽象。有些文件只是普通的文件,例如它们充当内存。其他文件是不同的。就像在Linux上阅读/proc/cpuinfo会给您提供有关CPU的信息一样,在某个地址阅读可以为您提供有关当前正在等待的IRQ的信息,或者告诉您当前收到的邮件邮箱有多少。

总线协议的例子是阿希阿伯。AHB更简单,AXI协议更复杂,速度更快。在Raspberry PI的情况下,它很可能是用来连接CPU和硬件的AXI协议。

因此,关于您的问题,这两个函数用于通过内存映射I/O访问外部设备的寄存器。

  • volatile用于防止编译器删除、重新排序或以任何方式更改这些内存访问--如果没有这个硬件,就无法完成我们希望它做的事情。
  • 使用u32是因为许多设备甚至不支持任何东西,只支持32位访问,以保持硬件简单。
票数 2
EN

Stack Overflow用户

发布于 2017-11-30 20:49:40

(unsigned int *)是指向指向unsigned int的指针的类型转换。取消引用操作符*用于访问此指针指向的内存位置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47581590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档