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

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

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

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

搜索网络或TI论坛也没有任何结果。

任何其他提示如何进行?

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

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

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

为此,请正常声明变量,并仅在强制读取或写入变量时添加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 。)