C 의 volatile 사용 방법

3719 단어 volatile
volatile 은 컴 파일 러 컴 파일 결과 에 영향 을 주 었 습 니 다.volatile 변 수 는 수시로 변화 가 발생 할 수 있 습 니 다.volatile 변수 와 관련 된 연산 은 컴 파일 최적화 하지 마 십시오.오류 가 발생 하지 않도록(VC++release 버 전 실행 가능 코드 가 발생 할 때)
컴 파일 최적화,volatile 키워드 의 변수 와 관련 된 연산 을 진행 하여 컴 파일 최적화 하지 않 습 니 다.)
예 를 들 면:

volatile int i=10;
int j = i;
...
int k = i;
volatile 은 컴 파일 러 i 에 게 수시로 변화 가 발생 할 수 있다 고 알려 주 었 다.이 를 사용 할 때마다 i 의 주소 에서 읽 어야 하기 때문에 컴 파일 러 가 생 성 한 실행 가능 코드 는 i 의 주소 에서 데 이 터 를 읽 어 k 에 두 었 다.최적화 방법 은 컴 파일 러 때문이다.
i 에서 데 이 터 를 읽 은 코드 사이 의 코드 가 i 를 조작 하지 않 은 것 을 발견 하면 마지막 으로 읽 은 데 이 터 를 k 에 자동 으로 넣 습 니 다.i 에서 다시 읽 는 게 아니 라이렇게 되면 i 가 레지스터 변수 이거 나 포트 데 이 터 를 표시 하면
오류 가 발생 하기 쉬 우 므 로 volatile 은 특수 주소 에 대한 안정 적 인 접근 을 보장 할 수 있 고 오류 가 발생 하지 않 습 니 다.
/**********************
volatile 로 정 의 된 변 수 는 이 변수 가 예상 치 못 하 게 변 할 수 있다 는 것 이다.그러면 컴 파일 러 는 이 변수의 값 을 가정 하지 않 을 것 이다.정확히 말 하면 최적화 기 는 이 변 수 를 사용 할 때 매번 조심스럽게 다시 읽 어야 한 다 는 것 이다.
이 변수의 값 은 레지스터 에 저 장 된 백업 을 사용 하 는 것 이 아 닙 니 다.다음은 volatile 변수의 몇 가지 예 입 니 다.
1)병렬 장치 의 하드웨어 레지스터(예:상태 레지스터)
2)인 터 럽 트 서비스 서브루틴 에서 접근 할 수 있 는 비 자동 변수(Non-automatic variables)
3)다 중 스 레 드 애플 리 케 이 션 에서 몇 가지 작업 에 공 유 된 변 수 는 이 질문 에 대답 하지 못 하 는 사람 은 고용 되 지 않 는 다.
나 는 이것 이 C 프로그래머 와 내장 시스템 프로그래머 를 구분 하 는 가장 기본 적 인 문제 라 고 생각한다.끼 워 넣 는 녀석 들 은 하드웨어,중단,RTOS 등 과 자주 접촉 하 는데,이 모든 것들 은 volatile 변 수 를 사용 해 야 한다.volatile 의 내용 을 몰라요.
재앙 을 가 져 올 것 이다.만약 에 면접 자가 이것 이 문제 라 고 정확하게 대답 했다 고 가정 하면(응,그 럴 수 있 을 지 의 심 스 러 워)나 는 이 녀석 이 volatile 의 완전한 중요성 을 똑바로 알 고 있 는 지 좀 더 깊이 연구 해 볼 것 이다.
1)하나의 매개 변 수 는 const 일 수도 있 고 volatile 일 수도 있 습 니까?왜?
2); 바늘 하나 가 volatile 일 수 있 나 요?왜?
3); 다음 함수 에 무슨 오류 가 있 습 니까?

int square(volatile int *ptr)

 {
    return *ptr * *ptr;
}

다음은 답 이다.
1)네.하나의 예 는 읽 기 전용 상태 레지스터 입 니 다.그것 은 volatile 이다.왜냐하면 그것 은 예상 치 못 하 게 변 할 수 있 기 때문이다.프로그램 이 수정 을 시도 해 서 는 안 되 기 때문에 const 입 니 다.
2); 예.흔 치 않 지만.하나의 예 는 서비스 서브루틴 이 buffer 를 가리 키 는 지침 을 고 칠 때 입 니 다.
3)이 코드 는 좀 변태 적 이다.이 코드 의 목적 은 포인터*ptr 지향 값 의 제곱 을 되 돌려 주 는 것 입 니 다.그러나*ptr 가 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;
 }
비트 조작(Bit manipulation)
//*********************
삽입 식 프로 그래 밍 에서 volatile 이라는 키 워드 를 자주 사용 하 는데 인터넷 에서 그의 용법 을 찾 아 보면 다음 과 같은 두 가지 로 요약 할 수 있다.
1.copiler 에 게 어떠한 최적화 도 할 수 없다 고 알려 줍 니 다.
 예 를 들 어 특정한 주소 로 두 가지 명령 을 보 내야 한다.  

int *ip =...; //    

*ip = 1; //    

*ip = 2; //

이상 의 프로그램 컴 파 일 러 는 최적화 할 수 있 습 니 다. 
int *ip = ...;  
*ip = 2;  
결국 첫 번 째 지령 을 잃 어 버 렸 다.
volatile 을 사용 하면 copiler 는 어떠한 최적화 도 허용 하지 않 고 프로그램의 원래 뜻 을 보증 합 니 다. 
volatile int *ip = ...;  
*ip = 1;    *ip = 2;  
컴 파 일 러 를 최적화 시 키 더 라 도 두 번 의 지불 문 구 를 하나 로 만 들 지 는 않 을 것 이다.그것 은 다른 최적화 만 할 수 있다.이것 은 device driver 프로그래머 에 게 매우 유용 하 다.
2:volatile 로 정 의 된 변 수 는 프로그램 밖에서 변 경 됩 니 다.매번 메모리 에서 읽 어야 합 니 다.그 를 cache 나 레지스터 에 두 고 중복 사용 할 수 없습니다.
...와 같다  

volatile char a;          

a=0;       

while(!a)

{ //do some things;  }       

doother();

volatile 이 없 으 면        doother()는 실행 되 지 않 습 니 다.

좋은 웹페이지 즐겨찾기