NVP: 전원이 끊겨도 계산이 이어지는 비휘발성 프로세서 아키텍처

에너지 하베스팅·배터리 제약 임베디드 환경에서 전원 중단에도 계산을 지속시키는 비휘발성 프로세서(NVP)의 구조와 체크포인트·커밋 메커니즘을 정리한다.

2026-08-13 · 최초 발행 2025-11-28

에너지 하베스팅으로 돌아가는 IoT 센서나 배터리 용량이 극도로 제한된 웨어러블 디바이스는 전원이 예고 없이 끊긴다. 일반적인 MCU라면 전원이 돌아왔을 때 처음부터 재부팅해야 하고, 그 사이의 계산 상태와 데이터는 사라진다. 비휘발성 프로세서(Nonvolatile Processor, NVP)는 이 문제를 프로세서 수준에서 풀기 위한 아키텍처다. 비휘발성 메모리와 비휘발성 플립플롭을 코어에 통합해, 전력 상실 이후에도 재부팅 없이 논리적으로 연속된 실행을 보장한다.

무엇을 보장하는 아키텍처인가

NVP는 전력 상실 이후에도 레지스터·프로그램 카운터·중간 상태를 비휘발성 요소에 저장·복구해, 재부팅 없이 논리적 연속 실행을 보장하는 프로세서 및 런타임 아키텍처를 총칭한다. 구성 요소는 비휘발성 레지스터/플립플롭(NVFF), 온칩 비휘발성 메모리(FRAM/MRAM/ReRAM 등), 전력 이벤트 감지 회로(PMIC/보조 커패시터), 그리고 체크포인트·복구·커밋을 관리하는 런타임 계층이다. 목표는 세 가지로 요약된다 — 전력 이벤트의 비가시화(interruption transparency), 데이터 일관성(atomicity/consistency), 내구성(wear leveling)의 동시 달성이다.

구성 요소가 맞물리는 방식

  • 비휘발성 상태 보존 회로: NVFF가 레지스터 파일·프로그램 카운터·핵심 FSM 상태를 수 µs 단위로 스냅샷한다. 전력 임계 도달 시 하드웨어 어시스트로 자동 저장하고, 복귀 시 자동 복원한다.
  • 트랜잭션성 체크포인트와 원자적 커밋: 더티 상태를 저널(로그)로 먼저 기록한 뒤 커밋 비트 전환으로 원자성을 보장한다. CRC/ECC와 버전 번호로 부분 기록이나 전력 중단 발생 시 롤백·롤포워드를 처리한다.
  • 에너지 이벤트 기반 태스크 스케줄링: 슈퍼커패시터 전압이나 내부 게이지로 에너지 예산을 추정해 태스크 단위로 실행한다. 멱등(idempotent) 태스크와 경계 기반 커밋으로 재실행 안전성을 확보한다.
  • 내구성·수명 관리: 블록 회전(wear leveling), 쓰기 합치기(write coalescing), 가비지 수집을 적용한다. NVM 특성에 따라 FRAM(속도·저전력)과 MRAM(내구성·무단락) 중 선택한다.
  • 무결성·보안 보강: 전력 중단 내성 PRNG 시드·카운터를 비휘발성으로 유지해 재부팅 공격을 저감한다. 무결성 태그, 재부팅 카운터, 실패 주기 로깅으로 신뢰성을 가시화한다.

파이프라인과 장애 처리 흐름

입력은 에너지 하베스터·센서 데이터·전력 상태 이벤트다. 처리 단계는 에너지 여유 판정 → 복구/체크포인트 → 태스크 실행 → 저널 기록 → 원자적 커밋 순으로 진행되고, 출력은 외부 인터페이스 송신·센서 제어·상태 지표 업데이트다.

전력 임계가 하강하면 즉시 체크포인트 경량화 경로로 진입하고, 부분 기록이 있었다면 복구 시점에 저널을 검증한 뒤 롤백한다. 커밋 검증이 실패하면 백업 사본을 선택하고, 재시도 횟수를 초과하면 읽기 전용 모드로 전환하며 알람을 기록한다. 태스크 경계에서는 소프트락(논리적 락 비트)을 설정한 뒤 저널에 신규 값을 쓰고, CRC를 검증하고, 커밋 비트를 전환하고, 락을 해제하는 순서를 따른다. 인터럽트나 전력 이벤트는 커밋 비트를 기준으로 일관성을 판단하며, 중복 실행을 허용한다.

