OSEK Hook Routines — VDX가 제공하는 OS 이벤트 시점의 사용자 정의 콜백. 시스템 부팅/종료/에러/컨텍스트 스위치 같은 OS 내부 이벤트에 사용자 함수를 연결한다. OIL에서 어떤 훅을 사용하는지 선언하고, C 코드로 해당 함수를 구현한다.
5대 Hook
| Hook | 트리거 시점 | 전형적 용도 |
|---|---|---|
StartupHook | 시스템 부팅 중 | 시스템 초기화 (HW 리셋 등) |
ShutdownHook | ShutdownOS 호출로 시스템 종료 중 | 로깅 등 종료 처리 |
ErrorHook | OSEK 서비스의 반환값이 E_OK가 아닐 때 | 에러 처리 |
PreTaskHook | 컨텍스트 스위치 — Task가 RUNNING에 진입하기 직전 | 디버깅 |
PostTaskHook | 컨텍스트 스위치 — Task가 RUNNING에서 빠지기 직전 | 디버깅 |
세부 동작
StartupHook
OS 초기화 완료 이후, 첫 Job 스케줄링 이전에 한 번 호출된다. 이 시점에 모든 사용자 인터럽트는 disabled 상태다. HW 리셋, GPIO 초기화 등 OS와 무관한 초기화 코드의 배치 장소.
ShutdownHook
애플리케이션 태스크 또는 OS가 치명적 상황에서 ShutdownOS 서비스를 호출하면, 실제 OS 종료 이전에 ShutdownHook이 호출된다. 용도:
- 애플리케이션 상태 로깅
- 다른 ECU로 비상 메시지 송신
ErrorHook
OS가 요청된 서비스를 수행할 수 없다고 판단할 때마다 호출되며, 반환 StatusType은 E_OK가 아니다. ErrorHook 내부에서는 자기 자신이 재호출되지 않는다 (무한 재귀 방지).
훅 안에서 두 정보를 조회할 수 있다.
- Error code — 예:
E_OS_ACCESS,E_OS_ID,E_OS_STATE, … - 요청된 서비스 ID —
OSErrorGetServiceId()로 조회, 예:OSServiceId_ActivateTask,OSServiceId_SetAbsAlarm, … - API 파라미터 값 —
OSError_<Name1>_<Name2>()매크로로 조회
전체 에러 코드 목록, Standard/Extended Status 차이, 파라미터 매크로 사용 규칙은 OSEK Error Handling에 정리.
일반 구조
void ErrorHook(StatusType error) {
switch (error) {
case E_OS_ACCESS: /* ... */ break;
case E_OS_ID: /* ... */ break;
case E_OS_STATE: /* ... */ break;
/* ... */
}
switch (OSErrorGetServiceId()) {
case OSServiceId_SetAbsAlarm: /* ... */ break;
case OSServiceId_SetRelAlarm: /* ... */ break;
case OSServiceId_SetEvent: /* ... */ break;
case OSServiceId_GetEvent: /* ... */ break;
/* ... */
}
}Pre/PostTaskHook
각 컨텍스트 스위치에서 호출된다.
- PostTaskHook — Task가 RUNNING을 떠날 때
- PreTaskHook — 새 Task가 RUNNING에 들어올 때
OS Service Restrictions
Hook 내부에서는 호출 가능한 OS 서비스가 제한된다. 이 제약은 ISR과 콜백 함수에도 동일하게 적용된다. 예를 들어 WaitEvent, TerminateTask 등은 Hook 컨텍스트에서 허용되지 않는다.
AUTOSAR OS 확장 — ProtectionHook
AUTOSAR OS(SC2 이상)는 OSEK의 5대 Hook에 ProtectionHook 을 추가한다. ErrorHook이 API 반환값이 E_OK가 아닐 때 호출되는 “통지형”이라면, ProtectionHook은 Stack Overflow·Timing 위반·Memory 침범 등 OS가 감지한 치명적 이벤트에 대해 PRO_IGNORE / PRO_TERMINATETASKISR / PRO_TERMINATEAPPL / PRO_TERMINATEAPPL_RESTART / PRO_SHUTDOWN 중 하나를 반환해 복구 정책을 결정한다. 상세는 Protection Hook.
선언 (OIL + C)
OIL
OS config {
STATUS = EXTENDED; // 확장 상태 정보 활성화
ERRORHOOK = TRUE; // 사용하는 훅 선언
PRETASKHOOK = TRUE;
// 사용할 hook은 OIL에 반드시 선언해야 한다
};C
void ErrorHook(StatusType error) {
/* 에러 처리 */
}
void PreTaskHook(void) {
TaskType id;
GetTaskID(&id);
printf("Before %d\n", id);
}