Embedded Software Intro
정의
혼자 동작하는 범용성의 컴퓨터가 아니라, 제품이나 기기에 내장되어 동작하는 컴퓨터 시스템.
임베디드 시스템에서는 컴퓨터가 어떤 기기를 동작시킨다.

-
일반적인 임베디드 시스템의 구성. 제품과의 Interface 역할. 따라서 수행해야 할 일에 대한 이해가 필요하다.
-
임베디드 컴퓨터 : 검은 전선으로 표시된 부분 . 제한된 환경에서 최적화된 기능을 수행한다.
-
CPU : Center Process Unit. 시스템의 연산 및 제어를 담당하는 핵심 요소
-
memory : 프로그램과 데이터를 저장하는 역할. ( Flash memory(비휘발성) + RAM )
-
I/O : 외부와 데이터를 주고받은 interface 역할
-
analog 장치 : 입력 및 출력과 연결되어 있다.
- 임베디드 시스템에서는 아날로그 신호를 받아야 하는 경우가 매우 많다. CPU는 디지털 데이터를 처리하므로 입력에서는 Analog-to-Digital Converter ( ADC ) , 출력에서 Digital-to-Analog Converter ( DAC ) 를 사용한다.

- 초소형 드론 시스템
- 하드웨어 사양과 센서 및 내비게이션
- 임베디드 프로세서 ( OMAP44xx ) 를 활용하여 실시간으로 데이터를 처리하고 무선 통신을 통해 원격 조작이 가능하다. 다중 센서를 통합하여 여러가지 기능을 수행

- 자율주행 자동차의 센서 및 연산 시스템 구조
- 센서 데이터 ( 카메라, LiDAR, Randar ) 를 빠르게 분석하고 실시간으로 주행 판단을 내림
- 이를 위해 GPU, SoC, NNP 등의 고성능 프로세서를 활용
- 센서 융합을 통해 다양한 데이터 통합

- 테슬라의 자율주행 시스템을 구성하는 하드웨어 및 연산 구조
Enbedded SW
임베디드 시스템에서 실행되는 소프트웨어
- 부트로더 : 임베디드 시스템이 전원을 켜면 가장 먼저 실행되는 소프트웨어. 하드웨어 초기화 및 커널을 메모리에 적재
- 운영체제 : 하드웨어 자원 관리, 사용자와 하드웨어의 인터페이스
- 미들웨어 : Application과 OS와의 인터페이스 역할
- 애플리케이션
- 디바이스 드라이버 : OS와 하드웨어의 인터페이스
HardWare - Device Driver - OS - APP - User
펌웨어 ( Firmware ) : ROM, FLASH 와 같이 firm(고정된) 저장장치에서 실행되는 소프트웨어
- 소프트웨어와 하드웨어의 중간 역할
- 펌웨어는 하드웨어를 직접 제어하면서, OS와 Application이 하드웨어를 쉽게 사용할 수 있도록 도와줌
- 따라서, 펌웨어는 특정 하드웨어에 맞게 제작됨
Processor - Cortex M4
임베디드 시스템
일반적인 임베디드 시스템

