Циркулярный буфер, используемый в ISR, объявлен как volatile, выдает ошибку.Зачем ?Как это исправить? - PullRequest
1 голос
/ 05 января 2012

Существует библиотека Arduino под названием 'ByteBuffer' (найдено здесь ), которая представляет собой реализацию циклического буфера. Я немного изменил его (назвав его «ByteBufferPro»), отключив поддержку всех небайтовых типов данных и добавив несколько удобных методов. Я намереваюсь использовать это в своей программе обслуживания прерываний, которая уже выполняет некоторые тяжелые задачи. Чтобы уменьшить нагрузку на ISR, я намерен позволить ISR помещать байты информации в кольцевой буфер (поскольку их захват / хранение является критичным по времени), но фактическая обработка этой информации не так критична по времени, что я делаю в основном цикле ().

Следуя логике, что любая переменная, которая может быть обновлена ​​в ISR, должна иметь в объявлении квалификатор 'volatile', я объявил буфер как volatile, но теперь я вижу следующие ошибки компиляции: -

ByteBufferProExample.cpp: In function 'void setup()':
ByteBufferProExample:12: error: passing 'volatile ByteBufferPro' as 'this' argument of 'void ByteBufferPro::init(unsigned int)' discards qualifiers
ByteBufferProExample.cpp: In function 'void loop()':
ByteBufferProExample:24: error: passing 'volatile ByteBufferPro' as 'this' argument of 'void ByteBufferPro::clear()' discards qualifiers

Хотите знать, в чем причина, и как я могу это исправить? Если взять криббидж по поводу указателя 'this', у меня есть ощущение, что если я переключу реализацию ByteBuffer с C ++ на C (OO на процедурный), это будет простой способ исправить это, хотя мне действительно нравится OO семантика. Сделал бы так, если бы не было другого пути.

1 Ответ

3 голосов
/ 05 января 2012

Все ваши функции должны иметь квалификатор volatile, точно так же как const квалификатор, необходимый для константных объектов. Вот пример:

class A
{
public:
    A(unsigned int a)
    {
    }

    void init() volatile
    {
        cout << "A::init()" << endl;
    }
};
...