OSEK Hook RoutinesVDX가 제공하는 OS 이벤트 시점의 사용자 정의 콜백. 시스템 부팅/종료/에러/컨텍스트 스위치 같은 OS 내부 이벤트에 사용자 함수를 연결한다. OIL에서 어떤 훅을 사용하는지 선언하고, C 코드로 해당 함수를 구현한다.

5대 Hook

Hook트리거 시점전형적 용도
StartupHook시스템 부팅 중시스템 초기화 (HW 리셋 등)
ShutdownHookShutdownOS 호출로 시스템 종료 중로깅 등 종료 처리
ErrorHookOSEK 서비스의 반환값이 E_OK가 아닐 때에러 처리
PreTaskHook컨텍스트 스위치 — Task가 RUNNING에 진입하기 직전디버깅
PostTaskHook컨텍스트 스위치 — Task가 RUNNING에서 빠지기 직전디버깅

세부 동작

StartupHook

OS 초기화 완료 이후, 첫 Job 스케줄링 이전에 한 번 호출된다. 이 시점에 모든 사용자 인터럽트는 disabled 상태다. HW 리셋, GPIO 초기화 등 OS와 무관한 초기화 코드의 배치 장소.

ShutdownHook

애플리케이션 태스크 또는 OS가 치명적 상황에서 ShutdownOS 서비스를 호출하면, 실제 OS 종료 이전에 ShutdownHook이 호출된다. 용도:

  • 애플리케이션 상태 로깅
  • 다른 ECU로 비상 메시지 송신

ErrorHook

OS가 요청된 서비스를 수행할 수 없다고 판단할 때마다 호출되며, 반환 StatusTypeE_OK가 아니다. ErrorHook 내부에서는 자기 자신이 재호출되지 않는다 (무한 재귀 방지).

훅 안에서 두 정보를 조회할 수 있다.

  • Error code — 예: E_OS_ACCESS, E_OS_ID, E_OS_STATE, …
  • 요청된 서비스 IDOSErrorGetServiceId()로 조회, 예: 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);
}

같이 보기