End-to-End Protection. "CRC만으로는 부족하다" 는 인식에서 출발한다.
CRC가 못 잡는 고장들
프레임이 아예 안 온다 송신 태스크가 죽었다
같은 값이 계속 온다 센서가 멈췄는데 마지막 값이 반복된다
남의 값이 온다 라우팅 설정 실수로 다른 신호가 들어온다
셋 다 데이터 자체는 멀쩡하므로 CRC를 통과한다.
그래서 세 겹으로 만든다
| 장치 | 잡는 고장 |
|---|---|
| CRC | 전송 중 비트 손상 |
| 순번(alive counter) | 정지(값 반복) · 유실 · 순서 뒤바뀜 |
| 데이터 ID | 다른 신호가 잘못 들어온 경우 |
| 수신 타임아웃 | 아예 오지 않는 경우 |
if (crc8(&f, 4) != f.crc) fault(E2E_CRC);
else if (f.counter == prev) fault(E2E_STUCK);
else if (((prev + 1u) % 15u) != f.counter) fault(E2E_LOST);
else if (now - last_rx_ms > 50u) fault(E2E_TIMEOUT);
이름이 'End-to-End'인 이유
버스 구간만 보호하는 것이 아니라 보내는 소프트웨어 컴포넌트에서 받는 컴포넌트까지 전 구간을 보호한다는 뜻이다. 중간의 게이트웨이나 스택이 값을 잘못 옮겨도 걸린다.
검출한 다음이 더 중요하다
"마지막 값을 유지한다"는 안전 대응이 아니다. 정해진 시간 안에 안전 상태로 전환하는 것이 요구다. 주차 보조라면 기능을 중단하고 운전자에게 알린다.