SIRINI`s Blog

life, saying, developing, . . . and so on #10th anniversary

volatile 키워드, 그리고 HW 제어

오랫만에 블로그에 글을 씁니다. 오늘은 간단히, 일 하다가 문득 생각난 부분을 정리해 두려고 짧게 기록합니다.

volatile 이라는 C/C++ 키워드가 있습니다. 명확한 동작 규격이 표준으로 확립되진 않은 거 같은데, HW 제어할 일이 있을 때는 이 키워드 만큼 중요한 게 없다가도 순수 SW 영역에서 C/C++ 코딩을 할 때는 이 키워드 만큼 잘 안쓰는 키워드가 있을까 싶기도 합니다. 

volatile 이라고 선언하면 컴파일러가 최적화를 하지 않는데, 어셈블리 코드 재배치나 중복 코드 최적화 등의 기법을 막는 역할을 합니다. 이게 순수 SW 영역에서는 참 이상한 기능인데 HW 레지스터를 조작할 때는 없어서는 안되는 거기도 합니다. 가령 주기적으로 HW 에서 특정 레지스터에 값을 업데이트 하는 경우, 코드 단에서 일정한 딜레이를 두고 값을 읽어 온다고 가정하면 어차피 한 번 읽어둔 값이기 때문에 컴파일러가 최적화를 하면서 값을 갱신하지 않을 수 있습니다. 

여기서 문제는 사실은 값이 바뀌었는데 안 바뀐 걸로 인식될 수도 있고, 아닐 수도 있다는 겁니다. 컴파일러 입장에서야 메모리에서 값을 읽어 오는 것보다 아까 읽어서 CPU 레지스터에 저장해 두었으니 거기서 읽어 오는 게 더 맞는 거고 그래서 그렇게 하는 것인데, 그렇게 되면 HW 가 업데이트 한 값이랑 맞지 않으니 문제가 생길 수 있습니다.

이러한 문제를 해결하기 위한 키워드가 바로 volatile 입니다. FW 코드를 보면 *(volatile int *)0x1234 = 0x5678; 과 같은 형태를 볼 수 있는데 0x1234 레지스터에 0x5678 값을 쓰는 겁니다. 최적화를 피함으로서 HW 제어를 보다 완전하게 하는 어찌보면 필수 요소 같은 키워드 입니다.

너무 간만에 이 키워드를 만나서 일까요, 회사에서는 적극적으로 Python 을 밀고 있는데 한 편으로는 C 로 다시 회귀하고 싶은 마음도 있네요. ㅎㅎㅎ
Tag: volatile,C,FW,HW,제어, Date: 2017-04-13 0 Responses

Leave a comment here!

a02e
비밀번호를 입력해 주세요
이름을 입력해 주세요