나는 다음과 같은 C 코드가 있다고 가정 : 이제C : "게터"기능과 중단 정적 휘발성를 사용
/* clock.c */
#include "clock.h"
static volatile uint32_t clock_ticks;
uint32_t get_clock_ticks(void)
{
return clock_ticks;
}
void clock_tick(void)
{
clock_ticks++;
}
내가 clock_tick
를 호출 오전 :에서 get_clock_ticks()
를 호출하는 동안, 중단 내에서 (즉 clock_ticks
변수를 증가) main()
기능 (예 : 중단 외부).
나의 이해는 clock_ticks
는 달리 컴파일러가 액세스를 최적화 할 수 volatile
로 선언하고 (실제로 중단 변경하면서) main()
이 값이 변경되지 않은 생각하게해야한다는 것입니다. 실제로는 volatile로 선언되지 않은 경우에도 메모리에서 변수를로드하도록 컴파일러에 강제로 직접 main()
(즉 : static
로 선언하지)를 형성하는 대신 변수를 액세스, 거기 get_clock_ticks(void)
기능을 사용하는 경우
이 궁금하다.
누군가가이 일이 일어날 수 있다고 말하면서 나는 이것을 궁금해합니다. 사실입니까? 어떤 조건 하에서? 어쨌든 "getter"기능을 사용하면 항상 volatile
을 사용해야합니까?
귀하의 경우에는 '휘발성'이 필수적입니다. 변수가 인터럽트에서 액세스 될 때 차이를 만들고 있습니다. 이 방법은 컴파일러가 알지 못하는 변수를 액세스하고 수정하는 것이 있다는 것을 알고 있습니다. 그렇지 않으면 "getter"가 변수의 상수 초기 값을 반환합니다. –
https://stackoverflow.com/questions/5822386/the-volatile-keyword-in-c-language –
getter 함수가 인라인 될 수 있습니다. 비 일관성 동작으로 나타날 수있는 캐시 일관성 문제가있을 수 있습니다. – jxh