SSVCU 코드 흐름 대시보드

주 ref branch_20260706_MJKIM_Refactoring 2026-08-07 tip 비교 ref main 2026-05-20 tip 근거 소스 관측 전용 · 모든 위치는 주 ref 기준으로 정규화 — 빌드·실행·벤치 없음 버전 v001 · 설계 동결

실행 순서 — 부팅 · 인터럽트 · 주기 레인

블록은 소스에 적힌 호출 순서 그대로입니다. 레인은 서로 겹칠 수 없습니다 — 선점이 꺼져 있어 한 태스크가 양보하기 전까지 다른 레인은 시작되지 않습니다.

부팅 체인 — 커널 시작까지
인터럽트 문맥 — 레인 밖. 이 시스템에서 선점이 일어나는 유일한 지점입니다. 수신은 큐 없이 ISR 안에서 3개 핸들러로 팬아웃하고, 송신만 큐를 가집니다.
10 msmyTask02 · 512 B
100 msmyTask03 · 512 B
500 msmyTask04 · 512 B
유휴defaultTask · 512 B

각주 — EcuM_Task_1sec은 이름과 달리 500 ms 주기로 실행되고 freertos.c:365의 주석은 1 sec이라고 적혀 있습니다. Vcu_Proc_500ms는 500 ms 레인이 아니라 100 ms 레인의 카운터 안에서 돕니다. Dm_Proc_100ms는 두 ref 모두 빈 스텁이라 부하로 세면 안 됩니다.

제어권 중재 — 요청 단계와 실제 단계

이 장비의 모든 출력은 여기서 정해진 소유자를 따라갑니다. 왼쪽 필터에서 제어권을 고르면 그 경로만 남습니다.

동결된 판정

2단계에서 1단계로. 런타임 건전성 가드 두 개가 같은 틱 직접 검사에서 한 틱(10 ms) 늦는 폴트 매개 검사로 옮겨졌고, 자율주행 허용 신호와 강등 경로는 게이트에서 빠졌으며, PC 전원 상태가 추가되어 빌드 플래그 조건부가 아닌 상시 조건이 되었습니다.

frozen text — Two-stage to one-stage. Two runtime-health guards moved from a same-tick direct check to a fault-mediated check that lags by one 10 ms tick; the autonomous-enable signal and the demotion path were dropped from the gate; PC-power state was added and is now unconditional rather than build-flag dependent.

요청 단계 — vDm_Ctrl_OwnerReq

주 ref Asw/Dm.c:139 · 비교 ref Asw/Dm.c:133

충전 모드
BPA_Divice_Status == BATTERY_CHARGER_MODE → CTRL_NONE_SAFETY_LOCK
ADT 진입 조건
그 외
RC 링크 정상 → CTRL_RCRC 링크 상실 → CTRL_LCD

실제 단계 — vDm_Ctrl_OwnerAct

주 ref: 모든 case가 직접 대입 · 비교 ref: ADT만 Asw/Dm.c:157/:159에서 재검사 후 실패 시 CTRL_RC로 강등하고 vDm_DangerFeatureInit_F를 세웠습니다 (:167).

주 ref 재검사
vCanBusState != CAN_BUSOFFvCanFrame_Adt2Vcu1_timeout == 0CF_ADTAutoCtrlEnblSt == AUTO_ENABLED강등 경로
소유자
소유자별 출력

가드는 사라지지 않고 폴트 경로로 옮겨갔습니다

버스오프는 FaultReaction_ClassB에서 FC_CanBusOff로, ADU 타임아웃은 FaultReaction_ClassD에서 FC_ADT_CanMsgTimeout으로 올라오고, FaultReaction_Malfuntion_Auto_D()Set_TgtAutoFault(true)를 호출합니다 (Asw/FaultReaction.c:207). 요청 단계가 그 플래그를 읽습니다.

지연이 생기는 이유
두 ref 모두 FaultReaction()Dm_Proc_10ms 끝에서 실행 — 주 ref :231, 비교 ref :241비교 ref에는 같은 틱 직접 검사가 있어 이 간극이 없었음
//transition event of vDm_Ctrl_OwnerAct will be processed... later (after test) !!!

두 ref 모두 Asw/Dm.cDm_Proc_10ms 안에 그대로 남아 있는 원문 주석입니다. 실제 소유자 전이 처리가 아직 미완성이라고 작성자가 직접 남긴 문장이라 그대로 인용합니다.

[미검증] 이 변경이 의도된 것인지, 출하 빌드의 플래그 조합이 무엇인지, 한 틱 지연이 하위 모듈에서 보상되는지 — 세 가지 모두 소스만으로는 확인할 수 없습니다.

부팅과 메모리 배치

이 이미지가 말하는 것은 하나입니다 — 애플리케이션이 자기 벡터 테이블을 옮긴다는 것, 즉 이 펌웨어는 부트로더가 띄우는 이미지라는 것.

플래시 배치와 벡터 테이블 재배치

STM32F479 플래시 배치 플래시 시작 0x08000000부터 64KB가 부트로더 영역이고, 0x08010000부터 1984KB가 애플리케이션 영역입니다. 애플리케이션은 벡터 테이블 오프셋 0x00010000을 사용해 자기 벡터 테이블로 전환하며, 플래시 최상단에 부트 진입 마커와 버전 주소 세 개가 놓여 있습니다. FBL 64 KB APPLICATION 1984 KB 마커 0x08000000 0x08010000 0x081FFFF8 SCB->VTOR = base | 0x00010000 system_stm32f4xx.c:181 — 애플리케이션이 자기 벡터 테이블로 전환 부트 진입 마커 0x081FFFF8 · 부트 버전 0x0800FF00 · 앱 버전 0x81FFEFC (EcuM.h:15-19)
플래시 배치는 STM32F479VITX_FLASH.ld:51-52에서, 재배치는 Core/Src/system_stm32f4xx.c:110,181에서 읽었습니다. 부트로더는 별도 프로젝트(STM32F479_BOOT)이고, PC 측 리프로그래머는 Vector 하드웨어를 쓰는 C# 애플리케이션입니다.
리셋 체인 — 클릭하면 오른쪽에 근거가 뜹니다

HAL 결합 열지도

주 ref 기준 Drivers/ 밖에서 HAL_*를 직접 호출하는 지점은 745곳입니다 (비교 ref 737곳). 애플리케이션 헤더 26개 중 17개가 벤더 HAL 헤더를 직접 include합니다 — MCU 중립 작업의 실제 작업량은 이 목록입니다.

막대 길이는 파일별 직접 호출 수입니다. Core/Src의 CubeMX 생성 파일은 원래 HAL을 부르는 자리이므로 문제가 아닙니다 — 판단이 필요한 곳은 AswMotorControl 행입니다.

인쇄본 안내 — 인쇄 시 네 개 뷰가 모두 펼쳐집니다. 선택 상태와 필터는 화면 전용이며, 모든 근거는 각 항목에 파일:줄로 표기되어 있습니다.

데이터 정직성 — 이 문서는 정적 파일입니다. 서버도, 저장소도, 외부 요청도 없습니다. 선택과 필터는 화면에서만 유지되며 새로고침하면 초기화됩니다. 범위 — 소스 관측 전용. 빌드·플래싱·계측·벤치 결과는 하나도 포함되어 있지 않습니다. 주의 — 주 ref는 아직 작업 중인 브랜치입니다. 이후 커밋이 이 그림을 추월할 수 있습니다.