2

有一个名为 'ByteBuffer' 的 Arduino 库(在此处找到),它是一个循环缓冲区实现。我通过取消对所有非字节数据类型的支持并添加了一些便利方法,对它进行了轻微修改(称为“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”指针的 cribbage,我有一种感觉,如果我将 ByteBuffer 的实现从 C++ 转换为 C(OO 到程序),这应该是一种简单的修复方法,尽管我真的很喜欢 OO语义。会这样做,如果没有其他办法。

4

1 回答 1

3

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

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

    void init() volatile
    {
        cout << "A::init()" << endl;
    }
};
于 2012-01-05T04:52:22.523 回答