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

时间:2012-10-09 09:44:37

标签: c concurrency memory-barriers texas-instruments ti-dsp

我查看了TI C / C ++编译器v6.1用户指南(spru514e),但没有找到任何内容。

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

我也没有发现内存障碍的内在障碍(比如Keil的armcc中的__memory_changed())。

搜索网络或TI论坛也没有发现任何内容。

还有其他提示如何进行?

1 个答案:

答案 0 :(得分:5)

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

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