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 |
댓글