오늘 끝나면
GPIO·UART·인터럽트
- ✓GPIO·UART·인터럽트의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 GPIO이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
memory map으로 바깥과 통신 — LED·터미널·타이머·ISR 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
반도체 설계 · 21
GPIO·UART
·인터럽트
CPU가 계산만 하면 깡통이다.
바깥 LED·버튼·터미널과 통하는 통로가 I/O다.
그 통로는 전부 메모리 주소 하나로 열린다.
바깥과 통하는 법, 메모리 맵 I/O
CPU는 메모리만 읽고 쓴다. 그래서 바깥 장치도 메모리인 척 다룬다.
어떤 주소 한 칸을 LED에 연결해 둔다. 그 주소에 1을 쓰면 전선으로 신호가 나가 LED가 켜진다.
버튼은 반대다. 버튼 주소를 읽으면 눌렸을 때 1, 안 눌렸을 때 0이 들어온다.
이걸 메모리 맵 I/O라 한다. 장치마다 주소를 박아두면 CPU는 평소 쓰던 LD/ST 명령 그대로 장치를 다룬다. 별도 명령이 필요 없다. 이 주소 약속 표가 그대로 최종 MyChip에 들어간다.
| 주소 | 장치 | 방향 | 뜻 |
|---|---|---|---|
| 0xF000 | LED | 쓰기 | 1 쓰면 켜진다 |
| 0xF001 | BUTTON | 읽기 | 눌리면 1 |
| 0xF002 | UART | 쓰기 | 글자 1자 전송 |
| 0xF003 | TIMER | 쓰기 | 카운트 설정 |
| 0x0000 | RAM | 읽기·쓰기 | 일반 메모리 |
UART, 선 하나로 글자를 흘려보낸다
칩 안의 글자 한 자는 8비트 묶음이다. 그런데 바깥으로 보낼 땐 선 8가닥을 깔기 어렵다.
그래서 한 비트씩 줄 세워 선 하나로 흘려보낸다. 이게 직렬(serial)이다. 그 일을 하는 장치가 UART다.
보내는 쪽과 받는 쪽이 같은 속도(baud)로 약속해야 글자가 안 깨진다.
타이머도 같은 식의 주변 장치다. 일정 클럭마다 카운터가 한 칸씩 올라가다 0이 되는 순간 ‘시간 다 됐다’는 신호를 낸다.
UART로 글자를 보내고 타이머로 시간을 잰다. 둘 다 주소 하나로 다루는 I/O다.
인터럽트, 급한 일엔 하던 걸 멈춘다
버튼이 눌렸는지 CPU가 계속 물어보면(폴링) 다른 일을 못 한다. 낭비다.
그래서 거꾸로 한다. 버튼이나 타이머에 급한 일이 생기면 CPU에 신호를 보낸다. 이게 인터럽트다.
신호가 오면 CPU는 하던 명령을 딱 멈추고, 지금 위치(PC)를 적어둔 뒤 정해진 처리 루틴으로 점프한다.
그 처리 루틴이 ISR(인터럽트 서비스 루틴)이다. 짧게 급한 일만 처리하고 끝나면, 적어둔 위치로 돌아가 하던 일을 이어간다. 본 코드는 자기가 멈췄다 돌아온 줄도 모른다.
직접 I/O를 두드려 본다
LED 주소에 1을 쓰면 불이 켜지고, UART 주소에 글자를 쓰면 터미널에 한 자씩 찍힌다.
버튼을 누르면 인터럽트가 걸리고, STEP으로 한 줄씩 ISR이 끼어드는 걸 확인한다. 타이머가 0이 되면 또 다른 인터럽트가 뜬다. 하단 근거 패널에 PC·주소·데이터가 매 STEP 갱신된다.
여기서 정한 주소 맵이 그대로 MyChip의 I/O 맵으로 들어간다.
아직 없음, STEP을 눌러 본다
장치는 전부 메모리 주소 한 칸이다. CPU는 LD/ST만 알면 된다. 급한 일은 인터럽트가 본 코드를 멈추고 ISR로 점프시킨다. 이 주소 맵이 최종 MyChip의 I/O 맵으로 들어간다.
I/O가 칩을 컴퓨터로 만든다
여기까지 만든 CPU와 메모리는 계산만 한다. I/O를 붙여야 비로소 세상과 통한다.
입력은 버튼과 센서, 출력은 LED와 UART, 시간은 타이머, 급한 일은 인터럽트가 맡는다.
이 넷이 메모리 주소 몇 개로 붙으면, 같은 코어가 도어락도 되고 온도계도 된다.
하드웨어는 그대로 두고 주소에 무슨 값을 언제 쓰느냐, 그 소프트웨어만 바꾸면 된다. 이 I/O 맵과 인터럽트 약속이 최종 MyChip의 바깥 인터페이스가 된다.
Q. 인터럽트가 오면 CPU는?
정답은 하던 일을 멈추고 처리 루틴(ISR)으로 점프한다.지금 위치(PC)를 적어둔 뒤 ISR로 뛰어가 급한 일만 짧게 처리한다.
끝나면 적어둔 위치로 돌아와 하던 일을 이어간다. 본 코드는 멈췄다 온 줄도 모른다.
16비트 CPU + RAM
계산만 하는 코어