Flash(Boot) : 비휘발성 메모리, 시스템의 부트로더와 펌웨어(OS) 등을 저장. 시스템이 켜질 때 부트로더가 해당 영역에서 실행됨.
SDRA(Main Memory) : 시스템의 주 메모리(휘발성), CPU가 실행 중인 프로그램 코드와 데이터를 임시로 저장
SoC whit 32-bit RISC Processor : System on Chip CPU, 32비트 RISC 프로세서와 다양한 주변장치등이 적제된 하나의 칩. 시스템의 모든 연산, 제어, 데이터 처리 작업 담당
Serial UART(Universal Asynchronous Receiver/Transmitter) : 직렬 통신을 위한 하드웨어 모듈. 외부 장치와의 데이터 송수신 담당
Controller : 외부장치와의 연결 담당
802.11 Chipset : 무선 네트워크 통신을 담당하는 칩 셋
파일시스템 : 외부에 대용량 데이터를 저장하고 관리
Real time clock (RTC) : 실시간 시계를 제공하는 하드웨어, 전원이 꺼져도 별도의 배터리로 시간을 유지
Serial Port : 외부 장치와의 직렬 통신을 위한 물리적 인터페이스, UART와 연결
임베디드 시스템의 구성
1. Processor – 임베디드 시스템의 중심
- 시스템의 핵심 연산 및 제어를 담당하는 프로세서.
2. Power supply
3. Battery (Optional)
4. Clock
- 프로세서와 시스템의 동작 속도를 조절하는 클럭.
5. Reset
6. Memory
- FLASH: 비휘발성 저장장치 (펌웨어 저장)
- SDRAM: 실행 중인 데이터를 저장하는 메인 메모리
- SRAM: 빠른 액세스가 필요한 임시 데이터 저장소
- 디지털 신호(0과 1)를 주고받는 인터페이스.
8. Analog I/O
- 센서 등의 아날로그 데이터를 처리하는 인터페이스.
9. Communication I/F (Interface)
- 외부 장치와의 통신을 위한 인터페이스 (UART, SPI, I2C, Ethernet 등).
임베디드 시스템의 중심 : Processor
프로세서 : 컴퓨터나 임베디드 시스템에서 연산을 수행하는 핵심 장치. CPU의 상위 개념
프로세서의 종류
CPU – Central Processor Unit
- 명령어 처리회로 중심의 프로세서
- 인텔 i5, i7, Xeon, AMD의 범용성 프로세서
DSP – Digital Signal Processor
- 아날로그 신호를 디지털로 변환하여 필터링, 신호변환 등의 시그널 분석을 위한 고속 프로세서
- 예: TI TMS320, Qualcomm Krait
GPU – Graphic Processing Unit
- 게임용 화면 영상처리 전용 프로세서로 개발되었지만, 현재는 AI 가속기로도 사용됨
- 예: Nvidia, Mali
NPU – Neuromorphic Processing Unit
- 뉴럴넷 계산 전용 프로세서
- 예: HuaWei Kirin, Google TPU
MCU – Microcontroller Unit
- 제어 목적을 위한 소형 프로세서
- 예: Renesas, STM, Cortex-M4
AP – Application Processor
- 앱 실행을 위한 모바일 전용 프로세서
- 예: Exynos, A10 Bionic
임베디드 프로세서의 특징
SoC ( System-On-a-Chip ) 형태
- 다수의 컨트롤러가 한 개의 소형 칩에 적재
- 소형 RISC 프로세서와 다수의 컨트롤러가 SoC에 구현
- 5G 통신칩과 결합하여 스마트폰 기능을 하나의 칩에 구현 ( 원 칩 )
저급~고급 아키텍쳐 제공
- 8비트에서 64비트 멀티코어 아키텍쳐 사용 . 단순한 프로세서부터 고성능 멀티코어 프로세서까지 다양한 아키텍쳐 사용 가능
저전력
- 계산을 위해 소모되는 전력을 절약하는 기능 포함
보안
- SoC 상에 보안 알고리즘을 지원하는 하드웨어 포함.
인공지능
- 뉴럴넷, 딥러닝 가속회로 내장 ( TPU, NPU )
다기능 융합
- 카메라 제어기, 오디오, 비디오 코덱, TV 인터페이스 등
RISC CPU vs CISC CPU
CPU 설계 방식 == ISA 에 따른 차이
| 순번 | 비교항목 | CISC (Complex Instruction Set Computer) | RISC (Reduced Instruction Set Computer) |
|---|
| 1 | 명령어 수 | 많다 | 적다 |
| 2 | 명령어 길이 | 가변적, 다양 | 2, 3가지로 고정 |
| 3 | 명령 실행시간 | 명령어에 따라 가변적 | 일정함 |
| 4 | 범용 레지스터 수 | 적다 | 많다 |
| 5 | 메모리 접근 | 제한 없음 | Load, Store 명령만 허용 |
RISC vs CISC 간단 정리
-
CISC (Complex Instruction Set Computer)
- 명령어 개수가 많고, 다양한 연산이 가능하지만 실행 시간이 일정하지 않음.
- 예시: x86 (Intel, AMD)
-
RISC (Reduced Instruction Set Computer)
- 단순하고 적은 명령어를 사용하여 빠른 실행 속도를 유지함.
- 회로 처리가 단순하여 범용 레지스터 공간이 많다. 공간이 많이 남기 때문
- 예시: ARM (스마트폰, 임베디드 시스템)
-
범용 레지스터가 많으면 많을수록 성능이 향상된다.
- 범용 레지스터가 적음 -> 메모리 접근이 많아져 속도 저하
-
짧은 명령어를 사용하면 코드 밀도가 높아짐. -> 범용 레지스터 넣을 공간 많아짐 -> 속도 상승
-
명령어가 길면 성능이 좋아짐.
레지스터와 메모리의 차이
| 비교 항목 | 레지스터 (Register) | 메모리 (Memory) |
|---|
| 위치 | CPU 내부 | CPU 외부 (RAM, ROM, HDD, SSD) |
| 속도 | 매우 빠름 (나노초 단위) | 상대적으로 느림 (RAM: 나노초~마이크로초, SSD: 마이크로초) |
| 용량 | 매우 적음 (몇 바이트~몇 킬로바이트) | 많음 (RAM: GB 단위, SSD: TB 단위) |
| 전력 소비 | 낮음 (CPU 내부에서 동작) | 상대적으로 높음 (외부 장치) |
| 데이터 유지 | 휘발성 (전원 차단 시 데이터 소멸) | RAM: 휘발성, ROM/SSD: 비휘발성 |
| 역할 | CPU가 즉시 처리해야 하는 데이터를 임시 저장 | 프로그램 실행 및 데이터 저장 역할 |
| 예시 | 프로그램 카운터(PC), 명령 레지스터(IR), 범용 레지스터 | RAM, 캐시, 하드디스크, SSD |
- 레지스터(Register): CPU 내부에 있으며, 연산 속도를 높이기 위해 사용됨. 매우 빠르지만 용량이 작음.
- 메모리(Memory): RAM, ROM, SSD 등 CPU 외부에 존재하며, 프로그램 실행과 데이터 저장을 담당함. 속도는 상대적으로 느리지만 용량이 큼.
ARM processor
ARM 프로세서의 역사
ARM의 의미
- ARM은 "Acorn RISC Machines" 또는 "Advanced RISC Machines"를 의미함.
1. Acorn Computers Ltd – ARM의 시작
- 1978년, 영국 케임브리지에서 작은 컴퓨터 회사로 설립.
- 1979년, Acorn Atom 개발 (2KB RAM, 8비트 6502 마이크로프로세서).
2. ARM – Acorn RISC Machine (1983 – 1985)
- Acorn Computers Limited (Cambridge, England)에서 개발.
- ARM1 & ARM2 프로세서, Sophie Wilson과 Steve Furber가 개발 (1985).
- 관련 영화: BBC 영화 "Micro Men"
3. ARM – Advanced RISC Machine (1990)
- 1990년, Acorn Computers, Apple Computer(현재 애플), VLSI Technology의 합작 투자로 ARM이 Acorn에서 독립(Spin-off)하여 설립됨.
- 애플은 ARM 기술을 원했지만, Acorn의 IP 기반 제품을 원하지 않았음.
- 애플: 현금을 투자
- VLSI Tech: 도구 제공
- Acorn: 12명의 엔지니어 제공
→ 이 과정을 통해 ARM이 탄생.
- ARM의 출발점: 케임브리지의 럭셔리 사무실 → 창고!!
ARM 프로세서의 확장
- obin Saxby (1991년 CEO 취임). 단일 제품에 의존하지 않는 IP 라이선스 기반 비즈니스 모델 제시.
- ARM 프로세서 라이선스 판매
- 선 라이센스비 + 실리콘 로열티 방식 매출
- 이를 통해 많은 반도체 회사의 파트너가 됨.
- ARM 에코시스템 탄생 . 2021년에 240억개의 arm기반 프로세서가 판매.
- 최근엔 RISC-V 프로세서 등장
ARM 프로세서의 제품군
| 계열 | 용도 | 대표 모델 |
|---|
| Cortex-A | 스마트폰, 태블릿, 노트북 | Cortex-A76, Cortex-A55 |
| Cortex-R | 실시간 임베디드 시스템 | Cortex-R52 |
| Cortex-M | 마이크로컨트롤러, IoT | Cortex-M7, Cortex-M4, Cortex-M0 |
armv9 ISA : 슈퍼컴퓨터에 사용하는 회로를 채택, 기능 강
Cortex-M4
Cortex-M4 프로세서 개요
- Cortex-M4 프로세서는 MCU(Microcontroller Unit)이며, FPU(Floating Point Unit)과 DSP(Digital Signal Processing) 기능이 포함됨.
- MCU ( 마이크로 컨트롤러 유닛 ) 기능: C 프로그래밍이 쉬우며, 인터럽트 처리가 빠르고 초저전력 설계.
- FPU ( 부동소수점 연산 유닛 ) 기능: 단정도 부동소수점 연산 지원, 코드 최적화 및 개발 시간 단축.
- DSP ( 디지털 신호 프로세서 유닛 ) 기능: 하버드 아키텍처, 단일 사이클 MAC(Multiply-Accumulate), 배럴 시프터(Barrel Shifter) 지원.
자동차, 오디오 장치, 저전력 임베디드 시스템 등에 사용
Cortex-M4 프로세서 구성
- ARMv7E-M 아키텍쳐 기반
- Thumb-2 명령어만 지원 ( 16bit, 32bit 혼합 명령어 집합, 코드 밀도와 성능 모두 확보 )
- DSP 확장 기능 포함 ( 아닐로그 신호를 하드웨어로 빠르게 처리 할 수 있음 )
- 옵션 FPU(Cortex-M4F) 지원. : 부동소수점 연산장치를 선택적으로 추가할 수 있음
- Thumb-2 명령어 세트 설치되어 있음.
-QADD(포화 연산), UXTB(패킹 및 언패킹), SMULTB(부호 있는 곱셈), ADD8(SIMD 연산) 등의 최적화된 명령어 사용 가능.
Cortex-M4 파이프라인 구조
명령어를 빠르고 효율적으로 사용할 수 있게, 한 데이터 처리 단계의 출력이 다음 단계의 입력으로 이어지는 형태는 아래와 같이 구성된다.
- 3-Stage Pipeline (Fetch → Decode → Execute)
- Prefetch buffer(Cortex M4에 들어있는 플래시 메모리에 명령어를 미리 읽어와 저장해두는 버퍼)에 3개의 word(32bit) 저장 가능.
- 레지스터만 사용하는 명령어의 경우 CPI = 1 (사이클당 1개 명령 실행).
- CPI : Cycles Per Instruction, 명령어 하나를 실행하는 데 걸리는 평균 클록 사이클 수
- 분기 명령어(branch)는 3 사이클 소요.
- 파이프라인에 남아 있는 명령어들을 비움 (FLUSH) : 해당 과정에서는 추가 사이클 필요로 하지 않음
- 새로운 분기 위치에서 명령어를 다시 가져와서, 파이프라인의 각 단계가 한 번씩 모두 채워져야 함 -> 3사이클
사이클 : CPU 시간의 최소 단위
파이프라인 단계
1. Fetch (명령어 가져오기)
- 명령어를 메모리에서 가져와 프리페치 버퍼에 저장.
- 다음에 실행할 명령어를 미리 가져와 성능 향상
- Decode (명령어 해석)
- 명령어를 분석하고 필요한 레지스터 값을 읽음.
- AGU (Address Generation Unit, 주소 생성 장치 ) 동작하여 메모리 접근이 필요한 경우 주소를 계산
- Branch 분기 예측
- 분기 명령어 ( 조건문 , loof ) 실행 시, Branch Forwarding & Speculation 을 통하여 실행 속도 최적화
- Execute (명령 실행)
- 연산 수행 (ALU : Arithmetic Logic Unit에서 Multiply & Divide, Shift 등).
- 메모리 접근이 필요한 경우 Load/Store 수행
--> 파이프라인은 CPU가 명령어를 더 빠르게 처리하기 위하여 명령어 실행 과정을 여러 단계로 쪼기고 각 단계를 병렬로 처리할 때 일어나는 구조이다.
명령어 하나를 처리할 때 Fetch, Decode, Execute로 나눔. 그리고 각 단계는 독립적으로 동시에 작동하게 된다.
첫번째 명령어 :Decode일때
동시에 두번째 명령어는 Fetch단계일수도
Cortex-M4 명령어 집합
- ARMv7-M 아키텍처 기반
- ARMv6-M (Cortex-M0/M1)보다 확장된 명령어 지원.
- Thumb-2 명령어 포함 (16비트 + 일부 32비트 명령어).
```assembly
MOV R0, #1 ; R0에 1을 저장 (16비트)
ADD.W R1, R1, R2 ; R1 = R1 + R2 (32비트, 더 큰 범위 지원)
```