아니오아니오아니오입력: 에너지·센서 데이터전력 여유 임계치 초과?체크포인트 경량저장(NVFF/NVM)딥슬립/대기복구 필요 플래그?저널 검증·복구태스크 실행(Idempotent)저널에 신규 상태 기록 + CRC검증 성공?롤백·재시도/격하원자적 커밋 비트 전환출력: 통신/제어/상태 업데이트

소프트웨어 런타임 설계

메모리 구조는 역할별로 나눈다. 코드/상수는 XIP 또는 플래시에 읽기 전용으로 배치하고, 가변 데이터는 비휘발성 NVM 영역(.nvdata)과 초기화가 필요 없는 .noinit으로 분리한다. 저널/메타데이터는 전용 NVM 서브섹션에 순환 로그와 버전/CRC 필드로 유지한다.

태스크는 입력 → 순수 계산 → 커밋의 3단계로 분리해, 입력을 재취득하고 재실행하는 것을 허용하는 구조를 채택한다. 외부 부작용(I/O)은 커밋 이후 지연 실행하거나 멱등 API로 처리한다.

아래는 ARM Cortex-M 계열, GCC 11+, 메모리 매핑형 NVM(FRAM/MRAM)을 전제로 한 예제다. 링커 스크립트가 .nvdata/.noinit을 NVM에 매핑해야 동작한다.

// build: arm-none-eabi-gcc -O2 -std=c11 main.c -T your_linker.ld
#include <stdint.h>
#include <stdbool.h>

// 링커 스크립트에서 .nvdata/.noinit을 NVM에 매핑 필요
#define NV __attribute__((section(".nvdata")))
#define NOINIT __attribute__((section(".noinit")))

typedef struct {
    uint32_t version;
    uint32_t value;
    uint32_t crc;
} nv_kv_t;

static NV nv_a = {0}, nv_b = {0};
static NOINIT uint8_t active_slot; // 0: A, 1: B
static inline uint32_t crc32(const void* p, size_t n){ // 단순 CRC 대체
    const uint8_t* b = (const uint8_t*)p; uint32_t c=0;
    for(size_t i=0;i<n;i++) c = (c*16777619u) ^ b[i];
    return c;
}
static inline void nvm_barrier(void){ __asm__ volatile ("" ::: "memory"); }

// 활성 사본 포인터
static nv_kv_t* active(void){ return active_slot ? &nv_b : &nv_a; }
static nv_kv_t* inactive(void){ return active_slot ? &nv_a : &nv_b; }

// 원자적 커밋(2단계): 로그 쓰기 -> 검증 -> 활성 전환
bool nv_commit(uint32_t new_value){
    nv_kv_t* inact = inactive();
    uint32_t ver = active()->version + 1;
    inact->version = ver;
    inact->value = new_value;
    inact->crc = crc32(&inact->version, sizeof(uint32_t)*2);
    nvm_barrier(); // NVM 쓰기 가시화

    // 검증
    if(inact->crc != crc32(&inact->version, sizeof(uint32_t)*2)){
        return false;
    }
    // 커밋 비트 전환(멱등)
    active_slot ^= 1u;
    nvm_barrier();
    return true;
}

// 복구: 두 사본 중 CRC 유효·최신 버전 선택
void nv_recover(void){
    bool va = (nv_a.crc == crc32(&nv_a.version, sizeof(uint32_t)*2));
    bool vb = (nv_b.crc == crc32(&nv_b.version, sizeof(uint32_t)*2));
    if(va && vb){
        active_slot = (nv_b.version >= nv_a.version) ? 1 : 0;
    }else if(va){
        active_slot = 0;
    }else if(vb){
        active_slot = 1;
    }else{
        // 초기화: 안전 기본값
        nv_a.version = 0; nv_a.value = 0; nv_a.crc = crc32(&nv_a.version, 8);
        active_slot = 0;
    }
}

