null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
⌂
Embedded C Intermediate — 인터럽트·주변장치·펌웨어 설계 패턴
Structure
interrupt-system
•
인터럽트 개념 — 벡터 테이블과 ISR 등록 원리
•
인터럽트 라우팅 — SRC 레지스터로 코어에 연결하기
•
ISR 작성 규칙 — 재진입 금지, 실행 시간 최소화
•
ISR 공유 데이터 — volatile, 임계구역, 원자 접근
timers
•
타이머 개념 — 카운터, 오버플로, 프리스케일러
•
PWM 생성 — 원리, 듀티사이클, GTM TOM
•
입력 캡처 — 주파수·펄스폭 측정, GTM TIM
serial-communication
•
UART 심화 — FIFO, 오류 핸들링, 인터럽트 기반 송수신
•
SPI 프로토콜 — Master/Slave, CPOL/CPHA, QSPI
•
I2C 프로토콜 — 주소 지정, ACK/NACK, 멀티마스터
adc
•
ADC 기초 — 분해능, 샘플링 레이트, EVADC
•
ADC 변환 모드 — 단일, 연속, 스캔 모드
•
ADC 인터럽트 & DMA — 변환 완료 처리, 자동 수집 패턴
firmware-patterns
•
상태 머신 — FSM 설계, enum + 함수 포인터 테이블
•
링버퍼 — 원형 버퍼 구현, 인터럽트 안전 설계
•
협력형 스케줄러 — 타임 슬롯 기반 직접 구현
Flow Structure
Prev
1 / 16
인터럽트 라우팅 — SRC 레지스터로 코어에 연결하기
☆ Star
↗ Full
인터럽트 개념 — 벡터 테이블과 ISR 등록 원리
#interrupt
#vector-table
#isr
#tc37x
#tricore
@devpc
|
2026-04-02 06:39:38
|
GET /api/v1/flows/11/nodes/209?fv=1&nv=1
Context:
Flow v1
→
Node v1
0
Views
3
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 전용 컨텍스트 저장 영역 |
Prev
인터럽트 라우팅 — SRC 레지스터로 코어에 연결하기
// COMMENTS
Newest First
ON THIS PAGE
No content selected.