
1) system register
GPR : general purpose reg
SPR : special purpose reg
SFR : special function reg (cf. Peripheral)_주소 있음
2) device regeister
SFR (Special Function Register) : deviceS
configuration : GPIO -> IN/OUT pins
control : turn on/off
data : read/write from and to
status : status
Program Counter(PC) : Fetch Unit(FU)의 소속.
PC는 instruction을 가져올 주소이다.
LS(Load Store)는 CPU와 메모리 사이의 데이터 전송을 함.
연산은 ALU.... 이후엔 RW까지 전달.
레지스터 (Pipe Line)은 왜 하는가? 커지면 효율이 증가할 수 있다.
레지스터의 bit 수는 ALU가 한 번에(word) 처리할 수 있는 너비이다.
: 엄밀하게, BUS의 크기와는 다른 개념이다.
cf. 파이프라인에서 Branch, Hazard의 개념
auth
privileged
non-privileged
mode
thread mode(처음 전원 켰을 때 P) = {NP, P}
handler mode = { P }
stack
main stack
process stack
Execution State : ARM(32bits), Thumb(16bits), Debug
+) 6가지 Operation Mode가 있다.
PSR : CPSR과 SPSR
**모든 ARM 어셈블리 명령어는 조건부 실행(Conditional Execution)이 가능하다.**
💡 주요 명령어 역할 상세 설명
- MOV (Move) : 소스 레지스터의 값을 대상 레지스터로 복사하거나, 상수를 레지스터에 넣습니다. (예 : MOV R0, #10)
- LDR/STR (Load/Store) : LDR R0, [R1]은 R1이 가리키는 메모리 주소의 값을 R0 레지스터로 불러옵니다. STR R0, [R1]은 R0 레지스터의 값을 R1이 가리키는 메모리 주소에 저장합니다.
- BL (Branch with Link) : 함수를 호출할 때 사용합니다. 현재 명령어 다음의 복귀 주소를 LR (R14) 레지스터에 저장한 후 함수 시작 주소로 분기합니다. 함수가 끝나면 BX LR 명령을 사용하여 저장된 복귀 주소로 되돌아옵니다.
- C언어로만 할 수 있는 강점 : bit 연산자 활용하기.
rWDTCON = rWDTCON & ~0x0C (clr)
= rWDTCON & ~(3<<2)
( 즉, rWDTCON &= ~3(<<2); )- rWDTCON = rWDTCON | 0x04 (원하는 비트)
= rWDTCON | (1<<2)
( 즉, rWDTCON |= (1<<2); )








슈미트 트리거 : 두 개의 서로 다른 문턱 전압을 사용하여 잡음이 있거나 느린 아날로그 신호를 깨끗한 디지털 신호로 변환하는 회로
이 회로는 히스테리시스라고 하는 현상 때문에 작동한다. (입력 신호가 상향 임계값과 하향 임계값을 넘어설 때 출력이 바뀌는 것을 의미)
bread board에 스위치 연결 참고 이미지





DMA(Direct Memory Access) : ARM Cortex-M4를 포함한 MCU 시스템에서 CPU의 개입 없이 주변 장치(Peripherals)와 메모리(Memory) 간에 직접 데이터를 전송하는 메커니즘
타이머 인터럽트와 DMA는 서로 다른 목표를 가지고 작동하지만, CPU 부하를 줄이고 데이터 전송의 효율성을 극대화하기 위해 종종 함께 사용
- ⚙️ DMA의 기본 개념
- 목표: 데이터 전송 과정에서 CPU 시간을 확보하고 효율성을 높이는 것입니다.
- 작동 방식: DMA 컨트롤러는 버스 마스터(Bus Master) 권한을 얻어 CPU를 대신해 데이터 버스를 제어하고, 메모리에서 주변 장치로 또는 그 반대로 데이터를 옮깁니다.
- DMA 채널: DMA 컨트롤러는 여러 개의 독립된 채널(Channels)을 가지며, 각 채널은 특정 주변 장치(UART, SPI, ADC, Timer 등)의 데이터 전송을 담당합니다.
- ⏱️ 타이머와 DMA의 연계 작동
- 타이머를 DMA와 함께 사용하는 주된 목적은 주기적인 이벤트나 정밀한 타이밍에 맞춰 데이터를 전송하거나 주변 장치를 제어하는 것입니다.
- 데이터 전송 트리거
타이머 주변 장치(TIMx)는 특정 이벤트가 발생할 때 DMA 요청을 발생시키는 기능을 가지고 있습니다.
업데이트 이벤트 (Update Event): 카운터가 ARR 값에 도달하여 롤오버(Roll-over)될 때 DMA 요청을 트리거합니다. (주기적인 데이터 전송에 사용)
출력 비교 이벤트 (Output Compare Event): 카운터가 CCR 레지스터 값과 일치할 때 DMA 요청을 트리거합니다. (정밀한 타이밍 제어에 사용)
입력 캡처 이벤트 (Input Capture Event): 외부 핀에 펄스가 들어올 때 DMA 요청을 트리거합니다.
- 실제 활용 사례
- 🎯 DMA 사용의 장점
- 타이머 인터럽트와 DMA를 비교할 때, 타이머 인터럽트는 CPU를 잠깐 멈추고 코드(ISR)를 실행하지만, DMA는 CPU를 멈추지 않고 데이터 전송만 합니다.
- 인터럽트 방식: CPU가 ISR을 실행하는 시간이 필요합니다 (문맥 저장/복원 오버헤드). 짧은 데이터 전송에 적합합니다.
- DMA 방식: 전송에 필요한 클럭 사이클 외에 CPU 시간 낭비가 거의 없습니다. 대용량 또는 고속 데이터 전송이 필요한 타이밍 제어에 필수적입니다.
- 결론적으로, 타이머와 DMA의 조합은 특정 시간 또는 주기에 맞춰 CPU 부하 없이 대량의 데이터를 정확하게 전송함으로써 임베디드 시스템의 성능과 실시간성을 비약적으로 향상시킵니다.
host - linux(ubuntu)
target - raspberry pi
- virtualbox -> 6.1.48 -> Windows hosts (virtualbox.org/wiki/Download_Old_Builds_6_1)
- ubuntu -> 20.04 -> 64-bit PC (AMD64) desktop image...(4.1GB)... (releases.ubuntu.com/20.04)

- CLI(Command-Line Interface)
CLI는 가상 터미널 또는 터미널을 통해 사용자와 컴퓨터가 상호 작용을 하는 방식을 뜻한다.
리눅스의 터미널은 키보드의 입력과 모니터의 출력으로 모든 작업을 할 수 있다. 리눅스는 GUI가 개발되기 이전부터 컴퓨터를 조작하기 위해 사용된 프로그램으로 GUI가 할 수 있는 모든 작업을 CLI로 할 수 있다.
파일 시스템 : HDD, SSD등을 저장하고 관리하는 SW.
program -- passive
- 리눅스 필수 명령어 15선
(1) 파일 및 디렉토리 관련 명령어
ls (List)
파일 및 폴더 목록 표시
예시: ls -l (자세한 정보 포함), ls -a (숨김 파일 포함)cd (Change Directory)
디렉토리 이동
예시: cd /home/user (특정 경로로 이동), cd .. (상위 폴더로 이동)pwd (Print Working Directory)
현재 작업 중인 디렉토리 출력
예시: pwdmkdir (Make Directory)
새 디렉토리 생성
예시: mkdir new_folderrm (Remove)
파일 및 디렉토리 삭제
예시: rm file.txt (파일 삭제), rm -r folder (폴더 삭제)
(2) 파일 관리 및 편집 명령어cp (Copy)
파일 및 디렉토리 복사
예시: cp file1.txt file2.txtmv (Move)
파일 및 디렉토리 이동 또는 이름 변경
예시: mv old.txt new.txtcat (Concatenate)
파일 내용 출력
예시: cat file.txtnano / vi
텍스트 파일 편집기
예시: nano file.txt, vi file.txtfind
특정 파일 찾기
예시: find /home -name "test.txt"
(3) 시스템 및 네트워크 관련 명령어ps (Process Status)
실행 중인 프로세스 확인
예시: ps auxkill
특정 프로세스 종료
예시: kill 1234 (PID 1234인 프로세스 종료)top / htop
실시간 프로세스 및 시스템 리소스 확인
예시: top, htopping
네트워크 연결 테스트
예시: ping google.comwget / curl
파일 다운로드 및 HTTP 요청
예시: wget http://example.com/file.zip
- 리눅스 명령어 사용 팁
Tab 자동 완성: 명령어 입력 시 Tab 키를 누르면 자동완성이 가능합니다.- 명령어 히스토리:
history 명령어를 사용하면 이전에 실행한 명령어 목록을 확인할 수 있습니다.- 명령어 조합 사용:
| (파이프) 연산자를 활용하면 여러 명령어를 조합하여 사용할 수 있습니다. 예: ps aux | grep firefox



root user 바꾸기.
sudo -s : password for (ubuntu) : 수퍼유저로.
root 계정 (#), 일반 계정 ($)
echo $PS1
user 추가? : adduser(useradd가 오리지널)
useradd -m (mgc)
root에서 passwd mgc 설정
su(switch user) : ubuntu나 mgc로 이동!
중간에 whoami로 계정 설정 확인하기.
deluser : 생성했던 사용자 삭제.
passwd 변경하다가 cmd 명령어 나가고 싶으면?
(ctrl+C) or (ctrl+D)로 빠져나오기.
sudo chown -R * ubuntu:ubuntu 명령어? group
파일과 디렉터리를 구분해라.
UGO(?) user-group-others
✅ 1. 필수 기반 지식 (모든 임베디드 리눅스 개발자 공통)
1) 리눅스 기본기
셸 스크립트(bash), 파일 시스템 구조
systemd 서비스 관리
프로세스/스레드, 메모리 관리, IPC 기초
파일 I/O, 소켓 통신
SSH, SCP, rsync 같은 원격 관리 도구
📌 이 정도는 RPi에서 직접 실습하며 손에 익히면 충분.
✅ 2. 시스템 프로그래밍 계층 (실무 핵심)
1) C/C++ 시스템 프로그래밍
POSIX API
pthread, epoll, select
mmap, shared memory, message queue
low-level socket programming
2) 디바이스 제어/보드 레벨 API
GPIO, PWM, UART, I2C, SPI
(RPi의 경우) pigpio / wiringPi / sysfs / libgpiod
📌 ARM 리눅스 응용을 개발하는 사람 중 80%가 여기까지 필요함.
✅ 3. 커널 & 드라이버 레벨
커널을 꼭 수정해야 하는가? → 응용/제품에 따라 다름
반드시 필요한 경우
직접 만든 센서/디바이스 드라이버 필요
상용 제품에서 부팅 최적화, 커널 로그/보안 커스터마이징
특수한 DMA, 고속 데이터 처리 장치 제어
📌📌📌📌📌
<공부 범위>
Linux 커널 구조
Device Tree 이해 & 수정
Character device driver 제작
Platform Driver/Device Model
인터럽트 처리, kernel thread, wait queue
DMA, MMIO, register map
- 커널 드라이버까지 가면 완전한 임베디드 엔지니어 영역.
라즈베리파이를 제대로 “보드 수준”에서 다루고 싶다면 필수.
✅ 4. 빌드 시스템 & 배포
임베디드 리눅스 빌드 시스템
Yocto Project (실무 표준)
Buildroot (작고 간단한 embedded image 제작)
Cross compilation toolchain (arm-linux-gnueabihf-gcc)
U-Boot (부트로더)
📌 라즈베리파이는 기본 OS를 쓸 수도 있지만, 제품 개발이라면 Yocto/Buildroot를 알아야 함.
RPi 공식 이미지보다 훨씬 가볍고 원하는 패키지만 넣은 minimal Linux 제작 가능.
✅ 5. 고급 응용 분야 기술
- 네트워크/IoT
MQTT, Websocket, REST API
TLS/SSL 인증서, 보안 부팅
OTA(Over-the-air) 업데이트 시스템 설계
멀티미디어/카메라
GStreamer 파이프라인
V4L2(Video for Linux2)
하드웨어 가속 코덱
AI/Edge
TensorFlow Lite, ONNX Runtime
ARM NEON 최적화
라즈베리파이 GPU(V3D) 사용- 로보틱스
ROS 2 + RPi
실시간 성능 튜닝
CAN, 모터 드라이버 제어
📌 이 부분은 도메인별로 선택해서 확장하면 됨.



