본문 바로가기
지식창고/IT 지식

플래시 메모리에 Program/Erase를 수행하는 동안에는 전역 인터럽트를 비활성화하는 이유

by eteo 2026. 8. 4.
반응형

 

 

플래시 메모리에 쓰기(Program)나 지우기(Erase)를 수행하는 동안에는 전역 인터럽트 상태를 저장하고 비활성화한 뒤, 작업 후 다시 복원하는 것이 일반적이다.

 

이유는?

 

첫째로 인터럽트가 발생했을 때 벡터테이블이나 ISR이 플래시 메모리에 저장되어 있다면 CPU가 플래시에서 명령어를 가져오려(Fetch) 하게 되고, 이 시점에는 플래시가 Program/Erase 동작으로 인해 읽기가 불가능하거나 제한되어 BusFault, HardFault 등이 발생할 수 있기 때문이다.

 

두 번째로는 Flash Programming Sequence를 보호하기 위해서이다. 일부 MCU에서는 내부 플래시 메모리에 데이터를 쓰거나 지울 때, Flash Controller가 엄격한 타이밍과 시퀀스를 요구한다. 이 과정에서 긴 인터럽트가 발생하면 타이밍이 깨져 Program / Erase에 실패할 수 있다.

 

 

해당되지 않는 경우

 

1. 듀얼 뱅크(Dual Bank) 플래시 구조인 경우

플래시 메모리가 뱅크 A와 뱅크 B 등 물리적으로 완전히 분리되어 있는 구조인 경우, 예를 들면 뱅크 A에서 코드를 실행(인터럽트 루틴 처리 포함)하면서, 동시에 뱅크 B에 데이터를 쓰는 것이 가능하다.


2. 인터럽트 루틴과 API를 RAM에서 실행하는 경우

플래시 API와 ISR, 그리고 ISR에서 호출하는 함수들을 모두 SRAM 영역으로 복사하여 실행하는 방식이다. __ramfunc, __attribute__((section(".ramfunc"))) 등 컴파일러 키워드를 쓰면 스타트업 코드나 링커가 부팅 시점에 알아서 플래시의 코드를 RAM 으로 복사해준다. 이렇게 하면 CPU가 플래시를 쓰는 동안 인터럽트가 걸려도, 코드를 플래시가 아닌 RAM에서 읽어오므로 충돌 없이 정상 동작한다.

 

3. 하드웨어적으로 CPU를 대기(Stall)시키는 경우

일부 MCU는 플래시 쓰기 작업이 진행되는 동안, CPU가 플래시 읽기를 시도하면 시스템 버스 단에서 CPU를 대기시켰다가, 쓰기가 끝나면 깨워 진행시키는 기능이 있다. 이 경우 명령어 Fetch 오류는 발생하지 않지만, CPU가 대기하는 동안에는 프로그램 실행과 인터럽트 처리 역시 지연되므로 시스템의 실시간성이 크게 저하될 수 있다. 특히 플래시 섹터 지우기 작업은 수십에서 수백 ms초까지 소요되니 주의해야 한다.

 

반응형