티스토리 뷰

CPU 동작 시퀀스 — ATmega128로 이해하는 프로그램 실행 원리
임베디드 / OS 기초 시리즈 #3

CPU 동작 시퀀스
프로그램 실행의 원리

코드가 어떻게 하드웨어에서 실행되는지 — ATmega128을 예시로 단계별 해설

ATmega128 CPU 동작 원리 임베디드 입문 Fetch · Decode · Execute
1

사전 준비 단계: ATmega128에 프로그램 장입하기

사용자가 작성한 C/C++ 코드가 ATmega128에서 실제로 실행되기까지는 두 가지 사전 작업이 필요합니다.
컴파일(Compilation)장입(Flashing)입니다.
📐 인포그래픽 — 코드 → 하드웨어 장입 전체 흐름
✍️
① 소스 코드 작성
개발자가 C/C++로 프로그램을 작성합니다.
⚙️
② 컴파일 (Compile)
컴파일러가 소스 코드를 CPU가 이해하는 이진수 기계어(Machine Code)로 변환합니다.
💾
③ 장입 (Flashing)
JTAG·ST-Link 같은 디버거로 기계어 파일을 MCU의 Flash Memory(ROM)에 저장합니다.
메모리 종류 비교
💾 Flash Memory (ROM)
비휘발성✅ 전원 꺼도 유지
용도프로그램 저장
삭제 방식페이지 단위
비용저렴
⚡ RAM (SRAM)
휘발성❌ 전원 끄면 소멸
용도실행 중 변수
삭제 방식바이트 단위
속도빠름
🔒 EEPROM
비휘발성✅ 전원 꺼도 유지
용도설정값 저장
삭제 방식바이트 단위
비용비쌈
💡 프로그램을 Flash Memory에 저장하는 이유: 비휘발성이라 전원이 꺼져도 프로그램이 유지되고, EEPROM보다 저렴하며 페이지 단위 삭제가 가능하기 때문입니다.

2

초기화 단계: 전원 공급 직후 (리셋 벡터)

ATmega128에 전원을 공급하면 CPU는 가장 먼저 "어디서부터 실행을 시작할지"를 알아야 합니다.
이 역할을 하는 것이 리셋 벡터(Reset Vector)Program Counter(PC) 레지스터입니다.
📐 인포그래픽 — 전원 인가 후 리셋 시퀀스 동작 흐름
⚡ 전원 공급 (Power-On)
🔧 Reset Sequence 제어 로직 (하드웨어 회로) 동작
📍 Flash Memory Boot 영역의 Reset Vector 주소 읽기
💾 PC 레지스터에 Reset Vector 주소 강제 주입 (예: 0xE000)
🚀 CPU가 PC가 가리키는 주소(0xE000)부터 명령어 실행 시작!
❓ Q. 왜 PC 레지스터 초기값 설정을 소프트웨어가 하지 않고, 하드웨어 회로가 할까요?
A. 소프트웨어가 실행되려면 PC 레지스터 값이 이미 설정된 상태여야 합니다.
그런데 소프트웨어가 아직 한 줄도 실행되지 않은 시점에는 PC 값이 설정되어 있지 않습니다.
즉, "닭이 먼저냐, 달걀이 먼저냐"와 같은 상황이기 때문에, 소프트웨어 실행 전에 먼저 동작하는 하드웨어 회로가 PC 초기값을 강제로 설정하는 것입니다.

3

핵심 동작 단계: ATmega128 동작 상태 (명령어 사이클)

PC 레지스터 초기값 설정이 완료되면, ATmega128은 전원이 켜져 있는 동안 아래 3단계를 무한히 반복합니다.
이것을 명령어 사이클(Instruction Cycle)이라고 합니다.
📐 인포그래픽 — 명령어 사이클 3단계 한눈에 보기
📥
Step 1
Fetch
명령어 인출
Bus Interface Unit

PC가 가리키는 Flash 메모리 주소에서 명령어를 가져와 IR(Instruction Register)에 저장합니다.

PC 값은 즉시 명령어 크기만큼 증가합니다. (32비트 명령어라면 +4)
🔍
Step 2
Decode
명령어 해석
Instruction Decoder

IR에 저장된 이진수 명령어를 해석합니다.

