2016. 7. 11. 15:25 devel/etc

volatile 극혐

이라고만 배웠는데 실제 volatile 키워드의 필요성을 느껴서 글로 남긴다


linux의 c에서는 못 느껴본 일이다

하지만 펌웨어 세상으로 오면 조금 다른거 같다



전역 변수

int state;


루프문

while(state == 0);


인터럽트 핸들러

extern int state;

state = 1;


이렇게 해놓고 돌렸는데 웬걸

인터럽트 핸들러가 정상적으로 실행되어 state 값이 변했음에도 불구하고

while문을 빠져나갈 생각을 하지 않는 것이었다


고민 좀 많이 하다가 든 생각이 바로 while문 안에서 암껏도 안해서 얘가 while(TRUE)로 최적화를 시켜버렸나보다

하는 생각이 들었다



-> 수정


volatile int state

extern volatile int state

로 바꾸니까 정상적으로 수행된다



volatile 을 쓸 일이 없으니까 이런 일도 겪는구나

좋은 링크가 있어 참고차 남긴다

https://salkuma.wordpress.com/2010/06/13/register-volatile-keyword/





기타

심심해서 더 테스트 좀 해봤다

인터럽트 핸들러 없애버리고 루프문에 의미없는 코드를 넣어보았다


전역변수

int state


루프문

int i;

while(state == 0){

i++;

}


실행하니까 당연한걸까 의미없는 구문으로 판단하고 루프문 자체를 없애버렸다 ㅋㅋ


Posted by 쵸코케키

블로그 이미지
chocokeki
쵸코케키

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

최근에 올라온 글

최근에 달린 댓글

글 보관함