공부할 것 — 무엇을 어떤 순서로
대구(ADAS·자율주차) 기준으로 정리한 것이다.
범위가 넓어 보이지만 실제로 면접에서 갈리는 지점은 정해져 있다. 신입·주니어에게 AUTOSAR 를 깊이 묻지 않는다. 대신 C 와 하드웨어 기본기를 파고들어 묻는다 — 거기서 실력이 그대로 드러나기 때문이다.
우선순위를 매기고, 이 사이트의 어느 노트가 그것을 다루는지 연결해 둔다.
우선순위
1순위 반드시 · 여기서 떨어진다
C 언어 · 포인터 · volatile · 비트 조작
MCU 기본 — 인터럽트 · 타이머 · GPIO
CAN 통신
2순위 자주 물어본다
RTOS — 태스크 · 우선순위 · 우선순위 역전
디버깅 — HardFault · 오실로스코프
센서 원리 (지원 제품 위주)
3순위 알면 좋다 · 차별화
ISO 26262 · AUTOSAR · A-SPICE
신호 처리 기초
저전력 · EMC
1순위를 얕게 아는 것보다 깊게 아는 편이 훨씬 낫다. "volatile 이 뭐죠" 에 "최적화를 막습니다" 로 끝나면 아쉽고, "컴파일러가 값을 레지스터에 캐시해 상태 폴링이 무한 루프가 되기 때문" 까지 가면 다르다.
위에서 아래로 갈수록 배점이 낮아진다. 1순위 셋을 확실히 하지 않은 채 표준 이름만 외우면 꼬리질문에서 바로 드러난다. 보드 실습이 중간에 끼어 있는 이유는, 그것이 디버깅 경험을 만들어 주는 유일한 경로이기 때문이다.
1순위 — 여기서 갈린다
C 언어 · 포인터
자주 나오는 질문
"volatile 은 언제 쓰나"
→ ① 주변장치 레지스터 ② ISR 이 바꾸는 변수 ③ 멀티스레드 공유
→ 그리고 "원자성은 보장하지 않는다" 까지 말한다
"const volatile 이 동시에 가능한가"
→ 가능하다. 읽기 전용 상태 레지스터 — 내가 못 바꾸지만 하드웨어는 바꾼다
"구조체 크기가 왜 예상과 다른가"
→ 정렬 패딩. 큰 멤버부터 배치하면 준다
→ 통신에는 구조체를 그대로 쓰지 않고 바이트로 직렬화한다
"static 의 세 가지 의미"
→ 전역 static(파일 스코프) · 지역 static(수명) · 함수 static(내부 연결)
손으로 짜 볼 것
// 이 셋은 백지에 쓸 수 있어야 한다
void set_bit(uint32_t *r, int n); // 비트 세트·클리어·토글
int ring_push(Ring *q, uint8_t v); // 링 버퍼
uint16_t crc16(const uint8_t *d, size_t n); // CRC
MCU 기본
| 주제 | 이 사이트 |
|---|---|
| MCU 구조 · 부팅 · 메모리 맵 | MCU란 · 메모리 맵 · 부팅 |
| GPIO · push-pull/open-drain · 디바운싱 | GPIO |
| 인터럽트 · NVIC · ISR 규칙 | 인터럽트와 NVIC |
| 타이머 · PWM · 입력 캡처 | 타이머와 PWM |
| ADC · 샘플링 · 필터 | ADC |
자주 나오는 질문
"인터럽트에서 하면 안 되는 것"
→ printf · malloc · 블로킹 대기
→ 왜? 재진입 안전하지 않고, 다른 인터럽트를 지연시키고, 같은 것이 또 오면 놓친다
"ISR 과 메인이 데이터를 어떻게 주고받나"
→ 링 버퍼. head 는 ISR 만, tail 은 메인만 쓰면 락이 필요 없다
"폴링과 인터럽트의 차이, 언제 무엇을"
→ 이벤트가 드물면 인터럽트, 아주 잦고 예측 가능하면 폴링이 나을 수도
→ DMA 를 쓰면 둘 다 안 해도 된다
"PWM 으로 어떻게 밝기를 조절하나"
→ 진짜 아날로그가 아니라 빠르게 껐다 켜는 것. 눈이 평균으로 받아들인다
CAN 통신
자주 나오는 질문
"CAN 에서 우선순위는 어떻게 정해지나"
→ ID 가 작을수록 높다. 와이어드 AND 로 0 이 1 을 이긴다
→ 진 쪽은 데이터를 잃지 않고 물러난다(비파괴 중재)
→ 그래서 최악 지연 계산이 가능해 안전 시스템에 쓴다 ★ 여기까지가 좋은 답
"종단 저항은 왜 필요하고 몇 옴인가"
→ 반사 방지. 120Ω 을 양 끝에만. 전원 끄고 재면 60Ω 이 정상
"Bus Off 가 뭔가"
→ 오류 카운터가 256 을 넘으면 스스로 버스에서 빠진다
→ 고장난 노드가 버스를 망치는 것을 막는 안전 장치
"CAN 과 이더넷을 언제 나눠 쓰나"
→ 제어·진단은 CAN(결정성), 카메라·라이다 대용량은 이더넷
2순위 — 자주 물어본다
RTOS
"우선순위 역전이 뭔가" ★ 단골 중의 단골
→ 낮은 태스크가 잡은 뮤텍스를 높은 태스크가 기다리는데,
무관한 중간 태스크가 낮은 것을 선점해 높은 것이 계속 밀린다
→ 해법은 우선순위 상속. 화성 탐사선 Pathfinder 사례
"세마포어와 뮤텍스의 차이"
→ 세마포어는 신호 전달, 뮤텍스는 상호 배제
→ 뮤텍스는 소유자가 있고 우선순위 상속을 지원한다
→ ISR 에서 뮤텍스를 쓸 수 없는 이유가 소유자 개념 때문
"RTOS 를 언제 쓰나"
→ 선점이 필요하거나 블로킹 코드를 그대로 쓰고 싶을 때
→ 비용은 태스크마다의 스택(RAM)
디버깅
"HardFault 가 나면 어떻게 원인을 찾나" ★ 실무 경험을 보는 질문
→ 스택 프레임에서 PC 를 꺼내 addr2line 으로 위치를 찾는다
→ CFSR 비트로 종류를 가른다 (STKERR 면 스택 오버플로 의심 등)
→ HFSR.FORCED 가 1 이면 승격된 것이라 CFSR 을 봐야 한다
"스택 오버플로를 어떻게 잡나"
→ MPU 로 스택 바닥에 접근 금지 영역 → 넘치는 순간 잡힌다
→ 카나리는 이미 망가진 뒤에 안다
"브레이크포인트를 걸면 문제가 사라진다면"
→ 타이밍 의존 버그. 멈추지 말고 기록해야 한다
→ GPIO 토글 + 오실로스코프, 순환 이벤트 로그
이 질문들은 "해 봤는지" 를 본다. 책으로만 읽은 사람과 실제로 폴트를 잡아 본 사람의 답이 다르다.
센서 원리
| 주제 | 이 사이트 |
|---|---|
| 초음파·레이더·라이다·카메라 원리와 과제 | 기술 |
| 자율주차 시스템 전체 — 대구의 실제 도메인 | 자율주차 |
| SPI · I²C — 센서와 통신하는 법 | SPI · I²C |
| 주변장치·타이머 면접 정리 | 주변장치·타이머 |
"I2C 에서 풀업이 왜 필요한가"
→ 오픈드레인이라 HIGH 를 못 만든다. 풀업이 올려 준다
→ 그 덕분에 여러 장치가 한 선을 공유해도 단락이 안 난다(와이어드 AND)
"SPI 모드가 뭔가"
→ CPOL·CPHA 조합 4가지. 어느 엣지에서 샘플링하는지가 다르다
→ 틀리면 통신이 안 되는 게 아니라 값이 밀려 나온다
3순위 — 차별화
신입에게 깊이 묻지는 않지만 "들어는 봤나" 를 확인한다.
"ISO 26262 를 아나"
→ ASIL 등급 개념 + "고장이 나도 안전한 상태로 간다는 것을 증명하는 체계"
→ 워치독을 '모든 작업이 돌았음을 확인한 뒤에' 먹이는 이유로 연결하면
실무 감각이 보인다 ★ 이 연결이 차별화 지점
"AUTOSAR 가 뭔가"
→ 애플리케이션이 하드웨어를 직접 안 만지게 하는 계층 구조
→ Classic(ECU·C·정적) 과 Adaptive(고성능·C++·동적)
손으로 해 볼 것
말로만 아는 것과 해 본 것은 면접에서 바로 갈린다. 보드 하나(Nucleo·STM32 Discovery)면 충분하다.
① LED 를 레지스터 직접 조작으로 켠다 HAL 없이. 클럭부터
② 버튼 디바운싱 — 폴링과 인터럽트 두 가지로
③ UART 로 로그 출력 printf 연결까지
④ 타이머 인터럽트로 정확한 1ms 틱
⑤ PWM 으로 LED 밝기 조절
⑥ ADC 로 전압 읽고 필터 적용
⑦ I2C 센서 하나 붙이기 주소 스캐너부터
⑧ 링 버퍼 + UART 인터럽트 수신
⑨ 일부러 HardFault 를 내고 원인 찾기 널 포인터·정렬 위반
⑩ CAN 통신 두 노드 가능하면
⑨가 특히 값어치가 있다. 폴트를 일부러 내고 CFSR 을 읽어 원인을 맞혀 보면, 면접에서 그 이야기를 할 수 있다.
// 일부러 내 보기
*(volatile uint32_t*)0 = 1; // 널 포인터 쓰기
*(volatile uint32_t*)0x20000001 = 1; // 정렬 위반
((void(*)(void))0x20000000)(); // 잘못된 함수 포인터
int x = 0; int y = 1 / x; // 0 나누기 (UsageFault 활성 시)
면접 직전 점검
□ 지원 법인이 대구(ADAS)인지 경주(파워트레인)인지 확인했다
□ 담당 제품이 무엇인지 공고에서 확인했다
□ volatile 을 세 가지 경우로 설명할 수 있다
□ ISR 에서 하면 안 되는 것과 그 이유를 말할 수 있다
□ CAN 중재를 '비파괴' 까지 포함해 설명할 수 있다
□ 우선순위 역전을 예시로 설명할 수 있다
□ HardFault 원인 추적 절차를 말할 수 있다
□ 내가 만든 것 하나를 5분간 설명할 준비가 됐다
□ 되물어 볼 질문 3개를 준비했다
마지막 둘이 의외로 중요하다. 만든 것을 설명할 때 "왜 그렇게 했나" 와 "무엇이 어려웠나" 를 함께 말하면 깊이가 드러난다. 그리고 질문을 준비해 가면 관심도가 보인다.
되물어 볼 것 (예)
대구 공장·R&D 센터 중 어느 쪽 업무인가 — 양산 지원이냐 선행 개발이냐
담당 제품이 초음파·레이더·라이다·카메라·제어기 중 무엇인가
AUTOSAR 적용 범위와 개발 프로세스(A-SPICE) 수준은
본사(프랑스)·타 지역 거점과 어떻게 협업하나
한눈에 정리
- 1순위(C·MCU·CAN)를 깊게 — 얕게 넓히는 것보다 낫다. 여기서 갈린다
volatile·ISR 금기·링 버퍼는 반드시 이유까지 설명할 수 있어야 한다- CAN 중재는 "비파괴라 최악 지연 계산이 가능하다" 까지 가면 좋은 답
- 우선순위 역전은 RTOS 질문의 단골 — 예시(Pathfinder)와 해법(우선순위 상속)까지
- HardFault 추적 절차는 "해 봤는지" 를 보는 질문이다
- 3순위(ISO 26262·AUTOSAR)는 깊이가 아니라 연결 — 워치독 급여 방식으로 이으면 차별화된다
- 보드로 10가지를 직접 해 본다. 특히 일부러 폴트를 내 보는 것
- 만든 것을 "왜"와 "무엇이 어려웠나" 로 설명할 준비를 한다