我可以暂时变量变量吗?

时间:2014-09-02 01:22:41

标签: c gcc optimization volatile

PSoC中,可以在内存空间mapped to flash中声明变量。由于闪存读取比RAM读取慢,因此程序将受益于编译器优化 - 允许将值存储在寄存器中或以其他方式缓存。除了修改闪光灯的值时。这可以是done动态,程序员知道发生的精确时刻。这也是相对较少的(为了保护闪存免受写入磨损)并且花费相对长的时间。如果这样的写入,那么变量是从底层内存恢复其值(表现得像volatile),然后像往常一样继续进行,直到下次写入所有优化。

因此,实质上,一些通过使用底层存储单元强制刷新变量的机制将是有用的;是时间限制(写入后不久)还是代码的某些部分(写入操作后跳转到'刷新'功能)。 C中是否存在任何此类机制,特别是GCC?

(另外,考虑到内存限制(2-4KB RAM),最好将RAM /寄存器的分配留给优化器 - 将每个变量镜像到两个持久版本中的简单方法:volatile(在Flash中)和非 - 易失性(在RAM中),在刷新期间将volatile写入非易失性,然后从那时起使用非易失性将是相当浪费的。)

2 个答案:

答案 0 :(得分:2)

您应该通过在RAM中显式维护变量来自行进行缓存。 CPU通常不会有可用的寄存器,编译器不会使用堆栈来缓存全局。

您可以尝试声明变量非易失性,然后通过易失性指针(例如* (volatile int *) & foo)访问它。就个人而言,我会称之为灾难的秘诀。它可能不会更新"缓存"价值foo

执行相反的操作并声明它volatile但是使用指针删除限定条件会产生未定义的行为。无论如何,编译器可能不会将指针取消引用到寄存器中。

答案 1 :(得分:0)

您可以尝试使用两个变量:

int foo;
volatile int foo_vol;

对您的大多数程序使用foo,但在发生写入时,请将foo_vol分配给foo

if (there_was_a_write)
    foo = foo_vol;
process_data(&foo, bar);

这将导致foo获得优化,但它仍然可以使用新值。我不确定这种方法是否适用于您的特定设置,但无论如何都要好运。