ADD — 데이터 더하기
STORE — 메모리에 저장
JUMP — 다른 주소로 이동

그에 맞는 제어 신호를 생성합니다.
Step 3
Execute
명령어 실행
ALU

Decode 결과에 따라
ALU가 산술/논리 연산을 수행하거나
레지스터 간 데이터를 이동합니다.

점프 명령이면 PC 값이 목적지 주소로 강제 변경됩니다.
🔄 이 3단계 사이클은 전원이 켜져 있는 한 무한 반복됩니다. 우리가 보는 모든 프로그램 동작은 결국 이 사이클의 반복입니다.
3-1 Fetch 과정
CPU의 Control Unit 내부에 있는 Bus Interface Unit이 PC 레지스터가 가리키는 Flash 메모리 주소에 접근하여 데이터를 읽어온 뒤, IR(Instruction Register)에 저장합니다.

이때 PC 레지스터 값은 명령어를 가져오는 즉시, 현재 명령어의 크기만큼 자동으로 증가합니다.
💡 PC 증가량은 단순히 +1이 아닙니다. 명령어의 실제 바이트(Byte) 크기만큼 증가합니다. 예를 들어 32비트(4바이트) 명령어라면 PC는 +4 증가합니다.
3-2 Decoder 과정
Fetch 과정에서 IR에 저장된 이진수 명령어를 Control Unit의 Instruction Decoder가 읽어서 해석합니다.

이 명령어가 무엇을 하는 명령인지 판단하고, 다음 단계(Execute)에서 필요한 제어 신호(Control Signal)를 생성합니다.
📐 인포그래픽 — 명령어 종류 예시
ADD
두 값을 더해서
레지스터에 저장
STORE
레지스터 값을
메모리에 저장
JUMP
PC를 특정 주소로
강제 변경
3-3 Execute 과정
Instruction Decoder가 해석한 결과에 따라 ALU(산술논리장치)가 연산을 수행하거나, 레지스터 간에 데이터를 이동합니다.

만약 해당 명령어가 점프(JUMP) 명령이라면, 이 단계에서 PC 레지스터 값이 목적지 주소로 강제 변경됩니다.

4

PC 값이 특정 주소로 점프하는 경우

일반적으로 PC 값은 순차적으로 증가하지만, 아래의 경우에는 PC 값이 특정 Flash 메모리 주소로 강제 변경됩니다.
📞
함수 호출
foo() 같은 함수를 부를 때
🔁
반복문 (루프)
for / while 문 처리 시
🔀
조건문
if / else 분기 처리 시
📐 인포그래픽 — 점프 명령 시 PC 변화

예시: 0xE002 주소의 명령 3이 "0xE123으로 점프하라"는 명령인 경우

순차 실행 중 (PC 정상 증가)
0xE000명령 1 실행
0xE001명령 2 실행
0xE002 명령 3JUMP!
PC: 0xE000 → 0xE001 → 0xE002
점프 실행
⬇️
PC = 0xE123
강제 설정!
점프 후 (0xE123으로 이동)
0xE123명령 4 실행 ✅
0xE124명령 5 실행
0xE125명령 6 실행
PC: 0xE123 → 0xE124 → 0xE125 …
⚠️ 점프 명령이 실행되면, 순차적으로 증가했던 PC 값(0xE003)은 무시되고 목적지 주소(0xE123)가 PC에 덮어써집니다. 따라서 다음 Fetch는 0xE123 주소에서 시작됩니다.

5

동작 시퀀스 전체 흐름 예시

