스킬캠퍼스

오늘 끝나면

GPIO·UART·인터럽트

  • GPIO·UART·인터럽트의 핵심 문제를 한 문장으로 설명한다
  • 오른쪽 실습에서 GPIO이 어떻게 움직이는지 관찰한다
  • 다음 강의와 이어지는 한계를 말할 수 있다

실습 미션

memory map으로 바깥과 통신 — LED·터미널·타이머·ISR 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.

성공 조건

  • 실습의 기본값을 먼저 관찰
  • 입력값이나 모드를 한 번 이상 바꿔 결과 비교
  • 왜 결과가 바뀌었는지 한 문장으로 설명

반도체 설계 · 21

GPIO·UART
·인터럽트

CPU가 계산만 하면 깡통이다.
바깥 LED·버튼·터미널과 통하는 통로가 I/O다.
그 통로는 전부 메모리 주소 하나로 열린다.

P.01반도체 설계 · 21

바깥과 통하는 법, 메모리 맵 I/O

CPU는 메모리만 읽고 쓴다. 그래서 바깥 장치도 메모리인 척 다룬다.

어떤 주소 한 칸을 LED에 연결해 둔다. 그 주소에 1을 쓰면 전선으로 신호가 나가 LED가 켜진다.
버튼은 반대다. 버튼 주소를 읽으면 눌렸을 때 1, 안 눌렸을 때 0이 들어온다.

이걸 메모리 맵 I/O라 한다. 장치마다 주소를 박아두면 CPU는 평소 쓰던 LD/ST 명령 그대로 장치를 다룬다. 별도 명령이 필요 없다. 이 주소 약속 표가 그대로 최종 MyChip에 들어간다.

특정 주소 = LED · 버튼 · 터미널
메모리 맵 · 주소 한 칸 = 장치 하나
주소장치방향
0xF000LED쓰기1 쓰면 켜진다
0xF001BUTTON읽기눌리면 1
0xF002UART쓰기글자 1자 전송
0xF003TIMER쓰기카운트 설정
0x0000RAM읽기·쓰기일반 메모리
CPU는 LD/ST만 알면 된다 · 주소가 장치를 가린다
P.02반도체 설계 · 21

UART, 선 하나로 글자를 흘려보낸다

칩 안의 글자 한 자는 8비트 묶음이다. 그런데 바깥으로 보낼 땐 선 8가닥을 깔기 어렵다.

그래서 한 비트씩 줄 세워 선 하나로 흘려보낸다. 이게 직렬(serial)이다. 그 일을 하는 장치가 UART다.
보내는 쪽과 받는 쪽이 같은 속도(baud)로 약속해야 글자가 안 깨진다.

타이머도 같은 식의 주변 장치다. 일정 클럭마다 카운터가 한 칸씩 올라가다 0이 되는 순간 ‘시간 다 됐다’는 신호를 낸다.
UART로 글자를 보내고 타이머로 시간을 잰다. 둘 다 주소 하나로 다루는 I/O다.

병렬 8비트 → 직렬 한 줄 → 터미널
병렬 8비트 → 직렬 한 줄
칩 안, 글자 ‘H’ = 8비트 한 묶음
0
1
0
0
1
0
0
0
UART가 한 비트씩 떼어 보낸다
선 한 가닥, 시간 순서대로
01001000
받는 쪽이 같은 속도(baud)로 다시 8비트로 모은다 = 터미널의 ‘H’
P.03반도체 설계 · 21

인터럽트, 급한 일엔 하던 걸 멈춘다

버튼이 눌렸는지 CPU가 계속 물어보면(폴링) 다른 일을 못 한다. 낭비다.

그래서 거꾸로 한다. 버튼이나 타이머에 급한 일이 생기면 CPU에 신호를 보낸다. 이게 인터럽트다.
신호가 오면 CPU는 하던 명령을 딱 멈추고, 지금 위치(PC)를 적어둔 뒤 정해진 처리 루틴으로 점프한다.

그 처리 루틴이 ISR(인터럽트 서비스 루틴)이다. 짧게 급한 일만 처리하고 끝나면, 적어둔 위치로 돌아가 하던 일을 이어간다. 본 코드는 자기가 멈췄다 돌아온 줄도 모른다.

버튼 눌림 → 본 코드 정지 → ISR 점프
인터럽트 → ISR → 복귀
본 코드 실행 중
…계속 계산…
IRQ
버튼 눌림 → 인터럽트 발생
PC
지금 위치(PC) 저장
ISR
ISR로 점프, 급한 일 처리
ISR
ISR 끝, RETI
PC
저장한 위치로 복귀
본 코드 이어서 실행
본 코드는 멈췄다 돌아온 줄 모른다 · ISR은 짧게
P.04반도체 설계 · 21