Cortex-M4 명령어 집합 비교 ( ISA, Instruction Set Architechture )
ISA : 프로그램과 하드웨어간의 약속. 소프트웨어가 하드웨어를 제어하는 방법을 결정하는 요소
Instruction Set, Registers, Addressing Modes .. 등 으로 구성
ARM 인스트럭션 집합 (Cortex-A 계열 프로세서)
- 최초에 설계된 32비트 ARM 명령어 집합.
- 모든 명령어가 고정된 32비트 길이를 가짐.
- 조건부 실행을 지원하여 불필요한 분기를 줄임.
Thumb (Cortex-A 계열 프로세서)43
- 기존 ARM의 32비트 명령어 집합을 16비트로 축소한 버전.
- 프로그램 자체의 길이가 줄어든다. 따라서, 실행 속도가 빨라진다.
- 코드 밀도가 높아져 메모리 사용량 절약.
- 일부 성능 저하가 있을 수 있지만, 임베디드 시스템에서 유용.
Thumb-2 (Cortex-M 프로세서) - 사용하는 ISA
- 기존 16비트 Thumb 명령어에 32비트 명령어 일부 추가 : ARM, Thumb 단점 보완
- ARM의 32비트 명령어 집합과 동일한 성능을 유지하면서도 코드 밀도가 높음.
- Thumb 명령어보다 성능이 개선됨.
Thumb-2와 ARM 인스트럭션 집합과의 차이
- 대부분의 Thumb-2 명령어는 조건 실행을 지원하지 않음.
- 기존 ARM 명령어는 대부분 조건부 실행(Condition Execution) 가능.
- Thumb-2는 IT Block (If-Then-Else) 블록을 사용하여 조건 실행을 구현.
분기문을 Pipe Line 이 만나면, CPU가 정신을 못차림 -> 먼저 예측 ( branch prediction, 95%의 확률로 맞춤 ) . 틀리면 pipeline flush 발생
M계열 프로세서의 레지스터 ( 32bit 길이 )

