如何直接从RAM访问指向变量

How to access a pointed variable directly from RAM?

本文关键字:变量 访问 RAM 何直接      更新时间:2023-10-16

我对直接通过RAM访问指向变量的方法进行了一些研究,但没有成功,因为我确信编译器不会访问注册的副本。

int32_t* a;
void main()
{
    a = (int32_t*)malloc(4);
}
void mainBis()
{
    ???
}

如何确保以与volatile相同的方式访问*a

感谢

附言:即使它在这里被称为mainmainBin,它也只是两个不同的线程。

只需将a声明为int32_t volatile * a。这样,编译器就不能假设使用*a的两个表达式是相等的,即使在这两个表达式之间没有写入对a的更改的内存。

您尝试使用double=,==来执行的操作表示相等性检查,而不是赋值。

a == (int32_t*)malloc(4);

应在中使用single=

a = (int32_t*)malloc(4);

这似乎是一个XY问题。

现在还不清楚你在问什么——我的理解是,你想从不同的线程(可能在不同的内核甚至处理器上)访问a,所以你想确保它被写入RAM,而不仅仅是从寄存器缓存或重用。是这样吗?

并发性是一个很大的话题,我们不知道你正在运行的系统的细节——当这两个函数被相对于彼此调用时。

首先,您开始了解volatile关键字。将变量声明为volatile int32_t* a;告诉编译器它可能随时从另一个线程更改,但不能保证它在内存和缓存中的状态。如果已知这两个线程在同一个内核上运行,并且您确信main()中设置了它之后,您将从a中读取。

如果你不确定读&write将执行,您需要进行自己的线程同步,这取决于哪种体系结构&您正在使用的库。一般来说,你会想要这样的伪代码:

int32_t* a;
semaphore_t aIsValid;
void main()
{
    a = (int32_t*)malloc(4);
    signal_semaphore(aIsValid);
}
void mainBis()
{
    wait_for_semaphore(aIsValid);
    // read from a
}

在大多数现代系统上,使用信号量等同步原语也可以确保线程之间的缓存一致性,因此aaIsValid发布后的所有地方都具有相同的值。