C ++与volatile和外部数据访问的Const-correctness

时间:2013-07-22 14:23:31

标签: c++ embedded const-correctness

我是一名嵌入式C开发人员,他最近开始在嵌入式设备上搞乱C ++代码,当一个类访问外部设备上的内存映射寄存器或数据等易失性数据时,我不确定如何应用const-correctness,例如模数转换器(ADC)。

例如,我有通过指针访问其内存映射寄存器来连接设备硬件模块的类,如下所示:

class IOPin
{
public:
    /* Constructor, destructor, other methods...*/

    // should this be a const method?
    bool ReadIOState() {return portregs_->state;}

private:
    /* Other private stuff...*/

    // Constructor points this to the right set of memory-mapped registers
    volatile struct portregs_t
    {
        uint32_t control;
        uint32_t state;
        uint32_t someotherreg;
    } *portregs_;
};

注册名称当然是为了举例说明。我正在为任何好奇的人使用Microchip PIC32器件。

根据我可能不正确的理解,标记方法const意味着对于调用者而言,对象的可观察状态不应该改变。那么ReadIOState()方法应该是const,因为它访问可能随时更改的volatile数据,因此调用者会观察到更改?或者它应该是const,因为方法没有明确更改任何内容?

目前,由于问题中所述的原因,我倾向于不使用const方法。在this GotW article绊倒之后尤其如此,{{3}}表明const的含义正在变为“能够同时阅读”。我的嵌入式应用程序是单线程的,但我认为这对于const一般来说可能是一个很好的试金石。

此外,编译器如何处理const方法?也就是说,当我想像这样轮询IO的状态时会发生什么:

// wait for IO pin to go high
while(!myIOpin.ReadIOState())
{}

如果ReadIOState()const,那么编译器是否可以重复使用一次调用后返回的值,或者它是否足够智能以查看它是否正在访问volatile数据而不是那样做? / p>

1 个答案:

答案 0 :(得分:1)

您只是指向类中的结构,并且您不更改指针,因此该方法可以是const。编译器不应该重用前一次调用的值,它足够聪明。