读取共享内存上的优化

时间:2020-01-03 07:45:18

标签: c gcc concurrency

假设您有一个函数可以对共享变量进行多次读取访问,该共享变量的访问是原子的。全部在同一进程中运行。想象它们是进程的线程,还是运行在没有MMU的裸机平台上的sw。

作为一项要求,您必须确保该读取的值在函数的所有长度上都是一致的,因此代码不得重新读取内存位置,而必须将其放入局部变量或寄存器中。我们如何确保这种行为得到尊重?

例如...

shared是唯一的共享变量

extern uint32_t a, b, shared;

void useless_function()
{
  __ASM volatile ("":::"memory");
  uint32_t value = shared;
  a = value *2;
  b = value << 3;
}

在某些情况下可以通过直接读取共享变量来优化价值吗?如果是,我如何确定这不会发生?

1 个答案:

答案 0 :(得分:0)

在给出的示例中,您根本没有在函数中使用变量value。因此,肯定会对其进行优化。

此外,如注释中所述,在多任务系统中,shared的值可以在函数中更改。

我需要的是,共享只能读取一次,并且本地值将在所有函数长度中保留,并且不会重新评估

我会在下面建议类似的东西。

extern uint32_t a, b, shared;

void useless_function()
{
  __ASM volatile ("":::"memory");
  uint32_t value = shared;
  a = value*2;
  b = value << 3;
}

在此功能中,shared仅读取一次。下次调用该函数时将再次读取。

相关问题