General-purpose register : R0 - R12
-Low register : 16 bit 명령어. R0 - R7
-High register : 8 bit 명령어. R8 - R12
- **Thumb-2 아키텍쳐는 16비트와 32비트 명령어를 혼합하여 사용한다. 16비트 명령어는 길이가 짧기 때문에, 레지스터를 지정하는 데 사용할 수 있는 비트가 제한적이다. ( 3비트만을 사용하여 레지스터를 지정. 따라서 8개 범위의 레지스터만 사용이 가능하다. )T
stack pointer ( MSP, PSP ) :R13
- 스택의 데이터를 push,pop 할 때 자동으로 값을 변경한다.
- MSP ( Main Stack Pointer ) : 디폴트로 지정, CONTROL[1] 인 경우에 사용
- 운영체제의 커널과 exception 핸들러가 실행될 때 사용
- PSP ( Process Stack Pointer ) : CONTROL[0] 인 경우에 사용
Link Register : R14
- 함수 호출 시, 리턴 주소를 저장 :
- 설계 기본 철학 : 메모리에 접근하면 속도가 떨어진다. 모든 연산은 CPU에서 진행하자.
- load, store 제외하곤 메모리 접근 X
- 시스템이 리셋된 경우에는 LR = 0xFFFF_FFFF
Program Counter Register : R15
- CPU가 실행할 다음 명령어의 메모리 저장
- 리셋 시, 0x0000_00004 를 갖는다.
특수 레지스터 : MRS, MSR 명령어로만 접근 가능
MRS 명령어: Move from Special Register , MSR 명령어: Moce to Special Register
특수 레지스터와 범용 레지스터간의 데이터 이동
- Program Status Register
- Interrupt Mask Register
- PRIMASK : NMI ( non-maskable interrupt ) , Hard fault를 제외한 모든 인터럽트를 비활성화시키는 레지스터
- FAULTMASK : NMI를 제외한 모든 인터럽트를 비활성화시키는 레지스터
- BASEPRI : 특정 우선순위 또는 그 이하의 우선순위를 가지는 인터럽트를 비활성화시키는 레지스터
- CONTROL : 스택포인터 및 접근모드의 선택을 위한 레지스터
PSR

