seq_counter 와 헷갈리기 쉬운데 잡는 고장이 다르다.
seq_counter 이 데이터가 새 것인가 중복 · 역순 · 유실 검출
alive counter 송신 태스크가 도는가 태스크 정지 검출
두 번째가 실제로 잡기 어려운 고장이다
송신 노드의 애플리케이션이 hang 됐는데 CAN 컨트롤러가 마지막 프레임을 자동 재전송하면, 수신 측은 정상 프레임을 계속 받는다. heartbeat 도 정상으로 보인다. CRC 도 통과한다.
값이 안 변하는 것으로만 알 수 있고, 그걸 위해 매 송신마다 증가하는 카운터를 넣는다.
data[len - 1] = (uint8_t)((ctx->alive++ & 0x0F) | (data_id << 4));
수신 측은 이렇게 본다.
uint8_t alive = d[len - 1] & 0x0F;
if (alive == ctx->last_alive) return E2E_STALE_ALIVE; /* 값이 안 변했다 */
4비트면 충분하다. 0~15 를 순환하는데, 재전송이 15회 연속으로 정확히 한 바퀴 돌 확률은 실용상 무시할 수 있다.