gpt4 book ai didi

c++ - 您可以将 C++ 对象映射到内存映射外设吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:28:42 24 4
gpt4 key购买 nike

我过去曾见过以下技巧:

struct MyStruct
{
field 1;
field 2;
field 3;
};

void f()
{
MyStruct *example = (memory mapped peripheral address);
}

这基本上使得变量 example 现在包含内存映射外围设备的地址(值),然后字段 1 处于相同的偏移量,字段 2 位于(基地址 + sizeof(字段 1))并且等等。

当有多个偏移量与连续内存中的外围设备关联时,这很有用,因为它提供了一个抽象层。

我想知道您是否可以对 C++ 对象执行相同的操作,以及如何使该对象成为单例以及继承将如何影响这种映射。

最佳答案

I am wondering if you can do the same with a C++ object,

是的,同样可以做到。我在电信系统开发中使用 C++ 进行内存映射 io 已有十多年了。我很少在嵌入式软件中处理结构,结构与类相比没有优势。此外,我更喜欢屏蔽和转移以处理字段,并且我对位字段产生了一点厌恶。

对于结构和类实例,可以确定和确认数据布局和打包,因此 assert() 可以在运行时通知数据构建不正确。

a) C 和 C++ 都不提供内存布局语义,并且

b) 编译器选项可以改变结果(打包、对齐、字段重排)

这两项需要某种运行时检查。我们通常断言数据属性的总长度,以及字段偏移开始之间的一个或多个距离,所有这些都在命名构造函数中。

许多编译器提供 pragma 来支持内存映射 io 打包和对齐问题。不幸的是,不同编译器的 pragma 通常有不同的名称。这通常并不重要,因为硬件特定的软件几乎永远无法移植。我遇到的所有编译指示似乎都有效。最终我们选择不使用它们。

请注意,字节序也有影响,但您使用的硬件(或者可能必须)设计为具有正确的字节序。

我的大部分嵌入式系统经验都是通过 vxWorks 工具获得的,还有一些是通过 OSE 获得的。两者都在 2011 年之前使用 GCC。

and how to make this object a singleton and

我发现单例没有任何值(value)。但我相信单例可以用传统的方式构建,因为实例的代码不存储在数据字段中。它们是分开的。当您调用 singletonGet() 方法时,它需要将数据“输出”映射到硬件地址。

“如何在地址 0xAAAA0001 寻址硬件”的最典型机制是将 uint64_t 枚举地址转换为指针

 class FooHW; // hardware class

FooHW* foo = reinterpret_cast<FooHW*>(AAAA0001_uint64_t); // enum addr

这会跳过所有的 ctor/dtor 内容。这可取的。您访问内存映射设备的方式通常不能在软件重启期间干扰正在运行的硬件。在开发和操作过程中,热启动(硬件已经在运行,但软件已经重新启动)比冷启动(也称为电源反弹)更为常见。

可以使用放置“新建”(和“删除”)在正确的内存地址创建实例。但这没有任何优势。您应该研究冷启动、热启动、保护开关等。与其余代码一起驻留的 Foo* 指针是典型的。

how would inheritance affect this kind of mapping.

我想所有这些问题都是特定于工具的。我所看到的是基类数据属性预先附加到派生类数据属性。有些工具可能会以相反的方式进行。

在我的工作中,我不记得要导出的内存映射实例。但是,我认为它可以工作,只是我会选择避免更多的努力。

关于c++ - 您可以将 C++ 对象映射到内存映射外设吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44249742/

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