有一个名为'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语义。如果没有别的办法,就会这样做。
答案 0 :(得分:3)
所有函数都应该具有volatile
限定符,就像常量对象所需的const
限定符一样。这是一个例子:
class A
{
public:
A(unsigned int a)
{
}
void init() volatile
{
cout << "A::init()" << endl;
}
};