🛠️ 3단계: 임베디드 리눅스 심화 및 개발 환경 구축
- 시스템 프로그래밍 :
프로세스 및 스레드: 프로세스 생성, IPC(Inter-Process Communication), 멀티스레딩(pthreads) 이해.
- 소켓 프로그래밍:
네트워크 통신을 위한 기본적인 서버/클라이언트 프로그램 작성.
디버깅 도구: GDB 등 디버깅 툴을 사용해 프로그램의 오류를 분석하고 해결하는 능력.
- 장치 드라이버 (Device Driver) 기초:
커널 모듈: 리눅스 커널에 모듈을 로드하고 언로드하는 방법.
- 간단한 디바이스 드라이버 작성:
GPIO나 간단한 I/O 장치를 제어하는 드라이버 맛보기.
- 크로스 컴파일 (Cross-Compilation):
툴체인 (Toolchain): PC(Host)에서 ARM(Target)용 실행 파일을 만드는 환경 구축 및 사용법.
- 부트로더 (Bootloader) 및 커널 컴파일 (Kernel Compilation) 기초:
U-Boot나 리눅스 커널을 직접 빌드하고 라즈베리 파이에 올리는 과정 이해. (선택적이지만 중요한 심화 과정)
- 빌드 시스템 (Build System) 맛보기:
Make 및 CMake를 사용한 프로젝트 빌드 자동화.
- Yocto Project나 Buildroot와 같은 임베디드 리눅스 빌드 시스템의 개념 이해.
🐚 Bash 셸 개념 및 현업 기술 스택
Bash(Bourne Again SHell): 리눅스 환경에서 사용자 명령어 해석기(Command Interpreter) 역할을 하는 가장 기본적이고 강력한 도구. Bash(.sh)는 인터프리터 언어.
임베디드 리눅스 환경에서도 시스템 설정, 테스트, 자동화 등에 광범위하게 사용되므로 숙달이 필수.
🐚 .sh 파일 (Shell Script) :
여러 명령어를 순차적으로 실행하기 위해 작성된 텍스트 파일.
-> 파일 처리, 프로그램 실행 등 다양한 작업을 자동화하는 데 사용되며, bat 파일의 리눅스 버전과 유사하다고 볼 수 있음.
- 쉘 스크립트: 운영체제(OS)의 커널과 사용자 사이의 인터페이스 역할을 하는 '쉘(Shell)'에서 실행되도록 작성된 스크립트.
- 자동화: .sh 파일에 작성된 명령어들은 파일 생성, 프로그램 실행, 문자열 처리 등 반복적인 작업을 자동으로 수행할 수 있도록 해줌.
- 실행: .sh 파일 자체를 직접 실행하거나 source 명령을 사용해 현재 쉘에서 실행할 수 있음.
🐚 .sh 파일의 특징
🐚 .sh 스크립트 실행
./your_script.sh (현재 디렉토리에 있을 때)/home/user/scripts/your_script.shbash your_script.sh📄 .sh 파일의 유형 (Type)
Ubuntu 환경에서 .sh 파일을 만들었을 때 'plain text document'로 표시되는 것은 정상입니다.
-> 셸 스크립트(.sh) 파일은 실행 가능한 프로그램 파일(예: .exe 또는 바이너리 파일)이 아니라, 단순히 Bash 명령어들이 순서대로 나열된 텍스트 파일이기 때문입니다.
-> 파일 시스템이 이 파일에 실행 권한(chmod +x)이 부여된 것을 확인해야만 운영체제가 이를 '스크립트' 또는 '실행 가능한 파일'로 인식하고 실행할 수 있게 됩니다. 실행 권한을 부여한 후에도 파일 유형 자체는 여전히 텍스트 문서이지만, 시스템은 다르게 처리합니다.
-> 실행 권한을 부여하는 방법:
(Bash) chmod +x mgc_script.sh
다음에는,./mgc_script.sh명령으로 실행.


Bash 쉘 스크립트는 리눅스라는 거대한 공장을 돌리는 '자동화 제어 장치'
코드 설명:
#!/bin/bash: (가장 중요) 이 파일이 Bash 쉘로 실행되어야 한다는 뜻입니다. (셔뱅)
#: 주석입니다. 실행되지 않고 설명 메모를 남길 때 씁니다.
echo: 화면에 글자를 출력하는 명령어입니다.
read: 사용자가 키보드로 입력한 값을 받아서 변수(user_name)에 저장합니다.
$user_name: 저장된 변수의 내용을 꺼내서 보여줍니다.
date: 현재 시간을 알려주는 리눅스 명령어입니다.
- 4단계 Bash 스크립트 레벨업 로드맵
(1) 흐름 제어 (Logic & Flow Control)
(2) 시스템 모니터링 및 관리 (System Admin)
(3) 텍스트 데이터 처리 (Text Processing)
(4) 인수 전달 및 에러 처리 (Robustness)