2025. 2. 23. 16:40ㆍ정보기술/하드웨어
7.3 임베디드 시스템에서 플래시 메모리 활용
임베디드 시스템은 제한된 자원에서 효율적인 데이터 저장과 빠른 부팅을 필요로 하며, 플래시 메모리는 이러한 요구를 충족하는 핵심 저장 장치로 사용된다.
특히 마이크로컨트롤러(MCU)에서는 SPI/NOR 플래시, 임베디드 리눅스 환경에서는 NAND 플래시가 주로 활용된다.
7.3.1 마이크로컨트롤러에서 SPI/NOR 플래시 활용
① SPI/NOR 플래시 개요
- NOR 플래시(NOR Flash)는 빠른 읽기 속도와 높은 신뢰성을 갖춘 비휘발성 메모리로, MCU(마이크로컨트롤러)의 부트 코드 및 펌웨어 저장에 사용됨.
- SPI(NOR) 플래시는 직렬 통신 방식인 SPI(Serial Peripheral Interface)를 이용하여 MCU와 연결되며, 저전력, 소형화가 가능하여 다양한 임베디드 시스템에서 사용됨.
- 빠른 랜덤 액세스를 제공하지만, 쓰기 및 지우기 속도가 NAND 플래시보다 느린 특징을 가짐.
📌 SPI/NOR 플래시 특징
✅ 빠른 랜덤 액세스 속도 → 부팅 코드 및 실행 코드 저장에 적합.
✅ 소형 패키지 지원 → MCU와 쉽게 통합 가능.
✅ 높은 내구성 및 신뢰성 → 자동차, 의료기기, 산업용 장비에서 널리 사용.
✅ 비휘발성 → 전원이 꺼져도 데이터 유지 가능.
📌 SPI/NOR 플래시 사용 예시
- MCU의 부트로더 저장 → 임베디드 펌웨어 및 시스템 초기화 코드 저장.
- 자동차 ECU → 차량용 전자제어장치의 실시간 운영 데이터 저장.
- 스마트카드 및 보안 모듈 → 인증 키 및 보안 코드 저장.
- 산업 자동화 기기 → 공장 자동화 장비 및 로봇 컨트롤러.
② SPI/NOR 플래시를 마이크로컨트롤러에서 사용하는 방법
📌 MCU에서 SPI 플래시 연결 및 코드 예시
1️⃣ SPI 핀 연결 예시
MCU 핀 | SPI 플래시 핀 |
MOSI (Master Out Slave In) | SI (Serial In) |
MISO (Master In Slave Out) | SO (Serial Out) |
SCK (Serial Clock) | SCK (Clock) |
CS (Chip Select) | CS (Chip Select) |
2️⃣ SPI 플래시 제어 코드 (C 언어, HAL 라이브러리 사용)
#include "spi.h"
#include "gpio.h"
#define FLASH_CS_LOW() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET)
#define FLASH_CS_HIGH() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET)
uint8_t SPI_Flash_ReadID(void) {
uint8_t cmd = 0x9F; // JEDEC ID Read Command
uint8_t id[3];
FLASH_CS_LOW();
HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY);
HAL_SPI_Receive(&hspi1, id, 3, HAL_MAX_DELAY);
FLASH_CS_HIGH();
return (id[0] << 16) | (id[1] << 8) | id[2];
}
void SPI_Flash_WriteEnable(void) {
uint8_t cmd = 0x06; // Write Enable Command
FLASH_CS_LOW();
HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY);
FLASH_CS_HIGH();
}
📌 MCU에서 SPI 플래시 활용 시 고려 사항
✅ SPI 클럭 속도 조정 → 플래시 메모리의 최대 SPI 속도와 MCU 지원 속도를 맞출 것.
✅ 쓰기 보호(WP) 핀 활용 → 중요한 데이터가 손상되지 않도록 하드웨어 보호.
✅ 웨어 레벨링 알고리즘 적용 → 일정한 블록만 집중적으로 쓰이지 않도록 제어.
7.3.2 리눅스 환경에서 NAND 플래시 마운트 및 파일 시스템 사용
① NAND 플래시 개요
- NAND 플래시(NAND Flash)는 대용량 데이터 저장이 가능하며, 임베디드 리눅스 환경에서 루트 파일 시스템(rootfs) 및 데이터 저장용으로 사용됨.
- NAND 플래시는 페이지(Page) 단위 쓰기, 블록(Block) 단위 삭제가 필요하며, 파일 시스템에서 이를 관리해야 함.
📌 NAND 플래시 특징
✅ 대용량 데이터 저장 가능 → eMMC, UFS 등에서 사용됨.
✅ 비휘발성 메모리 → 전원이 꺼져도 데이터 유지.
✅ 빠른 연속 쓰기 성능 → 로그 저장, 펌웨어 저장 등에 적합.
✅ 오류 정정 필요 (ECC) → NAND 플래시는 시간이 지나면 데이터 오류 발생 가능.
📌 NAND 플래시 활용 예시
- 임베디드 리눅스 시스템의 루트 파일 시스템 저장
- IoT 및 스마트 디바이스의 데이터 로깅
- 자동차 인포테인먼트 시스템의 멀티미디어 저장소
- 네트워크 장비(라우터, NAS)의 설정 및 로그 저장
② NAND 플래시를 리눅스에서 마운트하는 방법
📌 1️⃣ NAND 플래시 드라이버 확인
dmesg | grep -i nand
ls /proc/mtd # NAND 메모리가 MTD(Memory Technology Device)로 인식되었는지 확인
📌 2️⃣ MTD 파티션 확인 및 포맷
cat /proc/mtd # NAND 플래시의 MTD 디바이스 목록 출력
출력 예시:
dev: size erasesize name
mtd0: 00040000 00010000 "bootloader"
mtd1: 003c0000 00020000 "kernel"
mtd2: 07c00000 00020000 "rootfs"
✅ rootfs(mtd2) 파티션을 마운트할 파일 시스템 포맷 선택
- JFFS2 (Journaling Flash File System 2) → 저널링 지원, 작은 파일 저장 최적화.
- UBIFS (Unsorted Block Image File System) → 최신 NAND 플래시용, 대용량 파일 처리 최적화.
📌 3️⃣ JFFS2 파일 시스템으로 포맷 및 마운트
# JFFS2 포맷 수행
sudo apt install mtd-utils
sudo flash_eraseall /dev/mtd2
sudo mkfs.jffs2 -r /mnt/rootfs -o rootfs.jffs2
# 마운트 수행
sudo mount -t jffs2 /dev/mtdblock2 /mnt/nand
📌 4️⃣ UBIFS 파일 시스템 사용 (최신 NAND 지원)
# UBIFS 포맷 수행
sudo ubiformat /dev/mtd2
sudo ubiattach -m 2
sudo mount -t ubifs ubi0 /mnt/nand
✅ JFFS2 vs UBIFS 비교
파일 시스템 | 장점 | 단점 |
JFFS2 | 저용량 NAND에 적합, 간단한 구조 | 대용량 지원 어려움, 속도 느림 |
UBIFS | 대용량 지원, 고속 성능 | 커널 패치 필요 |
정리
- SPI/NOR 플래시 → MCU 부트로더 저장, 빠른 랜덤 액세스, 신뢰성 높은 데이터 저장.
- NAND 플래시 → 리눅스 기반 임베디드 시스템에서 루트 파일 시스템 및 데이터 저장.
- JFFS2/UBIFS 파일 시스템 → NAND 플래시 전용 파일 시스템으로 최적화된 저장 방식 제공.
'정보기술 > 하드웨어' 카테고리의 다른 글
플래시 메모리 - 8. 고급 주제 (추가 학습) (8.2 데이터 복구와 보안) (0) | 2025.02.23 |
---|---|
플래시 메모리 - 8. 고급 주제 (추가 학습) (8.1 SSD 내부 구조와 성능 최적화) (0) | 2025.02.23 |
플래시 메모리 - 7. 실습 및 응용 (실제 사용 및 분석) (7.2 플래시 메모리 분석 및 벤치마크) (0) | 2025.02.23 |
플래시 메모리 - 7. 실습 및 응용 (실제 사용 및 분석) (7.1 플래시 메모리 장치 사용법) (0) | 2025.02.23 |
플래시 메모리 - 6. 플래시 메모리의 한계와 대체 기술 (6.2 차세대 비휘발성 메모리 기술) (0) | 2025.02.23 |