- 실행중인 프로그램 상태를 저장.
- Application Program Status Register ( APSR ) + Interrupt Program Status Register ( IPSR ) + Execution Program Status Register ( EPSR ) 로 구성

Condition code flags
ALU에서 연산 후 결과 상태를 나타내는 플래그 비트. CPU가 조건부 실행할 때 사용됨
- N = Negativce result from ALU
- Z = Zero result from ALU
- ALU : Arithmetic Logic Unit . 연산 장치
T bit
프로세서의 실행 모드를 나타냄.
- T = 0 : Processor in ARM state. INVSTATE fault 발생
- T = 1 : Proessor in Thumb state. 이 상태가 계속 유지되어야 한다. 왜? Thumb 명령어 집합(16비트)를 사용하므로.
IT/ICI
if-then 실행 흐름을 관리하는 코드 및 인터럽트 컨트롤 정보 저장
- IF-THEN 조건 코드, Interrupt Control Information ( 인터럽트 발생 시 현재 상태 저장 )
ISR Number
인터럽트 서비스 루틴 번호
- 0 : Thread 모드
- N : Exception 번호
Processor의 동작모드와 접근계층
운영체제와 응용 프로그램이 안정적으로 실행될 수 있도록 제어!
동작 모드
프로그램의 동작 모드를 구분해서 사용
- 쓰레드모드 Thread mode : 응용프로그램을 실행할 때 사용
- 리셋에서 벗어날 때 진입
- CONTROL 레지스터를 이용하여 특권 제어
- PSP 스택포인터 사용
- 핸들러 모드 Handler mode : 예외처리 시 진입
- 예외 핸들러에서 리턴할 때 쓰레드 모드로 전환
- 항상 특권 접근 권한을 가짐 ( privileged )
- MSP 사용
접근 계층
프로세서 명령어, 하드웨어 접근 권한을 구분해서 사용하도록 함.
1. 시스템 안정성 보장 . 만약 모든 코드가 CPU의 중요한 레지스터나 메모리에 접근이 가능하다면 ?
2. 보안 강화 및 악성 코드 방지 . CPU의 중요한 명령어를 실행할 수 없도록 제한.
3. 멀티태스킹 및 RTOS 지원. 한 개의 프로세스(스레드) 에서 메모리를 임의로 변경하면 다른 프로세스도 영향을 받을 수 있음
- 비특권계층 Unprivileged
- MSR ( Move to Special Register ), SRS ( Store Return State ) 명령어의 접근 제한
- CPS ( Change Processor State ) 명령어로 실행이 금지
- 특권 계층 SW로 전환하기 위해 SVC ( SuperVisor Call )인스트럭션을 사용해야 한다.
- 특권계층 Privileged
- 모든 자원을 접근할 수 있으며, 모든 인스트럭션을 사용할 수 있음.
- CONTROL 레지스터에 쓰기 작업을 통하여 특권계층을 변경할 수 있다. 즉 특권⇄비특권
- NVIC( Nested Vectored Interrupt Controller : 인터럽트 우선순위 설정 및 활성/비활성 관리 ) 레지스터들은 거의 모든 특권계층에서 접근 가능하다.
프로그램의 실행모드

