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
'VisualStudio.C++.C# > C . C++' 카테고리의 다른 글
std::shared_mutex . 멀티 스레드 읽기 쓰기 락 (0) | 2024.09.12 |
---|---|
C/C++ . 부호 있는 정수 singed int . 음수 표현 규격 . 2's complement (0) | 2023.08.27 |
C++ template (템플릿), 변수, 함수, 클래스 템플릿. 제네릭 타입. (0) | 2020.09.15 |
C/C++. 실수 , 올림 내림 반올림 , ceil floor round (0) | 2020.05.26 |
C++. std::map . 키-값 컬렉션 (0) | 2020.04.01 |
댓글