c 언어volatile 키워드 단편기에서의 역할
1924 단어 지식점
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
*ptr의 값이 예상치 못하게 변할 수 있기 때문에 (예를 들어 어떤 레지스터) a와 b는 다를 수 있습니다.결과적으로, 이 코드는 당신이 원하는 제곱값이 아닐 수도 있습니다.올바른 코드는 다음과 같습니다.
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a; }
volatile의 본뜻은'변하기 쉽다'는 것이다
액세스 레지스터의 속도가 RAM보다 빠르기 때문에 컴파일러는 일반적으로 외부 RAM에 대한 접근을 줄이는 최적화를 한다.예를 들면 다음과 같습니다.
static int i=0;
int main(void)
{
...
while (1)
{
if (i) dosomething();
}
}
/* Interrupt service routine. */
void ISR_2(void)
{
i=1;
}
프로그램의 본뜻은 ISR2 인터럽트 발생 시,main에서dosomething 함수를 호출하지만, 컴파일러는main 함수에서 i를 수정한 적이 없다고 판단하기 때문에
i에서 어떤 레지스터에 대한 읽기 동작을 한 번만 수행할 수 있으며, 매번if판단이 이 레지스터 안의 'i 던전' 만 사용해서dosomething이 영원히 호출되지 않을 수도 있습니다.변수에volatile 수식을 더하면 컴파일러는 이 변수의 읽기와 쓰기 작업이 최적화되지 않을 것을 보장합니다. (틀림없이 실행될 것입니다.)이 예에서 i도 반드시 이렇게 설명해야 한다.
일반적으로volatile은 다음과 같은 몇 가지 곳에 사용된다.
1. 서비스 프로그램에서 수정된 다른 프로그램이 감지할 수 있는 변수는volatile를 추가해야 한다.2. 다중 임무 환경에서 각 임무 간에 공유하는 표지는volatile을 넣어야 한다.3. 메모리에 비치는 하드웨어 레지스터도volatile 설명을 넣어야 한다. 왜냐하면 매번 그것에 대한 읽기와 쓰기는 서로 다른 의미가 있을 수 있기 때문이다.
본문http://www.jb51.net/article/37489.htm