- Cortex-M 프로세서는 특권계층 + 쓰레드 모드로 부팅된다.
- 부팅후 대부분 Privileged 쓰레드 모드에서 동작. unprivileged 모드는 거의 사용하지 않음.
ARM 프로세서의 메모리 맵
- Memory Map : 임베디드 프로세서 내부와 외부의 주변장치들은 고유의 주소가 할당되어 있다. 임베디드 보드의 모든 디바이스의 주소할당 정보
- 임베디드 시스템의 내부 및 외부 주변장치들을 접근하기 위해서는 각 장치들의 레지스터를 접근해야 하며, 이 레지스터들에는 정해진 주소가 할당되어 있다.
- 프로세서의 범용 레지스터들은 주소가 아닌 고유 ID로 접근. 그 외에는 주소공간에 할당된 레지스터들을 통해서 접근
- 임베디드 프로그래밍 : 주소공간에 할당된 레지스터를 접근하는 작업

Bit-Banding
- Bit-band alias 영역 내의 1개의 워드 -> Bit-band 영역 내의 1개의 비트로 매핑
- 워드에 0,1을 쓰면 대응되는 비트가 0,1 로 setting 됨.
- 특정 비트를 바꾸려면, 읽기 -> 비트 변경 -> 다시 쓰기 과정을 거쳐야 한다.
- Word : CPU가 한번에 처리 할 수 있는 데이터 단위. CPU 아키텍쳐에 따라 단위가 다름. Cortex-M 기준 4byte, 즉 32bits. 메모리에서 4바이트 단위로 데이터를 처리한다.
- 각 영역은 CPU가 접근하는 메모리에 정의
- 보통 프로세서는 비트를 직접 수정할 수 없고, 8 or 32비트 단위로만 메모리를 접근해야 한다.
- Bit-band 영역 내의 메모리에 대한 비트연산이 빠르고 쉬워진다.
- 이 기능을 이용하면 특정 주변장치의 제어레지스터의 제어비트나 상태비트를 비트단위로 쉽고 빠르게 변경 가능하다.
- 따라서 주변장치의 동작제어를 효율적으로 할 수 있다.

