있어 명확하게 문서화 된 글로벌 데이터가 ISR 및 메인 프로그램과 공유 될 때, 데이터 요구가 선언 할 것을 volatile
보증 메모리 가시성하기 위해 (그리고 그것은 단지 1 바이트 데이터에 충분하다; 아무것도 더 큰 요구도 보장 자성 특별한 조치를) . 여기 좋은 규칙이 있습니다.
- ISR 외부에서만 사용되는 변수는 변동성이 없어야합니다.
- ISR 내부에서만 사용되는 변수는 변동성이 없어야합니다.
- ISR 내부 및 외부에서 사용되는 변수는 변동성이 있어야합니다.
그러나 volatile
변수가> 1 ISR에서 액세스되지만 ISR 외부에서 공유되지 않는 경우에 필요합니까? 예를 들어 static
변수를 사용하여 내부 상태를 유지하는 함수가 있습니다 .
void func() {
static volatile long counter; // volatile or not?
// Do stuff with counter etc.
}
이 함수는 핀 인터럽트와 TimerOne 라이브러리 에서 두 가지 방법으로 호출됩니다 .
attachInterrupt(0, func, CHANGE);
Timer1.attachInterrupt(func);
ISR이 입력되면 인터럽트가 자동으로 비활성화 되므로 원 자성 문제는 없습니다 . 그러나 이것은 volatile
캐시 된 문제와 그렇지 않은 문제에 대한 컴파일러 문제입니다.
물론 미안보다 안전합니다.
volatile
생성 될 코드 이외의 다른 것으로 수정 되지 않으므로 변수가 필요하지 않습니다 . 컴파일러는 인터럽트가 중첩되지 않는 한 ISR이 선형으로 실행된다고 가정 할 수 있습니다. 말이 되네요 감사!