c 언어volatile 키워드 단편기에서의 역할

1924 단어 지식점
volatile의 뜻은'잃기 쉽고 바꾸기 쉽다'는 것이다.이 한정어의 의미는 컴파일러에게 변수의 내용이 다른 프로그램의 수정으로 인해 바뀔 수 있음을 가리키는 것이다.보통 프로그램에서 변수를 설명할 때, 컴파일러는 ebx와 같은 일반적인 레지스터에 최대한 저장합니다.CPU가 ebx에 값을 넣으면 메모리에 대응하는 값에 더 이상 관심이 없습니다.만약 이 때 다른 프로그램 (예를 들어 내장 프로그램이나 인터럽트) 이 메모리의 값을 수정한다면, ebx의 값은 업데이트되지 않을 것입니다.이러한 상황을 해결하기 위해volatile 한정어를 만들었습니다. 코드가 이 변수를 인용할 때 반드시 지정한 위치에서 그 값을 얻어야 합니다.
 
   
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

좋은 웹페이지 즐겨찾기