为什么这个函数会将一个int参数转换为一个易失性指针并立即取消引用它?

Chi*_*nna 21 c

我只是想知道下面的功能在做什么

static int myfunc(int val)
{
    return *(volatile int *)val;
}
Run Code Online (Sandbox Code Playgroud)

Gui*_*i13 24

如果val是将指针传递给此函数时的指针,则会确保读取此指针指向的值并将其返回给调用者.

我怀疑这可能是嵌入式设备的一个技巧,有时在地址读取值的操作会对硬件产生一些影响.
例如,从硬件FIFO读取将弹出FIFO的读取值.

将指针标记为volatile会使编译器在检测到未使用该值时优化读取.

例:

#define FIFO_ADDRESS 0x800050

static int myfunc(int val)
{
    return *(volatile int *)val; // the address *will* be read
}

static int bad( int val )
{
    return *(int*)val; // might be optimized to nop()  
                       // by the compiler if the value 
                       // is not used by the caller
}

int main(){
   bad( FIFO_ADDRESS );    // could be NOP since return value is not used

   myfunc( FIFO_ADDRESS ); // *WILL* perform a READ operation on the FIFO, 
                           // even though the result is not used, because 
                           // of the volatile keyword

}
Run Code Online (Sandbox Code Playgroud)

请注意,我会以不同的方式执行此操作,可能使用名称灵巧的宏:

#define FORCE_INT_PTR_READ( address ) *(volatile int *)address 
Run Code Online (Sandbox Code Playgroud)

你能举个例子说明你的情况吗?


Tom*_*ner 5

它似乎试图混淆优化器(可能还有用户).它取一个整数,将其视为指向整数的指针,并取消引用它.'volatile'确保优化器将在该点为该解除引用生成代码,并且不会让优化器省略从内存中获取的内容.这通常用于访问内存映射的硬件寄存器,