gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:55:08 24 4
gpt4 key购买 nike

有一个名为“ByteBuffer”的 Arduino 库(发现 here ),它是一个循环缓冲区实现。我稍微修改了它(称之为“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语义。如果没有其他办法,我会这样做。

最佳答案

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

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

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

关于c++ - ISR 中使用的循环缓冲区,声明为 volatile,会出错。为什么 ?如何解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8737642/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com