직접 I/O를 두드려 본다

LED 주소에 1을 쓰면 불이 켜지고, UART 주소에 글자를 쓰면 터미널에 한 자씩 찍힌다.

버튼을 누르면 인터럽트가 걸리고, STEP으로 한 줄씩 ISR이 끼어드는 걸 확인한다. 타이머가 0이 되면 또 다른 인터럽트가 뜬다. 하단 근거 패널에 PC·주소·데이터가 매 STEP 갱신된다.

여기서 정한 주소 맵이 그대로 MyChip의 I/O 맵으로 들어간다.

LED·버튼·터미널·타이머 + 인터럽트 → ISR
I/O 패널 · 메모리 맵 + 인터럽트
LED · 0xF000
OFF
BUTTON · 0xF001
읽으면 1 · 인터럽트 발생
TIMER · 0xF003꺼짐
WAIT마다 1씩 감소 · 0 되면 인터럽트
UART 터미널 · 0xF002
>
예측 먼저, 버튼을 누르면 본 코드는?
프로그램, STEP으로 한 줄씩
b0ST 0xF000, 1 ; LED 켜기
b1ST 0xF002, 'H' ; UART로 H
b2ST 0xF002, 'I' ; UART로 I
b3ST 0xF003, 3 ; 타이머 3
b4WAIT ; 이벤트 대기
b5ST 0xF000, 0 ; LED 끄기
b6HALT ; 끝
인터럽트 핸들러 (ISR)
100ISR:
101ST 0xF002, '*' ; 신호 문자
102RETI ; 복귀
근거 패널, 지금 무슨 일이
PC (실행 위치)
b0
본 코드
타이머
꺼짐
LED
OFF
주소 0xF000
마지막 버스 트랜잭션

아직 없음, STEP을 눌러 본다

장치는 전부 메모리 주소 한 칸이다. CPU는 LD/ST만 알면 된다. 급한 일은 인터럽트가 본 코드를 멈추고 ISR로 점프시킨다. 이 주소 맵이 최종 MyChip의 I/O 맵으로 들어간다.

P.05반도체 설계 · 21

I/O가 칩을 컴퓨터로 만든다

여기까지 만든 CPU와 메모리는 계산만 한다. I/O를 붙여야 비로소 세상과 통한다.

입력은 버튼과 센서, 출력은 LED와 UART, 시간은 타이머, 급한 일은 인터럽트가 맡는다.
이 넷이 메모리 주소 몇 개로 붙으면, 같은 코어가 도어락도 되고 온도계도 된다.

하드웨어는 그대로 두고 주소에 무슨 값을 언제 쓰느냐, 그 소프트웨어만 바꾸면 된다. 이 I/O 맵과 인터럽트 약속이 최종 MyChip의 바깥 인터페이스가 된다.

Q. 인터럽트가 오면 CPU는?정답은 하던 일을 멈추고 처리 루틴(ISR)으로 점프한다.
지금 위치(PC)를 적어둔 뒤 ISR로 뛰어가 급한 일만 짧게 처리한다.
끝나면 적어둔 위치로 돌아와 하던 일을 이어간다. 본 코드는 멈췄다 온 줄도 모른다.
계산 코어 + I/O + 인터럽트 = 진짜 칩
코어 + I/O = 진짜 칩
가운데

16비트 CPU + RAM

계산만 하는 코어

↕ 메모리 주소로 연결 ↕
BUTTON
입력 · 읽기
LED
출력 · 쓰기
UART
직렬 통신
TIMER
시간 · 인터럽트
하드웨어 그대로 · 소프트웨어만 바꿔 도어락도 온도계도

3줄 요약

  1. 1memory map으로 바깥과 통신 — LED·터미널·타이머·ISR
  2. 2GPIO·UART·인터럽트은 비트·게이트 → ALU → 시간·메모리 → 나만의 CPU → 메모리·GPU·SoC 흐름 안의 한 칸이다.
  3. 3개념을 외우는 것보다 입력을 바꾸면 무엇이 달라지는지 보는 것이 우선이다.

완료 전 점검

복습 카드

GPIO

memory map으로 바깥과 통신 — LED·터미널·타이머·ISR

ALU

산술·논리 연산을 하는 회로

ISA

CPU가 이해하는 명령어 집합과 인코딩