아래는 업로드하신 다이어그램을 기반으로, 리셋부터 점프까지의 CPU 전체 동작 흐름을 단계별 표로 정리한 것입니다.
ROM에는 명령1~3이 순서대로 있고, 명령3은 0xE123 주소로 점프하는 명령입니다.
📐 인포그래픽 — CPU 동작 시퀀스 전체 테이블 (이미지 다이어그램 기반)
# 단계 CPU 동작 PC 값 설명
Reset 0xE000 → Program Counter 0xE000 리셋 벡터가 PC에 주입됨. 시작점 결정
Fetch 0xE000 번지의 명령 fetch 명령 1을 Flash에서 IR로 가져옴
PC+1 프로그램 카운터 +1 0xE001 다음 명령 주소로 PC 자동 증가
Decode 명령 1의 디코드 (decoding) 명령 1 해석 후 제어 신호 생성
Execute 명령 1의 실행 ALU 연산 또는 데이터 이동
Fetch 0xE001 번지의 명령 fetch 명령 2를 Flash에서 IR로 가져옴
PC+1 프로그램 카운터 +1 0xE002 다음 명령 주소로 PC 자동 증가
Decode 명령 2의 디코드 (decoding) 명령 2 해석
Execute 명령 2의 실행 ALU 연산 또는 데이터 이동
Fetch 0xE002 번지의 명령 fetch 명령 3(점프 명령)을 IR로 가져옴
PC+1 프로그램 카운터 +1 0xE003 일단 +1 증가 (이후 덮어씌워짐)
Decode 명령 3의 디코드 (decoding) "0xE123으로 점프" 임을 해석
JUMP! 명령 3의 실행 (0xE123 → program counter) 0xE123 PC가 0xE003 무시, 0xE123으로 강제 변경!
Fetch 0xE123 번지의 명령 fetch 점프 후 명령 4를 IR로 가져옴
PC+1 프로그램 카운터 +1 0xE124 0xE123 다음 주소로 증가
Decode 명령 4의 디코드 (decoding) 명령 4 해석
Execute 명령 4의 실행 정상 실행 재개, 이후 계속 반복 ∞
점프 후에도 Fetch → Decode → Execute 사이클은 동일하게 반복됩니다. 프로그램의 흐름만 바뀔 뿐, CPU의 동작 방식 자체는 변하지 않습니다.

6

핵심 요약 & 추가로 알면 좋은 개념

📐 인포그래픽 — 전체 단계 요약 테이블
단계 명칭 주요 역할 관련 하드웨어 비고
Step 0 장입 (Flashing) 컴파일된 기계어를 Flash에 저장 JTAG / ST-Link 전원 꺼도 유지 (비휘발성)
Step 1 Reset 리셋 벡터로 PC 초기값 강제 설정 Reset Sequence 회로 소프트웨어 실행 전, 하드웨어가 처리
Step 2 Fetch PC 주소의 명령어를 IR로 가져옴 Bus Interface Unit PC는 명령어 크기만큼 자동 증가
Step 3 Decode IR의 이진수 명령어를 해석, 제어 신호 생성 Instruction Decoder ADD / STORE / JUMP 등 판별
Step 4 Execute 연산 수행 또는 데이터 이동 ALU 점프 시 PC 값이 목적지 주소로 변경
💡 추가로 알면 좋은 개념
🚀
파이프라이닝 (Pipelining)
현대 CPU는 첫 번째 명령어를 실행(Execute)하는 동안, 두 번째 명령어를 해석(Decode)하고, 세 번째 명령어를 인출(Fetch)합니다.
여러 단계를 동시에 처리해 처리 속도를 크게 향상시킵니다.
🔮
분기 예측 (Branch Prediction)
JUMP 명령이 나올지 안 나올지 CPU가 미리 예상하여 다음에 실행할 명령어를 준비해 두는 기술입니다.
예측이 맞으면 속도가 빨라지고, 틀리면 준비한 내용을 버리고 다시 처리합니다.
Wait State
Flash Memory의 속도가 CPU보다 느려, 데이터를 가져오는 동안 CPU가 잠시 대기하는 현상입니다.
임베디드 개발에서는 이 대기 시간을 줄이는 최적화 설정이 중요합니다.
📌 최종 핵심 정리
장입 C/C++ 코드 → 컴파일 → 기계어 → 디버거로 Flash Memory에 저장
Reset 전원 인가 → 하드웨어 회로가 PC에 Reset Vector 주소 강제 주입 → 시작점 결정
사이클 Fetch → Decode → Execute를 전원이 켜있는 한 무한 반복. 모든 프로그램은 이 사이클의 반복이다.
Jump 함수 호출 / 반복문 / 조건문 → Execute 단계에서 PC 값이 목적지 주소로 강제 변경됨

임베디드 / OS 기초 시리즈 | CPU 동작 시퀀스 편 | 본 자료는 입문자 학습용으로 정리된 내용입니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함