구조체를 업데이트하고 인터럽트를 비활성화하는 함수가 있습니다.휘발성이 필요합니까?
bool readBuffer()
{
__disable_irq();
rb->reader += 1; // Just an example
__enable_irq();
return true;
}
인터럽트가 비활성화되어 있기 때문에 구조의 값을 업데이트하는 동안 다른 인터럽트가 우선 적용되지 않습니다.
하지만 독자 변수를 volatile
으로 표시해야합니까? 이론적으로 다른 인터럽트는 함수에 들어가는 동안 선제 할 수 있기 때문에 실제로는 __disable_irq()
전에 호출됩니다. 그리고 내 함수가 다시 시작될 때 rb->reader
의 캐시 된 값이 올바르지 않습니다. 또는 컴파일러 (GCC)가 해당 라인이 실제로 적중 될 때까지 rb->reader
을 캐시하지 않는 코드를 생성합니까?
Linus Torvalds가 작성한 [volatile consider harmful] (http://www.kernel.org/doc/Documentation/volatile-considered-harmful.txt)을 참조하십시오. '__disable_irq()'는 암시적인 메모리 장벽으로 작용합니까? 그렇다면, 당신은'휘발성 '이 필요없고 그것을 사용하면 다칠뿐입니다. – Celada