사용 예제
- 0x2000_0000 번지 워드 비트 3을 1로 set 하기
- Read-Modify-Write operation 실행해야함.
- Read the real address ( 0x2000_0000 )
- Modify the desired bit ( retain other bits unchanged ! )
- Write the modified data back
; Read-Modify-Write Operation
LDR R1, =0x20000000 ; R1 = 0x20000000 (R1에 메모리 주소 저장)
LDR R0, [R1] ; R0 = [R1] (메모리로 접근하여 그 값을 R0에 저장)
ORR.W R0, R0, #0x8 ; R0 = R0 | 0x08 (R0의 3번째 비트를 1로 수정)
STR R0, [R1] ; [R1] = R0 (수정된 값을 다시 R1에 저장)
- ARM에서는 Bit-band operation으로 Atomic하게 비트를 접근할 수 있다.
- 주소 0x2200_000C 번지에 1을 저장하면 주소 0x2000_0000 의 비트 3이 1로 세팅됨.
; bit-band operation
LDR R1, =0x2200000C ; R1에 메모리 주소 저장
MOV R0, #1 ; R0을 1로 설정
STR R0, [R1] ; R1이 가르키는 주소에 1을 저장
- Bit band 영역과 Bit Band Alias 영역이 1:1로 매핑
- Bit-band 영역 ( 실제 메모리 영역 ) : 한번에 1byte씩 데이터 처리. 0x20000000 ~
- Bit-band Alias 영역: Bit-band 영역의 각 비트를 1:1 매핑하여, 각 비트를 직접 제어할 수 있는 영역 0x22000000 ~
- 0x22000000 + (Bit-Band 영역 주소 - 0x20000000) * 32(4byte)
- 0x2200000C 주소는 0x20000000 주소의 비트 3에 대응
- 0x22000000 주소는 0x2000000 첫 번째 비트에 대응
- 0x22000004 주소는 0x20000000 두 번째 비트에 대응
- 0x22000007은 4바이트 단위로 매핑되는 Alias 주소의 규칙에 맞지 않기 때문에 존재하지 않습니다. 구체적으로, Alias 주소는 4바이트 간격으로 매핑되므로, 0x22000000, 0x22000004, 0x22000008과 같이 4바이트 간격으로 배치되며, 0x22000007과 같은 주소는 이 규칙에 맞지 않기 때문에 존재하지 않습니다.
- 즉 각 4byte 마다 하나의 비트를 제어할 수 있는 공간이 할당됨.
Bit-Binding 장점
- 보다 빠른 비트 연산
- 인스트럭션 수가 줄어 에너지 절감
- **원자형 동작으로 데이터 오류를 피할 수 있다. Atomic operation, avoid hazards.
- 어떤 값에 대해 Read-Modifiy-Write 인스트럭션 실행 중 인터럽트가 발생한 경우, ISR에서 이 연산에서 사용중인 동일한 메모리를 접근하려는 경우, 데이터 연산에 오류가 발생할 수 있다. : 동시접근의 오류

Cortex-M4 프로그램 이미지
- Vector table : 예외 핸들러의 시작 주소 ( vector ) , 최초 MSP 값
Cortex-M4의 리셋과정
arm 프로세서의 특징 중에서 cics 특성 ?
run타임에 줄었다 늘었다 -> 디버깅이 어렵다
스택이 얼마나 늘지 줄지 컴파일러가 모름 -> stack overflow
CPU내부에서는 레지스터 이름으로 접근