-
카테고리
-
세부 분야
임베디드 · IoT
-
해결 여부
미해결
인터럽트안에서 변수처리
20.01.21 21:49 작성 조회수 392
1
18분 즈음에 cnt 변수 선언할 때 static 변수는 volatile 같은 키워드는 생략해도 될까요?? 대부분 volatile은 생략하는데 왜 그러신거죠??
답변을 작성해보세요.
1
ChrisP
지식공유자2020.01.22
지역변수의 경우엔 큰 문제가 되지 않는것 같습니다.
더 확실하게 확인하시려면 컴파일러 최적화 옵션에 따른 기계어 번역 결과를 보셔야 하는데 어셈블리어를 이해하기는 쉽지 않을 겁니다. 사실 저 역시도 어셈블리어를 보면서 분석하진 않습니다.
volatile을 붙이면 아무래도 덜 위험하지 않을까 싶긴 합니다.
한번 volatile을 붙여서 해보세요!
1
1
ChrisP
지식공유자2020.01.21
함수 내에서 선언된 지역변수의 경우는 volatile을 생략해도 괜찮을 겁니다.
문제는 전역변수인데 그 값이 인터럽트 함수 내에서 변하는 경우입니다.
그 경우 컴파일러가 최적화 옵션에 따라서 그 변수의 값을 임의로 바꾸지 않는 경우가 있습니다 (코드상으로는 바꾸도록 잘 작성했는데도 말이죠)
그래서 그런 전역변수의 경우 앞에 volatile 키워드를 붙여서 컴파일러가 임의로 최적화 시키는걸 방지합니다.
최적화 옵션이 -0(none)으로 되어있으면 큰 문제없이 잘 동작하는데 그 외의 경우 이상하게 동작하는 경우는 변수 앞에 volatile을 붙여주시면 됩니다.
사실 인터럽트 안에서 값이 변하는 모든 지역변수 앞에 volatile을 붙여주는 편이 안전하겠지요.
답변 3