stc 대규모 장애로 서비스 이용 불가

, ,

STC8A8K64D4를 사용 중인데 공식 사이트에서 소프트웨어를 다운로드하고 설치도 완료했지만 여전히 큰 인터럽트 번호를 사용할 수 없습니다. 도대체 무슨 문제일까요? 아래는 오류 메시지입니다.

*** ERROR L121: IMPROPER FIXUP
MODULE: .\Objects\main.obj (MAIN)
OFFSET: 0001C4H
Program Size: data=18.3 xdata=1048 const=0 code=5874
Target not created.
Build Time Elapsed: 00:00:00

공식 웹사이트에서 제공하는 중단 번호 확장 소프트웨어를 사용했습니다.

ERROR L121: IMPROPER FIXUP라는 오류 메시지를 보니, Keil에서 STC 마이크로컨트롤러의 큰 인터럽트 번호(31번 이상)를 처리할 때 자주 발생하는 전형적인 문제입니다.

간단히 말해, Keil C51 컴파일러는 기본적으로 0~31번 인터럽트만 지원합니다. 귀하가 사용 중인 STC8A8K64D4의 경우, 일부 인터럽트(예: UART2, UART3, UART4 또는 PCA 등)의 번호가 종종 31을 초과하기 때문에, 이를 그대로 작성하면 이 오류가 발생하게 됩니다.

귀하께서 이미 공식 홈페이지의 "인터럽트 번호 확장 소프트웨어"를 설치했다고 말씀하셨지만 여전히 오류가 발생한다면, 일반적으로 설치 과정이 정확히 완료되지 않았기 때문입니다. 아래 두 가지 해결 방법을 제안드리며, 첫 번째 방법부터 시도해보실 것을 권장드립니다(특히 확장 도구를 이미 설치한 경우, 대부분 올바르게 적용되지 않은 경우입니다).


해결책 1: STC 공식 "인터럽트 벡터 번호 확장 도구"를 올바르게 사용하기

STC-ISP 소프트웨어에는 이 기능이 내장되어 있지만, 많은 사람들이 단순히 "설치만 했다"고 생각하고 맙니다. 실제로는 매번 컴파일 전에 이 도구를 통해 Keil을 실행해야 하거나, 시스템 파일을 교체해야 합니다.

  1. 도구 찾기: STC-ISP 소프트웨어를 열고, 우측 패널에서 "Keil 시뮬레이션 설정"을 클릭합니다. 그 안에 "Keil에 모델과 헤더 파일 추가하기"라는 버튼이 있습니다.
    • 참고: 이 작업은 단순히 칩 모델을 추가하는 것뿐만 아니라, 자동으로 대용량 인터럽트 번호를 지원하는 플러그인도 설치합니다.
  2. 다시 한 번 추가하기: 이전에 이미 추가했더라도 상관없이, 버튼을 다시 한 번 클릭하고 Keil 설치 경로(예: C:\\Keil_v5)를 선택하여 재확인합니다.
  3. 플러그인 확인: 추가가 성공하면, Keil 설치 폴더로 이동하여 \\Keil\\C51\\BIN 디렉터리 안에 있는 C51.EXE를 확인하세요. 확장이 성공했다면, STC에서 제공하는 대용량 인터럽트를 지원하는 C51.EXE로 교체되거나 패치되었을 것입니다.
  4. 재컴파일: Keil을 완전히 닫은 후 프로젝트를 다시 열고, 반드시 Rebuild(빌드가 아닌 전체 빌드)를 수행하여 오류가 사라졌는지 확인하세요.

해결책 2: 어셈블리 언어로 수동 점프 구현 (가장 확실한 “하드웨어 레벨” 해결법)

위 방법을 시행했는데도 여전히 오류가 발생한다면, 아마도 시스템 권한 등의 이유로 확장 도구가 제대로 작동하지 않았을 가능성이 큽니다. 이 경우 어셈블리 언어를 이용한 점프 방식을 추천합니다. 이 방법은 컴파일러 패치에 의존하지 않기 때문에 가장 신뢰할 수 있습니다.

사용 예시:

원래 다음과 같이 인터럽트 함수를 작성했다고 가정합시다(여기서 인터럽트 번호는 46이라고 가정):

void UART4_ISR(void) interrupt 46
{
    // 인터럽트 처리 코드
}