// 예시 태스크: 센서 평균 계산 후 상태 커밋
extern bool power_good(void);     // 전력 여유 감지(보드 의존)
extern uint32_t read_sensor(void);// 센서 읽기(멱등)
void task_avg(void){
    // 입력 수집 및 순수 계산
    uint32_t s1 = read_sensor();
    uint32_t s2 = read_sensor();
    uint32_t avg = (s1 + s2) / 2;

    // 커밋 경계
    if (!nv_commit(avg)){
        // 실패 시 재시도 혹은 격하 모드
        (void)nv_commit(avg);
    }
}

int main(void){
    nv_recover();
    while(1){
        if(!power_good()){
            // 전력 부족: 하드웨어 NVFF가 코어 상태 저장한다고 가정
            __asm__ volatile ("wfi"); // 대기 진입
            continue;
        }
        task_avg();
        // 커밋 이후에만 외부 부작용(I/O) 수행
        // send(avg) 등
    }
}

실제 플랫폼에서는 NVM 쓰기 지연, 캐시/버스 플러시, 중단 가능 구간 최소화, 전력임계 ISR 연계가 추가로 필요하다. 최신 보드·SDK별 API는 별도 확인이 필요하다.

전통적 접근과의 차이

지표 전통 MCU(SRAM+배터리) MCU+NVM 체크포인트(소프트) NVP(하드+런타임 통합)
성능(처리율) 높음, 중단 없음 중간, 체크포인트 오버헤드 높음, NVFF로 미세 오버헤드
에너지 효율 배터리 의존 중간, NVM 쓰기 비용 높음, FRAM/MRAM 활용
상태 일관성 전원상실 시 손실 소프트 보장, 휴먼에러 가능 하드/RT 보장, 원자 커밋
복구 지연 수 ms~재부팅 수 ms~수백 ms 수 µs~수 ms
내구성/수명 배터리 수명 이슈 NVM 마모 리스크 wear leveling로 완화
운영 편의 단순 주기 설계 필요 초기 복잡, 운영 단순

수치는 플랫폼·부하에 따라 상이하며 벤더 문서 및 실측 기반 검증이 필요하다.

어디에 쓰이는가

  • 에너지 하베스팅 IoT 노드: 태양광·진동·열전 기반 센싱·로깅·간헐 통신을 지속 보장한다.
  • 산업 설비 모니터링: 전력이 불안정한 환경에서 이벤트 손실 없이 상태를 추적한다.
  • 의료·웨어러블 장치: 체내·피부 부착 디바이스가 간헐 전원에서도 안정 동작한다.
  • 엣지 ML 전처리: 전력 예산 내에서 프레임 단위 멱등 추론 파이프라인을 유지한다.
  • 보안 로거·블랙박스: 전원 차단 공격에도 원자적 기록과 무결성을 유지한다.

도입을 저울질할 때

전력 프로파일(하베스터 출력, 슈퍼캡 용량, 임계 전압)을 먼저 측정하고, 상태 일관성 경계(태스크 그래프, 부작용 지점)를 식별하는 것이 출발점이다. 이어서 NVM 타입(속도가 우선이면 FRAM, 내구성이 우선이면 MRAM)과 NVFF 지원 여부, PMIC의 전력임계 인터럽트 제공 여부를 확인해 아키텍처를 정한다. 소프트웨어 단에서는 멱등 태스크 분해와 커밋 후 부작용 정책을 적용하고, 저널 포맷(버전, CRC, 타임스탬프)과 wear leveling 계획을 함께 수립한다. 검증 단계에서는 전력중단 주입 테스트를 수천~수만 회 반복해 복구 성공률을 측정하고, 내구성 시험(쓰기 사이클)과 실시간 모니터링(실패 카운터, 로그 압축)을 병행한다.

레퍼런스 디자인 기준의 보수적인 범위로는 체크포인트 오버헤드가 처리율을 210% 낮추고, 복구 시간은 1ms 미만, 에너지 오버헤드는 515% 내로 수렴한다. 실제 수치는 NVM 종류(FRAM/MRAM), 클록, 커밋 빈도에 따라 달라진다. 장점은 일관성·가용성·에너지 효율이지만, 비용 쪽에는 실리콘 면적 증가, 초기 설계 복잡도, NVM 쓰기 지연 고려가 따른다. 에너지 하베스팅·저전력 엣지 도메인이라면 이 트레이드오프를 감안하고 단계적으로 도입하는 편이 안전하다.

비휘발성 프로세서간헐 컴퓨팅임베디드에너지 하베스팅체크포인팅