sta*_*lue 2 c concurrency memory-barriers ti-dsp texas-instruments
我查看了TI C/C++编译器v6.1用户指南(spru514e),但没有找到任何内容.
该asm声明在这方面似乎没有提供任何内容,手册甚至警告不要改变变量值(p132).未实现用于声明对变量的影响的GNU扩展(p115).
我也没有找到任何记忆障碍的内在因素(比如__memory_changed()Keil的armcc).
搜索网络或TI论坛也一无所获.
任何其他提示如何进行?
内存障碍与内存访问的顺序有关,但您还必须确保值不会保留在寄存器中,而是完全写入内存.
使用TI编译器强制执行此操作的唯一方法是使用volatile.
请注意volatile,虽然作为变量的修饰符,但其实现不是关于变量本身(即其内存),而是关于对此变量的所有访问.因此,如果您想避免optmization太少的影响,请编写您的程序,以便只有一些变量访问是易失性的.
为此,请正常声明变量,并volatile仅在强制读取或写入变量时添加.你可以使用这样的辅助函数:
inline void force_write(int *ptr, int value)
{
*(volatile int *)ptr = value;
}
Run Code Online (Sandbox Code Playgroud)
或使用从Linux窃取的这个漂亮的宏,可用于读/写和所有类型:
#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
...
if (ACCESS_ONCE(ready) != 0)
ACCESS_ONCE(new_data) = 42;
Run Code Online (Sandbox Code Playgroud)
(这个名字有历史原因;更好称之为FORCE_ACCESS.)