본문 바로가기
VisualStudio.C++.C#/C . C++

C/C++ . volatile 변수

by i.got.it 2023. 3. 10.

 

 

 

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

 


 

댓글



 

비트코인




암호화폐       외환/나스닥/골드         암호화폐/외환/나스닥/골드
     
현물 |선물 인버스 |선물 USDT       전략매니저(카피트레이딩)         프랍 트레이더 온라인 지원가능. MT4,MT5