【问题标题】:Alternative to volatile?易失性的替代品?
【发布时间】:2013-10-04 19:55:19
【问题描述】:

我在我的嵌入式固件中使用了很多 volatile 变量,但大多数时候,函数中只有一个点我需要确保值是最近的(在开始时)。但是该函数的其余部分引用了相同的变量名,并且值可以同时更改,从而产生非常意外的代码流/结果。我知道这可以通过在函数中使用临时变量来解决,但我一直在寻找更好的解决方案。

现在我想知道,不是将整个变量标记为volatile,而是有一种方法可以使用特殊关键字指示编译器(gcc),我想读取变量,就好像它被标记为易失性一样,所以我只能在函数开头使用该关键字一次?

【问题讨论】:

  • 解决方案在什么方面比使用临时变量更好?这似乎是显而易见的完美解决方案。
  • @DavidSchwartz 我必须修改每个使用这些易失性变量的函数以在函数开始时“缓存”它,并确保所有代码都引用临时变量而不是真实变量.如果我可以完全删除 'volatile' 关键字,我所要做的就是找到实际需要 volatile 读取的位置,而不是相反。
  • 保留访问权限。更改 volatile 变量的名称。
  • 请举个例子。
  • 我不确定是否可以将编译器特定扩展的使用解释为“更好的解决方案”,最好(并且完全足够)的解决方案就是您拥有的解决方案。

标签: c gcc embedded c99 volatile


【解决方案1】:

我对这种情况有点困惑 - 如果您希望对变量的特定访问被视为volatile,请使用

dest = *(volatile TYPE *)&src;

其中 TYPE 是 src 的类型。您可能还需要

asm volatile ("" ::: "memory");

在仔细控制的位置,以防止编译器在易失性读取中移动其他内存位置的加载/存储。

还要调查 C11 的 _Atomic 类型。 (我不确定 GCC 是否支持这些。)

【讨论】:

  • 是的,我希望对变量的特定访问被视为易失性。
  • 我认为这行不通,至少,不能保证。如果最后的写入没有通过volatile完成,那么他需要的值可能还没有在内存中。例如,它可以缓存在寄存器中。
  • @DavidSchwartz 这是与将变量的部分但不是全部访问视为volatile 相关的风险之一,是的。
【解决方案2】:

如果您的变量在内存中并且您的嵌入式系统支持它,您可以使用内存屏障。确保在读取值时没有任何内容访问内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2020-05-28
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多