Нужна ли переменная для переменной, которая читается и записывается в главном цикле, но доступна только для чтения в ISR?
volatile
- это не проблема здесь, а страховка main
записи цикла не разбиваются на части.
Любые изменения в main()
без защиты от вызова ISR могут привести к проблемам, volatile
или нет.Объявление его volatile
не сохраняет код от этой проблемы.
volatile some_type obj;
void ISR() {
foo(obj);
}
int main() {
for (;;) {
// volatile useful here to prevent the assignment from being optimized away.
some_type tmp = bar();
// protect from potential interruption need here.
// Without protection, ISR(),
// doesn't know it is working with a completely written `obj`
obj = tmp;
// release from potential interruption
}
volatile
полезно в обоих направлениях, чтобы main()
знал, что ISR()
мог измениться obj
, а для main()
не оптимизировать выездные назначения.
Тем не менее, поскольку ISR()
не изменяется obj
, поэтому volatile
не требуется.
Объявление obj
atomic
может помочь - но это другой вопрос.