[왕초보 임베디드-C 공부 일기] 9. 반복문(2) - while

1. 정의

   while 구문은 소괄호 안의 조건식이 참으로 평가되는 동안 중괄호 내부의 코드를 반복 실행하는 반복문이다.
      -동작 원리 : 반복문 본문에 진입하기 전에 조건을 검사한다. 처음부터 조건이 거짓이면 내부 코드는 단 한 번도 실행되지 않고 건너뛴다.
      -for 문과 차이점 : for문은 반복 횟수가 명확할 때 주로 쓰지만, while문은 종료 조건만 명확하고 몇 번 반복할지 모를 때 사용한다. 

2. 구문의 종류

   1) 무한 반복 : "시스템의 심장"
      임베디드 소프트웨어의 가장 밑바탕이 되는 구조이다. 프로그램이 종료되지 않고 영원히 특정 작업을 반복하도록 한다. 

사용 예시⬇️ : 로버의 전원이 켜지면 멈추지 않고 계속해서 센서를 일고, 통신을 확인하고, 모터를 제어해야 한다. 
int main(void) {
    system_init();
    while(1){
        read_sensors();
        process_data();
        controls_motors();
        //로버의 전원이 꺼지거나 리셋될 때까지 이 안에서만 구동됨
    }
}

   2) 상태 대기 : "하드웨어 응답 기다리기"
      CPU가 하드웨어(센서, 통신 모듈)의 상태가 변할 때까지 계속해서 레지스터를 확인하며 기다리는 방식이다. 

사용 예시⬇️ : UART 통신 규격으로 1바이트의 데이터를 전송하려고 한다. 하지만 이전 데이터가 아직 전송 중이어서 전송 장치가 '바쁨' 상태이다. 
                   '비어있음' 상태가 될 때까지 대기해야 한다. 
//TXE(Transmit Data Register Empty) : 비트가 1이 될 때까지 대기
while((*pUART_STATUS & TXE_BIT) == 0 ){
    // 상태가 0(바쁨)인 동안 조건식만 계속 반복
    ;
}
// 반복문을 탈출했다는 건 TXE_BIT가 1이 되었다는 뜻이다. 
*pUART_DATA = 'A'; //데이터 전송

➕ 상태 대기 while문의 위험성
   만약 우주에서 센서가 고장나서 응답을 영원히 안 주면 어떻게 될까?
   while(sensor_ready == 0);
   
   센서가 고장 나면 while문을 영원히 빠져나오지 못하고, 로버 전체가 먹통이 되어버린다.
   이러한 상황을 방지하기 위해 반드시 while문에 시간 제한 안전장치를 설치한다. 
   int timeout = 10000; // 대기 시간 설정

//센서가 준비되지 않았고, 대기 시간이 지나지 않았을 때만 반복한다. 
   while(ssensor_ready == 0 && timeout > 0){
        timeout--;    // 한 바퀴 돌 때마다 대기 시간 깎기
}

if(timeout == 0){
    //10000번을 돌았는데도 빠져나왔다면 센서 고장
    handle_sensor_error();
} else {
    read_sensor_data();
}

   3) 사후 검사형 : "일단 한 번의 실행"
      일반 while문과 달리 조건을 코드 블록 맨 마지막에서 검사한다. 조건이 거짓이더라도 최소 1번의 실행은 보장된다. 

사용 예시⬇️ : 탐사 로버가 메인 컴퓨터와 통신을 시도한다. 연결이 안 되면 다시 시도해야 하는데, 어쨌든 최소 '1번'은 무조건 연결 시도를 해봐야 한다. 
int connection_status = FAIL;
do {
    send_connection_request();           // 1. 일단 무조건 한 번 요청을 보냄
    connection_status = check_reply();   // 2. 응답 확인
} while (connection_status == FAIL);     // 3. 실패했으면 다시 위로 올라가서 재시도

✅개념 요약
    -while 문은 반복 횟수보다 '종료 조건'이 중요할 때 쓰는 반복문이다. 
    -임베디드 시스템에서는 무한 반복으로 시스템을 굴리거나 하드웨어를 기다릴 때 핵심적으로 사용하며, 
     무한정 반복을 막기 위해 시간 제한을 함께 쓰는 것이 실무에서 자주 쓰인다.