4

我浏览了 TI C/C++ 编译器 v6.1 用户指南 ( spru514e ) 但没有找到任何东西。

asm声明在这方面似乎没有提供任何内容,手册甚至警告不要更改变量值(p132)。未实现用于声明对变量的影响的 GNU 扩展 (p115)。

我也没有发现任何内存屏障的内在特性(比如__memory_changed()在 Keil 的 armcc 中)。

搜索网络或 TI 论坛也一无所获。

任何其他提示如何进行?

4

1 回答 1

8

内存屏障与内存访问的顺序有关,但您还必须确保值不会保留在寄存器中,而是完全写入内存。

使用 TI 编译器强制执行此操作的唯一方法是使用volatile.

请注意volatile,虽然是变量的修饰符,但在其实现中不是关于变量本身(即它的内存),而是关于对该变量的所有访问。因此,如果您想避免优化太少的影响,请编写您的程序,以便只有一些变量访问是易失的。

为此,请正常声明变量,并volatile仅在您想强制读取或写入变量时添加。您可以使用这样的辅助函数:

inline void force_write(int *ptr, int value)
{
    *(volatile int *)ptr = value;
}

或者使用这个从 Linux 偷来的漂亮宏,可用于读/写和所有类型:

#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
...
if (ACCESS_ONCE(ready) != 0)
    ACCESS_ONCE(new_data) = 42;

(这个名字有历史原因;最好叫它FORCE_ACCESS。)

于 2012-10-17T19:52:47.243 回答