ISR中使用的循环缓冲区,声明为volatile,给出错误。为什么?如何解决这个问题?

时间:2012-01-05 04:27:33

标签: c++ arduino volatile isr

有一个名为'ByteBuffer'的Arduino库(找到here),这是一个循环缓冲实现。我稍微修改了它(称之为'ByteBufferPro'),通过切断对所有非字节数据类型的支持,并添加一些便利方法。我打算在我的Interrupt-Service-Routine中使用它,这已经做了一些繁重的工作。为了减轻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

想知道是什么原因,以及我如何解决这个问题?将cribbage称为'this'指针,我感觉如果我将ByteBuffer的实现从C ++转换为C语言(OO到程序),那应该是一种简单的方法来解决它,尽管我真的很喜欢OO语义。如果没有别的办法,就会这样做。

1 个答案:

答案 0 :(得分:3)

所有函数都应该具有volatile限定符,就像常量对象所需的const限定符一样。这是一个例子:

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

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