是否有害使用" volatile"在C?

时间:2014-10-13 10:57:29

标签: c kernel volatile sparse-matrix

我对Sparse很新。在稀疏运行期间,我看到了这个警告:

警告:参数2中的类型不正确(不同的地址空间)

expected void volatile [noderef] <asn:2>*addr
got void *

基本上,这是因为以下原因:

struct context{
    void __iomem *base;
};

readl(const volatile void __iomem* add){
....
....
}

function: foo(){
    struct  context *var;
    readl(var->base);   //---> here i got the above mentioned warning
}

为了解决这个问题,我做了以下事情:

struct context{
      - void __iomem *base;
      + volatile void __iomem *base;
};

并删除警告。

我的问题:             - 在这种情况下使用“挥发性”是否有害。如果是,那么为什么?             - 我认为我不应该将struct的成员变为“volatile”。但是,那么我们如何摆脱Csparse警告。

根据@ https://www.kernel.org/doc/Documentation/volatile-considered-harmful.txt给出的文件 @ http://lwn.net/Articles/233482/。 我们应该总是避免使用volatile。

2 个答案:

答案 0 :(得分:1)

不,它没有害处。不知道它为什么应该或可能对什么有害?

如果您调用的代码需要volatile指针,那么传递非volatile代码是不正确的,因为调用上下文中的代码可能不是在这种情况下,适当地适应volatile值的要求。

答案 1 :(得分:1)

volatile指示编译器不要对该变量进行任何优化。因此,它将保证使用最新的变量值。这可能会被外部事件改变。 通常在处理外部事件时使用volatile,例如硬件相关引脚的中断。 我不认为,它有害。但是为什么要在不需要的时候使用,因为优化有助于提高效率,所以如果你确定即使变量被优化,也不能被外部事件改变,那么很好,没有易失性。