일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- FTL
- 시스템 프로그래밍
- performance
- github
- Operating System
- Flash Memory
- Cache
- 포트 번호 변경
- rocksdb
- storage system
- software
- core dumped
- 키워드
- Git
- 시스템 소프트웨어
- deep learning
- kernel
- Intel
- USENIX
- Samsung
- 커널 프로그래밍
- hardware
- Machine Learning
- ssd
- memory
- overflow
- framework
- linux
- Today
- Total
Happy to visit my research note ^^
MCU programming에서 volatile keyword 본문
MCU programming에서는 register를 제어하기 위해서 같은 주소에 값을 여러번 쓰는 경우가 많고, 이 경우 code 앞을 보면 volatile keyword가 붙어있는 것을 확인할 수 있다.
변수를 선언할 때 volatile이 붙으면 compiler는 해당 변수를 최적화에서 제외하여 항상 memory에 접근하도록 한다.
즉, volatile 변수를 참조할 경우 register에 load된 값을 사용하지 않고 매번 memory를 참조한다.
# Syntax
volatile [type] [variable_name];
*(unsigned int *)0x8C0F = 0x8001;
*(unsigned int *)0x8C0F = 0x8002;
*(unsigned int *)0x8C0F = 0x8003;
*(unsigned int *)0x8C0F = 0x8004;
*(unsigned int *)0x8C0F = 0x8005;
위 코드를 보면 5번의 memory write이 같은 주소인 0x8C0F에 이루어진다.
최종적으로는 0x8C0F에 0x8005 값만 남을 것이다.
이 경우 compiler는 최적화를 위해 이전의 코드를 실행하지 않고 맨 마지막 코드만 실행시키는데, 일반적으로 이 최적화를 통해서 performance 적으로 이점을 보게된다.
하지만 이 코드가 memory address에 연결된 hardware register에 값을 쓰는 program이라면 문제가 발생한다.
각각의 쓰기가 hardware에 특정 명령을 전달하는 것이므로, 주소가 같다는 이유만으로 중복되는 쓰기 명령을 없애 버리면 hardware가 오작동하게 된다. 이런 경우 유용하게 사용할 수 있는 keyword가 volatile이다.
변수를 volatile 타입으로 지정하면 앞서 설명한 최적화를 수행하지 않고 모든 memory write를 지정한 대로 수행한다.
또한, 특정 memory address에서 hardware register 값을 읽어오는 program의 경우도 마찬가지다.
void a(char *buf, int size) {
int i;
volatile char *p = (volatile char *)0x8C0F;
for(i=0; i<size; i++){
buf[i] = *p;
...
}
}
위 코드에서 같은 주소에 반복적으로 메모리를 읽으므로, 최적화 후에는
buf[i] = *p; 에서 마지막 한 번만 읽어온 후에 그 값을 반복해서 사용한다.
volatile keyword가 있는 경우 *p를 참조할 때마다 직접 메모리에서 새 값을 가져온다.
volatile keyword는
(1) MIMO (Memory-mapped I/O)
(2) Interrupt Service Routine의 사용
(3) multi-thread 환경
에서 자주 사용 된다.
프로그램의 수행 흐름과 상관없이 외부 요인이 변수 값을 변경할 수 있다는 점이 위 3가지의 공통점이다.
interrupt service routine이나 multi thread program의 경우, 일반적으로 stack에 할당하는 지역 변수는 공유하지 않으므로, 서로 공유되는 전역 변수의 경우에만 필요에 따라 volatile을 사용하면 된다.
즉, "volatile" keyword는 MCU programming에서 hardware와의 상호작용에서 중요한 데이터의 무시를 방지하며 코드의 안정성과 예측성을 향상시키는 데 도움을 준다. 이러한 이유로 MCU programming에서 "volatile" keyword는 중요한 역할을 한다.