6

我是一名嵌入式 C 开发人员,最近开始在嵌入式设备上处理 C++ 代码,并且不确定当类访问易失性数据(例如内存映射寄存器)或外部设备上的数据时如何应用 const 正确性,例如模数转换器 (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目前,由于问题中所述的原因,我倾向于不采用这种方法。在偶然发现这篇 GotW 文章后尤其如此,该文章指出 的含义const正在更改为“能够同时阅读”。我的嵌入式应用程序是单线程的,但我认为这通常是一个很好的试金石const

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

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

如果ReadIOState()const,那么编译器是否可以重用一次调用后返回的值,或者它是否足够聪明,可以看到它正在访问volatile数据而不这样做?

4

1 回答 1

2

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

于 2013-07-22T14:46:46.093 回答