VEDA 6주차 공부기록 (25.11.24~25.11.28)

gichang·2025년 11월 23일

2526VEDA

목록 보기
3/13
post-thumbnail

[ 25.11.24 (월) ]

< 임베디드 ARM 아키텍처 >

01 Register

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의 개념

  • 프로그램 최적화(Optimizing)는 결국 (속도vs사이즈) 문제이다.

02 about M

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

  • SVC 모드에서만 접근할 수 있다.
  • "N Z C V" IF T mode 존재.
  • Carry와 Borrow의 개념은 다르다. (cf. 뺄셈)

03 ARM assembly 언어

**모든 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); )

04 GPIO (cf. MODER, HAL 함수)

  • GPIO (General Purpose Input/Output) : 임베디드 시스템에서 가장 기본적이면서도 중요한 기능으로, 마이크로컨트롤러(MCU)가 외부 장치 및 회로와 디지털 신호를 주고받을 수 있게 해주는 범용 입출력 포트


  • 슈미트 트리거 : 두 개의 서로 다른 문턱 전압을 사용하여 잡음이 있거나 느린 아날로그 신호를 깨끗한 디지털 신호로 변환하는 회로

  • 이 회로는 히스테리시스라고 하는 현상 때문에 작동한다. (입력 신호가 상향 임계값과 하향 임계값을 넘어설 때 출력이 바뀌는 것을 의미)

    bread board에 스위치 연결 참고 이미지

[ 25.11.25 (화) ]

< ARM 보드 활용 >

01 인터럽트

02 타이머

- 기존의 폴링(Polling) 방식으로 동작하던 LED 제어 코드를 제거하고, TIM3 타이머가 500ms(0.5초) 주기로 인터럽트를 발생시켜 LED를 자동으로 켜고 끄는 코드를 추가


1. ⚙️ TIM3 인터럽트 설정 (main 함수) USER CODE BEGIN 2 섹션에 LED 설정과 함께 TIM3 타이머 초기화 코드를 추가하고, 기존의 PA8/PA9 제어 코드는 유지합니다 (PA9 설정만 재활용).

  1. 🔁 메인 루프 정리 (main 함수)
    while(1) 루프 내의 폴링 방식 LED 제어 코드를 모두 제거하고 비워둡니다. 이제 LED 제어는 오직 인터럽트에 의해서만 이루어집니다.

  1. 🚨 인터럽트 서비스 루틴 (ISR) 추가
    main.c 파일의 가장 아랫부분 (#ifdef USE_FULL_ASSERT 위 또는 / USER CODE BEGIN 4 / 아래)에 TIM3_IRQHandler 함수를 추가해야 합니다.

  1. 최종 내용

03 DMA(Direct Memory Access)

  • DMA(Direct Memory Access) : ARM Cortex-M4를 포함한 MCU 시스템에서 CPU의 개입 없이 주변 장치(Peripherals)와 메모리(Memory) 간에 직접 데이터를 전송하는 메커니즘

  • 타이머 인터럽트와 DMA는 서로 다른 목표를 가지고 작동하지만, CPU 부하를 줄이고 데이터 전송의 효율성을 극대화하기 위해 종종 함께 사용

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

[ 25.11.26 (수) ]

< 리눅스 멀티미디어 프로그래밍(영상)- 타깃 보드의 프레임버퍼를 이용한 이미지 출력- 카메라와 Video4Linux2 프로그래밍 >

01 Linux

setupenv

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)

02 리눅스 이해하기

셸과 command 방식. (명령어) CLI는 매우 빠르다.

  • CLI(Command-Line Interface)

CLI는 가상 터미널 또는 터미널을 통해 사용자와 컴퓨터가 상호 작용을 하는 방식을 뜻한다.
리눅스의 터미널은 키보드의 입력과 모니터의 출력으로 모든 작업을 할 수 있다. 리눅스는 GUI가 개발되기 이전부터 컴퓨터를 조작하기 위해 사용된 프로그램으로 GUI가 할 수 있는 모든 작업을 CLI로 할 수 있다.

파일 시스템 : HDD, SSD등을 저장하고 관리하는 SW.
program -- passive

리눅스 명령어

  1. 리눅스 필수 명령어 15선

