如何为TMS320F2812 DSP编写内存屏障?

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论坛也一无所获.

任何其他提示如何进行?

CL.*_*CL. 6

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

使用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.)