Volatile ν€μλ
C μΈμ΄μμ volatile ν€μλλ μλ² λλ μννΈμ¨μ΄ κ°λ°μμ μ€μν μν μ νλ€. μ΄ ν€μλλ λ³μκ° μ΅μ ν κ³Όμ μμ μ»΄νμΌλ¬μ μν΄ μμ λμ§ μλλ‘ λ³΄μ₯νλ©°, νλ‘κ·Έλ¨μ μ€ν λμ€μ λ³μμ κ°μ΄ μμμΉ λͺ»νκ² λ³κ²½λ μ μλ€λ κ²μ μ»΄νμΌλ¬μ μλ¦°λ€. μ΄λ¬ν λ³κ²½μ μΈλΆ μ΄λ²€νΈλ νλμ¨μ΄ λ±μ μν΄ λ°μν μ μλ€.
C μΈμ΄μμ volatile ν€μλλ μλ² λλ μννΈμ¨μ΄ κ°λ°μμ μ€μν μν μ νλ€. μ΄ ν€μλλ λ³μκ° μ΅μ ν κ³Όμ μμ μ»΄νμΌλ¬μ μν΄ μμ λμ§ μλλ‘ λ³΄μ₯νλ©°, νλ‘κ·Έλ¨μ μ€ν λμ€μ λ³μμ κ°μ΄ μμμΉ λͺ»νκ² λ³κ²½λ μ μλ€λ κ²μ μ»΄νμΌλ¬μ μλ¦°λ€. μ΄λ¬ν λ³κ²½μ μΈλΆ μ΄λ²€νΈλ νλμ¨μ΄ λ±μ μν΄ λ°μν μ μλ€.
π 1. volatileμ μ€μμ±
- λ©λͺ¨λ¦¬ 맡νλ μ μΆλ ₯: μλ² λλ μμ€ν μμλ νλμ¨μ΄ μ₯μΉλ₯Ό λ©λͺ¨λ¦¬ μ£Όμμ 맀ννμ¬ μ μ΄νλ κ²½μ°κ° λ§λ€. volatileμ μ΄λ¬ν λ©λͺ¨λ¦¬ μ£Όμμ μμΉν λ°μ΄ν°κ° μΈμ λ μ§ λ³κ²½λ μ μμμ λνλ΄λ―λ‘, μ»΄νμΌλ¬κ° ν΄λΉ λ³μμ λν μ κ·Όμ μ΅μ ννμ§ μλλ‘ νλ€.
- μΈν°λ½νΈ μλΉμ€ 루ν΄: μΈν°λ½νΈ μλΉμ€ 루ν΄(ISR)μμ μ¬μ©λλ λ³μλ μΈν°λ½νΈμ μν΄ μΈμ λ μ§ λ³κ²½λ μ μλ€. μ΄λ° λ³μλ€μ volatileλ‘ μ μΈν¨μΌλ‘μ¨, μ»΄νμΌλ¬λ μ΄ λ³μλ€μ μΊμ±νμ§ μκ³ νμ λ©λͺ¨λ¦¬μμ μ§μ μ½κ±°λ μ°λλ‘ μ²λ¦¬νλ€.
- λ©ν° μ€λ λ©: μ¬λ¬ μ€λ λλ νλ‘μΈμ€κ° λμΌν λ³μλ₯Ό 곡μ ν λ, ν μ€λ λμμμ λ³κ²½μ΄ λ€λ₯Έ μ€λ λμ μ¦μ 보μ΄λλ‘ νκΈ° μν΄ volatileμ μ¬μ©ν μ μλ€. κ·Έλ¬λ, volatileμ λμμ±μ μμ ν κ΄λ¦¬νμ§λ λͺ»νλ―λ‘ μΌλ°μ μΌλ‘λ λ½μ΄λ λ€λ₯Έ λκΈ°ν λ©μ»€λμ¦κ³Ό ν¨κ» μ¬μ©ν΄μΌ νλ€.
π 2. μ½λ
λ€μμ volatile ν€μλκ° μ¬μ©λ C μ½λμ μμ μ΄λ€.
μ΄ μ½λμμ flag λ³μλ μΈλΆ μ΄λ²€νΈ(κ°μ λ μΈν°λ½νΈ)μ μν΄ μΈμ λ μ§ λ³κ²½λ μ μμΌλ―λ‘ volatileλ‘ μ μΈλμ΄ μλ€. μ΄λ μ»΄νμΌλ¬μκ² flag λ³μμ κ°μ μΊμνμ§ λ§κ³ λ§€λ² λ©λͺ¨λ¦¬μμ μ§μ μ½μ΄μΌ ν¨μ μλ¦°λ€.
#include <stdio.h>
// κ°μ : μΈλΆ νλμ¨μ΄ μ΄λ²€νΈμ μν΄ λ³κ²½λ μ μλ λ³μ
volatile int flag = 0;
// μΈν°λ½νΈ μλΉμ€ 루ν΄μ΄λΌκ³ κ°μ
void interrupt_handler() {
flag = 1; // μΈν°λ½νΈ λ°μ μ flagλ₯Ό 1λ‘ μ€μ
}
int main() {
while (flag == 0) {
// flag κ°μ΄ λ³κ²½λ λκΉμ§ κΈ°λ€λ¦Ό
}
printf("Flag was set!\n");
return 0;
}
λ§μ½ μ½λμμ flag λ³μλ₯Ό volatileλ‘ μ μΈνμ§ μλλ€λ©΄, μ»΄νμΌλ¬κ° μ΅μ ν κ³Όμ μμ μ΄ λ³μμ μ¬μ© λ°©μμ μλͺ» ν΄μν μ μλ€. μ»΄νμΌλ¬λ μ½λλ₯Ό μ΅μ νν λ λ³μ κ°μ΄ λ³κ²½λμ§ μμ κ²μΌλ‘ μμΈ‘νμ¬, λ©λͺ¨λ¦¬μμ λ§€λ² λ³μλ₯Ό μ½μ§ μκ³ λμ λ μ§μ€ν°μ κ°μ μ μ₯ν μ μλ€. μ΄ κ²½μ°, flag λ³μμ κ°μ΄ μΈλΆ μ΄λ²€νΈ(μλ₯Ό λ€μ΄, μΈν°λ½νΈ)μ μν΄ λ³κ²½λμμμλ λΆκ΅¬νκ³ , λ©μΈ ν¨μμ while 루νλ λ μ§μ€ν°μ μ μ₯λ ꡬμ κ°μ μμ‘΄νμ¬ κ³μν΄μ 무ν 루νμ λΉ μ§ μ μλ€.
μ΄λ νλ‘κ·Έλ¨μ΄ flag λ³μμ λ³νλ₯Ό κ°μ§νμ§ λͺ»νκ³ , while 루νμμ νμΆνμ§ λͺ»νλ μν©μΌλ‘ μ΄μ΄μ§ μ μλ€. κ²°κ³Όμ μΌλ‘ νλ‘κ·Έλ¨μ΄ "hang"λκ±°λ μμμΉ λͺ»ν λμμ ν μ μλ€.
π 3. μ£Όμμ¬ν
- λΆνμν μ¬μ©: volatileμ νμν κ³³μλ§ μ¬μ©ν΄μΌ νλ€. λΆνμνκ² μ¬μ©νλ©΄ νλ‘κ·Έλ¨μ μ±λ₯μ΄ μ νλ μ μλ€.
- λμμ± μ μ΄ λ―Έν‘: volatileλ§μΌλ‘λ λ©ν° μ€λ λ© νκ²½μμμ λμμ± λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€. λκΈ°ν λ©μ»€λμ¦μ΄ νμνλ€.
- μ»΄νμΌλ¬ μμ‘΄μ±: volatileμ ν¨κ³Όλ μ»΄νμΌλ¬λ§λ€ μ½κ°μ© λ€λ₯Ό μ μμΌλ―λ‘, μ¬μ©νλ μ»΄νμΌλ¬μ λ¬Έμλ₯Ό μ°Έκ³ νλ κ²μ΄ μ’λ€.
volatile ν€μλμ μ¬μ©μ μλ² λλ μμ€ν μ μ λ’°μ±μ λμ΄κ³ νλμ¨μ΄μμ μνΈ μμ©μ μ ννκ² μ μ΄νλ λ° μ€μν μν μ νλ€.
'π§ STM32' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[STM32] 11. μλ¦¬μΌ λͺ¨λν°λ₯Ό μν UART ν΅μ ꡬν (1) FTDI (UART To USB) (0) | 2024.11.22 |
---|---|
[STM32] 10. UART, USART λμ μ리 μ€λͺ (0) | 2024.11.22 |
[STM32] 8. μ€μμΉ μ±ν°λ§ (μννΈμ¨μ΄ λλ°μ΄μ±) (0) | 2024.11.18 |
[STM32] 7. μΈλΆ μΈν°λ½νΈ(External Interrupt) (0) | 2024.11.18 |
[STM32] 6. νμ μ ν κΈ°λ³Έ μ리 (0) | 2024.11.18 |