본문 바로가기
임베디드 개발/8051

C51 인터럽트

by eteo 2026. 8. 6.
반응형

 

 

Keil C51 컴파일러에서는 interrupt 키워드를 사용해 아래와 같이 인터럽트 서비스 루틴(ISR)을 정의한다.

 

void 함수명 (void) interrupt <벡터번호> {
	// ...
}

 

<벡터번호> 위치에는 0~31 사이의 정수가 올 수 있고, 컴파일러가 알아서 해당 인터럽트 번호에 맞는 벡터 주소 매핑까지 처리한다.

 

예시. 

extern bit alarm;
int alarm_count;

void falarm (void) interrupt 1 using 3  {
    alarm_count *= 2;
    alarm = 1;
}

 

 

이 interrupt 키워드의 가장 큰 특징은 인터럽트 함수가 호출될 때 ACC, B, DPH, DPL, PSW 같은 핵심 레지스터들의 내용을 알아서 스택에 저장(push)하고, 인터럽트가 끝날 때 자동으로 복원(pop)해 준다는 점이다.

 

보통 메인 루프에서 레지스터를 가지고 연산을 하다가 인터럽트가 걸렸다 돌아오면 데이터가 오염돼 있을까봐 걱정될 수 있다. 하지만 이 레지스터들에 한해서는 컴파일러가 알아서 push/pop을 해주기 때문에 그런 걱정을 할 필요가 없다.

 

 

  • ACC : 누산기 (Accumulator)
  • B : 주로 곱셈(MUL) 나눗셈(DIV)에 사용되는 레지스터로 해당 연산을 안할 땐 범용으로도 쓰인다. 
  • DPH, DPL : 16비트 데이터 포인터 레지스터 DTPR의 상위/하위 바이트
  • PSW : Program Status Word 레지스터로 CY(캐리), RS0/RS1(레지스터 뱅크 셀렉트), AC(보조 캐리), OV(오버플로우 플래그), P(패리티), F0(사용자 정의 플래그) 비트를 포함한다.

 

물론 컴파일러가 무조건 해당 레지스터를 전부 push/pop 하는 것은 아니며, 인터럽트 함수 안에서 해당 레지스터에 접근한 경우에만 이 자동 백업이 적용된다.

 

 

 

다음은 위의 C코드 예시를 어셈블리로 변환한건데, ACC와 PSW(CY)에 접근하기 때문에 인터럽트 진입 시 두 레지스터를 push하고 나갈 때 역순으로 pop하는 것을 볼 수 있다. 

 

 

 

(참고로 일반 함수 종료 어셈블리 명령어는 RET이고, 인터럽트 서비스 루틴 종료 명령어는 RETI이다.)

 

 

 

 

그리고 인터럽트 서비스 루틴에는 추가로 using이라는 옵셔널 속성을 붙일 수 있다.

 

void 함수명 (void) interrupt <벡터번호> using <뱅크번호> {
	// ...
}

 

 

<뱅크번호> 위치에는 0~3 사이의 정수를 지정해서 범용 레지스터(R0~R7) 네 개의 뱅크 중에서 어떤 뱅크를 쓸 지 고른다. 원래는 PSW 레지스터의 RS1, RS0 비트를 조작해서 사용할 뱅크를 고르는데, using 키워드가 그 작업을 대신해 주는 것이다.

 

이렇게 뱅크를 나눠 쓸 일이 생기는 이유는 8051은 내장 RAM이 매우 부족한 관계로 지역 변수를 만들어 쓰는 대신 하드웨어 레지스터를 적극적으로 활용하는 방식이 많이 쓰이기 때문이다. 메인 루프에서 Bank 0을 골라 R0~R7을 쓰고, 인터럽트에서는 메인과 겹치지 않게 다른 뱅크를 지정해 R0~R7을 쓰면 되는 식이다.

 

한편, using 속성이 지정되지 않은 경우에는 인터럽트 함수 안에서 R0~R7에 접근 시 현재 활성 뱅크의 R0~R7은 스택에 저장되고 리턴할 때 복원된다.

 

 

 

 

즉, ACC, B, DPH, DPL, PSW 레지스터 및 범용 작업 레지스터(R0~R7)가 아닌 레지스터를 메인과 ISR 각각에서 조작한다면(SPSC 또는 읽기만 하는 경우 제외), ISR에서 명시적으로 백업 및 복원 코드를 챙겨주는 게 안전하다.

 

 

Reference :

https://developer.arm.com/documentation/101655/0961/Cx51-User-s-Guide/Language-Extensions/Function-Declarations/Interrupt-Functions

반응형

'임베디드 개발 > 8051' 카테고리의 다른 글

C51 지역 변수의 처리  (0) 2026.08.12
8051 메모리 구조  (0) 2026.07.30
8051 MCU의 1T, 6T, 12T의 의미  (0) 2026.07.23