встроенный — C ++ Const-корректность с изменчивым и внешним доступом к данным

Я разработчик встроенного C, который недавно начал возиться с кодом C ++ на встроенном устройстве и не уверен в том, как применяется const -корректность, когда класс обращается к изменчивым данным, таким как отображенные в памяти регистры или данные на внешнем устройстве, например Аналого-цифровой преобразователь (АЦП).

Например, у меня есть классы, которые взаимодействуют с аппаратными модулями устройства, обращаясь к его отображенным в памяти регистрам через указатель, например так:

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 методы? То есть, что происходит, когда я хочу опрашивать состояние ввода-вывода следующим образом:

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

Если ReadIOState() является constзатем компилятор может повторно использовать значение, возвращаемое после одного вызова, или он достаточно умен, чтобы видеть, что он обращается к volatile данные и не делать этого?

5

Решение

У вас просто есть указатель на структуру внутри класса, и вы не меняете указатель, поэтому метод может быть константным. Компилятор не должен повторно использовать значение из предыдущего вызова, он достаточно умен.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector