【发布时间】:2019-08-14 17:29:50
【问题描述】:
我现在希望在 Teensy 3.6 微控制器上的基于定时器的中断中运行一些代码。该代码访问一个类的 [global] 对象数组。我已将该数组和所有成员变量标记为 volatile,我相信这是正确处理中断的第一步。
我标记为 volatile 的成员变量之一是 std::bitset,我想将其称为非易失性方法,我不能这样做
"passing 'volatile std::bitset<16u>' as 'this' argument discards qualifiers [-fpermissive]"
我认为我可以复制 bitset 库并将所有内容切换到 volatile,但我认为这不是必需的,所以我认为要么有更好的解决方案,要么我的想法不正确。
请告诉我应该怎么做。
这些答案似乎建议在 ISR 中访问全局变量时使用 volatile: C 'Volatile' keyword in ISR and multithreaded program?,
What is the correct way of using C++ objects (and volatile) inside interrupt routines?,
Is volatile needed when variable is only read during interrupt
volatile keyword usage in ISR function in micro-controller programing
这是许多外部资源推荐使用的补充。也许我的原始信息不清楚,或者我的情况与这些不同。
【问题讨论】:
-
你希望
volatile应该做什么? -
您只需要 volatile 在写入和读取诸如 pin 之类的东西和其他被认为有副作用的东西时使用。
-
扩展这个“正确处理中断”的概念。我不认为
volatile做你认为它做的事,或者如果它做了,你将成为 SOL -
实际上,C++ 在嵌入式系统中变得越来越流行。见embedded.com/design/programming-languages-and-tools/4438660/…
-
请非常小心
volatile。大多数人不明白它实际上做了什么,它做了什么很少是他们想要的。几乎在所有情况下,使用volatile都是一个错误,而您实际上还想使用其他东西。最重要的是;volatileNot 是否意味着“线程安全”。它还将有效地禁用您的编译器优化器。另见:git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/…、en.cppreference.com/w/cpp/language/cv
标签: c++ arduino interrupt volatile c++-standard-library