아래와 같이 수정하세요:

// 1. 인터럽트 함수 본체: 'interrupt' 키워드 없이 일반 함수로 작성
void UART4_ISR(void) 
{
    // 기존 인터럽트 처리 코드 (변경 없음)
}

// 2. 어셈블리 영역에서 점프 설정: 인터럽트 벡터 주소를 위 함수로 연결
void UART4_ISR_Entry(void) interrupt 46
{
    // 인라인 어셈블리로 실제 함수로 점프
    __asm
        LJMP _UART4_ISR
    __asm
}

핵심 포인트:

  • 어셈블리에서 사용하는 함수 이름은 앞에 밑줄 _를 붙여야 합니다(_UART4_ISR). C 함수는 컴파일 시 어셈블리 레벨에서 _ 접두사를 붙여 표현됩니다.
  • LX51 링커를 사용하는 경우 문법이 약간 다를 수 있으나, 위 코드는 Keil 환경에서 일반적으로 호환됩니다.

요약 및 제안

  1. 우선 STC-ISP에서 "Keil에 모델과 헤더 파일 추가하기"를 다시 실행하여, Keil 설치 경로를 정확히 지정했는지 확인하세요.
  2. 그래도 오류가 계속되면, 더 이상 도구 설치 문제에 매달리지 말고 즉시 해결책 2(어셈블리 점프 방식)을 사용하세요. 코드가 약간 늘어나 보일 수 있지만, L121 오류는 영원히 사라지고, 다른 프로젝트로의 이식성도 우수하며, 많은 STC 숙련자들이 실제로 이렇게 코딩하고 있습니다.

형제, 급하지 마. STC8 시리즈에서 큰 인터럽트 사용 시 L121: IMPROPER FIXUP 오류는 아주 흔한 문제야.

공식 인터럽트 번호 확장 플러그인을 사용했더라도 대부분 Keil 내부 설정이 따라오지 못해서 생기는 일이야.

다음의 가장 가능성 높은 원인들을 순서대로 점검해 보자:

1. 확장 링커(LX51)로 전환하지 않음 — 가장 흔한 원인

Keil C51의 기본 링커인 BL51은 인터럽트 번호 31번 이상을 거의 지원하지 못하고, L121 오류가 매우 자주 발생해.

  • 해결 방법: Keil의 “마법봉” 아이콘(Options for Target) 클릭 → Device 탭으로 이동 → Use Extended Linker (LX51) instead of BL51 항목에 체크. 그런 다음 Rebuild All을 다시 시도해봐. 상황의 90%는 이 방법으로 바로 해결돼.

2. 플러그인이 잘못된 Keil 경로에 설치됨

컴퓨터에 여러 버전의 Keil이 설치되어 있다면 (예: MDK-ARM과 C51이 함께 설치되었거나, 서로 다른 드라이브에 각각 설치된 경우), 공식 확장 패치가 실제로 사용 중인 디렉터리가 아닌 곳에 적용되었을 수 있어.

  • 해결 방법: 패치가 현재 사용 중인 Keil 루트 디렉터리에 제대로 적용되었는지 확인해 (특히 C51\\BIN 폴더 안의 컴파일러 파일들이 정상적으로 교체되었는지).

3. Keil C51 버전이 너무 낮음

공식 인터럽트 번호 확장 패치는 일정 이상의 Keil 버전을 요구해. 만약 Keil 버전이 너무 오래되었고 (예: v9.54 미만), 패치를 적용했다 하더라도 하위 어셈블러가 큰 인터럽트의 오프셋 주소를 인식하지 못할 수 있어.

  • 해결 방법: Keil C51을 v9.60 이상으로 업그레이드하는 것을 권장해.

4. 컴파일 잔여 파일로 인한 문제

때때로 패치 적용 후에도 이전에 생성된 .obj 파일이 링크 과정에 방해를 줄 수 있어.

  • 해결 방법: "Build"를 누르지 말고, 반드시 “Rebuild All” 을 클릭하여 기존 파일을 완전히 삭제하고 처음부터 다시 컴파일해.

우선 1단계인 LX51 전환을 시도해보고, 그래도 해결되지 않으면 "마법봉"의 Target과 Device 설정 화면을 캡처해서 올려줘. 확인해줄게.