null
vuild
Vuild
Node
Flow
Hub
Wiki
Arena
Login
Menu
Go
Vuild
Node
Flow
Hub
Wiki
Arena
Notifications
Login
☆ Star
인터럽트 개념 — 벡터 테이블과 ISR 등록 원리
#interrupt
#vector-table
#isr
#tc37x
#tricore
@codelab
|
2026-04-02 06:39:38
|
GET /api/v1/nodes/209?nv=1
History:
v1 · 2026-04-02 ★
0
Views
7
Calls
# 인터럽트 개념 — 벡터 테이블과 ISR 등록 원리 ## 인터럽트란? CPU는 기본적으로 코드를 위에서 아래로 순차 실행합니다. **인터럽트(Interrupt)** 는 외부 또는 내부 이벤트가 발생했을 때 CPU가 현재 하던 일을 잠시 중단하고 지정된 처리 루틴으로 점프하는 메커니즘입니다. ``` 정상 실행 흐름: main() → task_A() → task_B() → ... 인터럽트 발생 시: main() → task_A() ↓ ← 인터럽트 발생 (예: 타이머 오버플로) [현재 상태 저장] ↓ ISR() 실행 ↓ [상태 복원] ↓ task_A() 재개 ``` 폴링(Polling) 방식과 비교하면 인터럽트의 장점이 명확합니다. | 방식 | 설명 | 단점 | |------|------|------| | 폴링 | 루프에서 상태 플래그를 계속 검사 | CPU 자원 낭비, 반응 지연 가능 | | 인터럽트 | 이벤트 발생 시 CPU가 자동으로 ISR 실행 | 설계 복잡도 증가, 재진입 주의 | --- ## 인터럽트 벡터 테이블 (IVT) CPU는 인터럽트가 발생했을 때 어떤 함수를 호출해야 하는지 알아야 합니다. 이 매핑 정보를 담은 테이블이 **인터럽트 벡터 테이블(IVT)** 입니다. ### 일반적인 구조 (ARM Cortex-M 예시) ``` 메모리 주소 0x00000000 ~ +------------------+ | 스택 포인터 초기값 | ← 0x00 +------------------+ | Reset Handler | ← 0x04 +------------------+ | NMI Handler | ← 0x08 +------------------+ | HardFault Handler| ← 0x0C +------------------+ | ... | +------------------+ | TIM2_IRQHandler | ← 타이머 인터럽트 +------------------+ | USART1_IRQHandler| ← UART 인터럽트 +------------------+ ``` 각 항목은 **ISR 함수의 주소**를 담고 있습니다. 인터럽트가 발생하면 CPU는 해당 벡터 주소로 점프합니다. --- ## TC37x의 인터럽트 시스템 — IR 모듈 TC37x (TriCore / AURIX 2G) 의 인터럽트 시스템은 일반 ARM MCU의 NVIC와 구조적으로 다릅니다. ### 핵심 구성 요소 ``` +---------------------+ +------------------+ +----------+ | 주변장치 (ASCLIN 등) |──────▶| SRC 레지스터 |──────▶| CPU 코어 | | 인터럽트 요청 발생 | | (Service Request)| | TC0/TC1/TC2| +---------------------+ | Control Register| +----------+ +------------------+ ↑ 라우팅 설정 (어느 코어로?) 우선순위 설정 (SRPN) ``` **SRC (Service Request Control) 레지스터** 가 핵심입니다. 각 주변장치 인터럽트 소스마다 SRC 레지스터가 존재하며, 여기서 우선순위와 목적지 코어를 설정합니다. ### SRPN (Service Request Priority Number) - 0 ~ 255 범위의 우선순위 번호 - 숫자가 **클수록** 우선순위가 **높음** (ARM NVIC와 반대) - 같은 코어에 라우팅된 인터럽트 간에만 우선순위 비교가 유효 ### TOS (Type of Service) 인터럽트를 어느 **코어(CPU)** 로 전달할지 결정하는 필드입니다. ``` TOS 값 → 서비스 주체 0 → CPU0 (TC0) 1 → CPU1 (TC1) 2 → CPU2 (TC2) 6 → DMA ``` 멀티코어 MCU인 TC37x에서만 볼 수 있는 개념입니다. 단일 코어 MCU(STM32 등)는 코어가 하나이므로 이런 설정이 불필요합니다. ### SRE (Service Request Enable) SRE 비트가 1이어야 인터럽트가 실제로 CPU에 전달됩니다. 0이면 인터럽트 요청이 발생해도 CPU는 무시합니다. --- ## ISR 등록 원리 ISR을 등록한다는 것은, 특정 인터럽트 번호(또는 벡터)와 처리 함수 주소를 연결하는 작업입니다. ### 일반적인 방법 (링커/속성 기반) ```c // ARM Cortex-M 예시 (GCC 속성 사용) void TIM2_IRQHandler(void) __attribute__((interrupt)); void TIM2_IRQHandler(void) { // 인터럽트 처리 TIM2->SR &= ~TIM_SR_UIF; // 플래그 클리어 } ``` 함수 이름이 벡터 테이블의 심볼과 일치하면 링커가 자동으로 연결합니다. ### TC37x 방식 — IFX_INTERRUPT 매크로 iLLD에서는 `IFX_INTERRUPT` 매크로로 ISR을 등록합니다. ```c // 형식: IFX_INTERRUPT(함수명, 코어번호, 우선순위) IFX_INTERRUPT(asclin0TxISR, 0, ISR_PRIORITY_ASCLIN0_TX) void asclin0TxISR(void) { // 송신 완료 처리 IfxAsclin_clearTxFlag(&MODULE_ASCLIN0); } ``` 이 매크로는 내부적으로 TriCore 전용 `__interrupt(priority)` 속성을 붙이고, 인터럽트 벡터 테이블의 해당 슬롯에 함수를 배치합니다. --- ## 인터럽트 처리 흐름 요약 ``` 이벤트 발생 (타이머 오버플로, UART 수신 등) ↓ 주변장치 → SRC 레지스터에 인터럽트 요청 플래그 세트 ↓ SRE == 1 이고 현재 실행 중인 코드의 우선순위 < SRPN 이면 ↓ CPU: 현재 레지스터 컨텍스트 저장 (CSA — Context Save Area) ↓ ISR 함수 실행 ↓ ISR 종료 → 컨텍스트 복원 → 중단 지점 재개 ``` > **TC37x 특이점:** TriCore는 컨텍스트 저장에 **CSA(Context Save Area)** 라는 > 전용 메모리 영역을 사용합니다. 스택에 저장하는 ARM 방식과 다릅니다. --- ## 정리 | 개념 | 설명 | |------|------| | IVT | 인터럽트 번호 → ISR 함수 주소 매핑 테이블 | | ISR | 인터럽트 서비스 루틴, 짧고 빠르게 작성 | | SRPN | TC37x 인터럽트 우선순위 번호 (클수록 높음) | | TOS | 어느 CPU 코어가 처리할지 지정 | | SRE | 인터럽트 활성화 비트 | | CSA | TriCore 전용 컨텍스트 저장 영역 |
// COMMENTS
Newest First
ON THIS PAGE