VisualStudio.C++.C#/C . C++
C/C++ . volatile 변수
i.got.it
2023. 3. 10. 21:36
volatile 변수 선언 형식.
volatile uint8_t ui8_v; // 변수 ui8_v 가 volatile 이 됨. uint8_t volatile ui8_v 로 해도 동일하나 일관되게 volatile 을 가장먼저 기록해
volatile uint8_t * pui8_v; // 포인터 변수 pui8_v 의 대상이 volatile 이 됨.
uint8_t * volatile pui8_v; // 포인터 변수 pui8_v 자체가 volatile 이 됨.
volatile uint8_t * volatile pui8_v; // 포인터 변수 pui8_v 자체와 pui8_v의 대상 모두 volatile 이 됨.
volatile 변수 선언 의미
- volatile 로 선언된 변수들은 컴파일러가 최적화 하지 않는다. 코드에서 지정한 형태 그대로 실행된다.
필수 volatile 변수 선언 해야 하는 상황
- 임베디드 시스템 코드 작성시 volatile 변수 사용해야 하는 경우 필수 발생한다.
상황예1
MCU 의 Peripheral 들(카운터, ADC 등의 MCU 내장 하드웨어들) 이 직접 데이터를 기록하고 있는 메모리가 있고 내 코드에서 해당 메모리의 값을 읽기 하든지 혹은 기록하려는 경우.
예. 0xFFEE 라는 주소에 MCU 내장 하드웨어가 uint32_t 형의 값을 기록하는 곳이라 하자. 내 코드에서 이 메모리 주소의 값을 읽기 처리 하려고 할 때 아래와 같이 volatile 선언 추가하여 컴파일러가 최적화 하지 않도록 해둔다. 해당 메모리 접근할 때 마다 매번 실제 지정한 메모리에 접근하면서 처리함이 보장된다.
#define my_peripheral_data *(volatile uint32_t*)0xFFEE
void my_function_read()
{
while(1){
if(my_peripheral_data == 31) break;
}
}
상황예2.
인터럽트 핸들러 함수 와 다른 곳에서 동시 참조하는 전역변수.
volatile uint8_t Flag_IntRx = 0;
void main()
{
while(Flag_IntRx == 0) {
}
}
void Interrupt_Handler()
{
Flag_IntRx = 1;
}
첫 등록 : 2023.03.10
최종 수정 :
단축 주소 : https://igotit.tistory.com/4277