본문 바로가기
공부,일/c언어

volatile

by fromnothing1 2021. 7. 16.

volatile 변수 

- 목적

1. 컴파일러가 코드를 최적화 하는 것을 방지 하겠다 .

 

예를 들어서 

#include<stdio.h>

int main()
{

    int i = 0;

    while (i < 10)
        i++;

    printf("%d\n", i);    // 10
}

 

위의 코드를 실행한다면 사실 컴파일러는 fro 문을 돌지 않고 i = 10을 대입해 버린다. 

(참고로 release 모드로 실행해야한다.)

 

디스 어셈블리를 보면 push 0Ah 를 볼 수있다. A 는 10진수로 10 이기 때문에 while 문을 안돌고 그냥 바로 i = 10 을 대입한다는 것을 알 수 있다. 

 

#include<stdio.h>

int main()
{

    volatile int i = 0;

    while (i < 10)
        i++;

    printf("%d\n", i);    // 10
}

 

volatile 변수로 i 를 선언 했을 때는 while 문이 실행 되는 것을 알 수 있다 .

 

2. 메모리 직접 접근만 허용하겠다 

*((volatile unsigned int *)0xFFFFF410) = 1; 와 같이 특정 주소 값에 1 을 대입한다면 

캐쉬 메모리 같은 중간 단계에 값을 대입해놓지 말고 직접 접근 하라는 뜻이다. 

만약  0xFFFFF410주소에 대입된 1 값을 컴파일러가 최적화를 위해서 캐쉬메모리 같은 곳에다 넣어 놓고 사용 한다면 

0xFFFFF410 주소에 는 1 값이 들어 가지 않는다. 

 

펌웨어에서는 특정 레지스터에 직접적으로 값을 써넣어야 할 필요가 있기 때문에 캐쉬 메모리에 값을 넣어 놓는등의 짓을 하면 원하는 동작을 하지 못한다. 때문에 이럴 때는 항상 volatile 변수를 사용해야 한다. 

 

출처:

https://zapiro.tistory.com/entry/volatile-%EB%B3%80%EC%88%98%EC%9D%98-%EC%93%B0%EC%9E%84

 

 

volatile 변수의 쓰임

volatile 키워드는 한 마디로 얘기하면 컴파일러가 메모리 접근을 최소화 시키는 최적화를 하지 못하게 막는 예약어이다.  의미없는 반복문 같은 경우는 컴파일러에 따라서 캐쉬 메모리를 이용

zapiro.tistory.com

 

 

'공부,일 > c언어' 카테고리의 다른 글

#pragma 사용법  (0) 2021.10.10
random stack address 옵션 끄기  (0) 2021.09.01
저수준 파일 입출력  (0) 2021.06.29
우분투에서 c 언어 사용하기( gcc)  (0) 2021.06.28
도스박스 및 터보시 설치  (0) 2021.06.18

댓글