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++;
}
실행하니까 당연한걸까 의미없는 구문으로 판단하고 루프문 자체를 없애버렸다 ㅋㅋ
'devel > etc' 카테고리의 다른 글
linux 1초 부팅 수정 방법 (0) | 2016.09.07 |
---|---|
연산자 우선순위 헷갈리기 쉬운 예제 (0) | 2016.08.11 |
바이너리 파일을 C 헤더 파일로 만들기 (0) | 2016.07.11 |
/proc/config.gz 활성화 안될 때 (0) | 2016.04.22 |
bash 쉘 오른쪽에 시간 표시하기 (0) | 2016.04.22 |