(1) 파일 및 디렉토리 관련 명령어

  • ls (List)
    파일 및 폴더 목록 표시
    예시: ls -l (자세한 정보 포함), ls -a (숨김 파일 포함)
  • cd (Change Directory)
    디렉토리 이동
    예시: cd /home/user (특정 경로로 이동), cd .. (상위 폴더로 이동)
  • pwd (Print Working Directory)
    현재 작업 중인 디렉토리 출력
    예시: pwd
  • mkdir (Make Directory)
    새 디렉토리 생성
    예시: mkdir new_folder
  • rm (Remove)
    파일 및 디렉토리 삭제
    예시: rm file.txt (파일 삭제), rm -r folder (폴더 삭제)


    (2) 파일 관리 및 편집 명령어
  • cp (Copy)
    파일 및 디렉토리 복사
    예시: cp file1.txt file2.txt
  • mv (Move)
    파일 및 디렉토리 이동 또는 이름 변경
    예시: mv old.txt new.txt
  • cat (Concatenate)
    파일 내용 출력
    예시: cat file.txt
  • nano / vi
    텍스트 파일 편집기
    예시: nano file.txt, vi file.txt
  • find
    특정 파일 찾기
    예시: find /home -name "test.txt"


    (3) 시스템 및 네트워크 관련 명령어
  • ps (Process Status)
    실행 중인 프로세스 확인
    예시: ps aux
  • kill
    특정 프로세스 종료
    예시: kill 1234 (PID 1234인 프로세스 종료)
  • top / htop
    실시간 프로세스 및 시스템 리소스 확인
    예시: top, htop
  • ping
    네트워크 연결 테스트
    예시: ping google.com
  • wget / curl
    파일 다운로드 및 HTTP 요청
    예시: wget http://example.com/file.zip

  1. 리눅스 명령어 사용 팁
  • Tab 자동 완성: 명령어 입력 시 Tab 키를 누르면 자동완성이 가능합니다.
  • 명령어 히스토리: history 명령어를 사용하면 이전에 실행한 명령어 목록을 확인할 수 있습니다.
  • 명령어 조합 사용: | (파이프) 연산자를 활용하면 여러 명령어를 조합하여 사용할 수 있습니다. 예: ps aux | grep firefox

03 소프트 링크, 하드 링크

[ 25.11.27 (목) ]

< 리눅스 멀티미디어 프로그래밍(영상)- 영상 처리와 OpenCV- OpenCV 기본 프로그래밍 >

01 Linux 사용자, 사용자 그룹

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

02 About 임베디드 개발자와 Linux

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, 모터 드라이버 제어
    📌 이 부분은 도메인별로 선택해서 확장하면 됨.

[ 25.11.28 (금) ]

< 리눅스 멀티미디어 프로그래밍(영상)- OpenCV 영상 처리 프로그래밍- OpenCV를 이용한 얼굴 인식 >

01 ...Linux... ARM, Raspberry Pi

🛠️ 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와 같은 임베디드 리눅스 빌드 시스템의 개념 이해.

02 Bash 쉘의 개념

🐚 Bash 셸 개념 및 현업 기술 스택

  • Bash(Bourne Again SHell): 리눅스 환경에서 사용자 명령어 해석기(Command Interpreter) 역할을 하는 가장 기본적이고 강력한 도구. Bash(.sh)는 인터프리터 언어.

  • 임베디드 리눅스 환경에서도 시스템 설정, 테스트, 자동화 등에 광범위하게 사용되므로 숙달이 필수.

🐚 .sh 파일 (Shell Script) :
여러 명령어를 순차적으로 실행하기 위해 작성된 텍스트 파일.
-> 파일 처리, 프로그램 실행 등 다양한 작업을 자동화하는 데 사용되며, bat 파일의 리눅스 버전과 유사하다고 볼 수 있음.

  • 쉘 스크립트: 운영체제(OS)의 커널과 사용자 사이의 인터페이스 역할을 하는 '쉘(Shell)'에서 실행되도록 작성된 스크립트.
  • 자동화: .sh 파일에 작성된 명령어들은 파일 생성, 프로그램 실행, 문자열 처리 등 반복적인 작업을 자동으로 수행할 수 있도록 해줌.
  • 실행: .sh 파일 자체를 직접 실행하거나 source 명령을 사용해 현재 쉘에서 실행할 수 있음.

🐚 .sh 파일의 특징

  • 확장자: 파일명 뒤에 .sh라는 확장자가 붙어 쉘 스크립트 파일임을 나타냄.
  • 명령어: 파일 안에는 여러 쉘 명령어가 한 줄씩 작성되어 있으며, 순서대로 실행된다.
  • 사용법: .sh 파일을 실행하려면 실행 권한을 부여한 후 ./.sh 형식으로 실행하거나, source 명령어를 사용한다.

🐚 .sh 스크립트 실행

  • 상대 경로 실행: ./your_script.sh (현재 디렉토리에 있을 때)
  • 절대 경로 실행: /home/user/scripts/your_script.sh
  • Bash로 직접 실행 (권한이 없어도 가능): bash your_script.sh

📄 .sh 파일의 유형 (Type)
Ubuntu 환경에서 .sh 파일을 만들었을 때 'plain text document'로 표시되는 것은 정상입니다.
-> 셸 스크립트(.sh) 파일은 실행 가능한 프로그램 파일(예: .exe 또는 바이너리 파일)이 아니라, 단순히 Bash 명령어들이 순서대로 나열된 텍스트 파일이기 때문입니다.
-> 파일 시스템이 이 파일에 실행 권한(chmod +x)이 부여된 것을 확인해야만 운영체제가 이를 '스크립트' 또는 '실행 가능한 파일'로 인식하고 실행할 수 있게 됩니다. 실행 권한을 부여한 후에도 파일 유형 자체는 여전히 텍스트 문서이지만, 시스템은 다르게 처리합니다.
-> 실행 권한을 부여하는 방법:
(Bash) chmod +x mgc_script.sh
다음에는, ./mgc_script.sh 명령으로 실행.

03 Bash 쉘로 학습해보기.

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)

04 쉘 변수, 환경 변수

05 리디렉션(Redirection)

06 파이프라인(Pipe Line)

0개의 댓글