假设您有一个函数可以对共享变量进行多次读取访问,该共享变量的访问是原子的。全部在同一进程中运行。想象它们是进程的线程,还是运行在没有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;
}
在某些情况下可以通过直接读取共享变量来优化价值吗?如果是,我如何确定这不会发生?
答案 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
仅读取一次。下次调用该函数时将再次读取。