ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ESP32 write cycles의 중요성
    문제해결 2021. 10. 6. 02:10

    EPS32의 쓰기 횟수

    ESP32 (https://www.espressif.com/en/products/devkits/esp32-devkitc)

    ESP32와 같은 IOT 디바이스들을 사용할 때 주의할 것이 있다. 그것은 바로 쓰기 횟수이다. NOR, NAND 플래시를 사용하는 제품은 메모리에 데이터를 쓰면 메모리가 닳게 된다. 때문에 저장매체마다 그 쓰기 횟수의 상한이 정해져 있다. 생산된 각 제품마다 최고치는 다를 수 있으므로, 제조사는 최소한 얼마만큼의 쓰기 횟수를 보장하는 식으로 스펙을 보여준다. 

    GigaDevice의 GD25Q32C(플래시)의 스펙 일부를 편집

     

    위 스펙은 GigaDevice의 GD25Q32C 플래시의 일부이다. 최소한 100k의 write cycle을 보장해준다는 것을 알 수 있다. 프로그램을 쓸 때도 지울 때도 변화를 불러오기 때문에 Program/Erase cycles이라고 되어있다. ESP32가 쓰고 있는 플래시 메모리 모델을 GD25Q32C라고 추측하고 있다. espressif의 공식 홈페이지에서 확인을 못했지만, 대부분의 질문과 답변이 저 모델을 기준으로 하고 있었기 때문이다. 즉, ESP32를 이용한다면, 100k의 write cycle을 생각해야 한다. GD25Q32C는 NOR 플래시이다.

    ESP32 쓰기 횟수의 중요성

    ESP32는 플래시 메모리의 일부를 EEPROM으로 쓰고 있다. write cycle을 신경 써서 데이터를 선별해서 저장하고 주기를 조절해야 한다. 일반적으로 PC에서 프로그래밍하듯이 파일이나 DB에 저장하면 금세 write cycle의 한계에 가까워진다.

     

    1분에 한 번씩 메모리에 저장을 한다고 했을 때, 하루에 1440번을 쓸 수 있다. 70일이 지나면 100k를 넘으므로 더 이상 쓰기 연산을 신뢰하기 어렵다. 1년을 제대로 동작하기를 기대한다면 6분에 1번씩, 2년을 원한다면 12분에 1번씩 쓸 수 있는 것이다. IOT 디바이스를 주기적으로 데이터를 집계하는 용도로 쓴다면, 이러한 제한은 사뭇 크게 다가온다.

     

    만약... 제한을 무시한다면, 기기는 오동작하기 마련이다. NOR 플래시는 쓰기 전에 블럭 단위로 지우기를 한다. 지울 때는 해당 블럭의 모든 비트를 1로 만든다. 그리고 쓸 때는 해당 주소를 1에서 0으로 바꾼다. 이것이 P/E 과정이다. 그러나, 각 셀에는 물리적 내구성의 한계가 있다. 즉, 0에서 1로 변해야 할 때, 1에서 0으로 변해야 할 때 바뀌지 않을 수 있는 것이다. 프로그램 실행에 필요한 설정 데이터를 남기는 EEPROM에 문제가 발생하면 설정 값이 오염될 수 있다. 프로그램 실행에 필요한 데이터가 오염되면 프로그램은 실행조차 안될 것이다.

     

    기기가 고장 나면, 교체하기 위해 엔지니어가 출장을 가야 한다. 또는 여분을 마련하여 해당 사업체가 교체할 수 있도록 해야 한다. 출장을 가면 출장에 대한 비용이 들어가고 개발 작업이 중단된다. 해당 사업체가 교체할 수 있도록 하려면 따로 교육을 시켜줘야 하며, 높은 확률로 전화를 받아서 다시 알려줘야 한다. 추가 개발이 지연된다.

    ESP32의 쓰기 횟수를 줄이는 방법

    write cycle을 줄이기 위해서 여러 방법을 참고했다. 그중에서 좋은 방법은 2가지 정도였다. 첫 번째는 플래시에 데이터를 쓰고 지울 때 특정 바이트를 기준으로 하는 것이다. NOR 플래시는 데이터를 쓰고 지울 때 페이지 단위로 하는데, 그 크기가 대략 64~256바이트이다 따라서 자주 쓰는 데이터가 여러 개라면, 이 수치를 단위로 데이터를 나누는 것이다.

    GigaDevice의 GD25Q32C(플래시)의 스펙 일부를 편집
    GigaDevice의 GD25Q32C(플래시)의 스펙 일부를 편집

    위 데이터 시트에 의하면, GD25Q32C는 64개의  블럭, 1024개의 섹터를 가지고 있다. 각 섹터는 4096의 크기를 지니며, 16개의 페이지로 이루어진다. 즉, 하나의 페이지는 256바이트, 섹터는 4096(4KB), 블럭은 65,536(64KB)이며, 총 4MB의 크기를 지니고 있다.

     

    256바이트의 페이지를 기준으로 나눠보자. 주소 0번(임의로 정한 것이다. 실제론 다르다)에 자주 쓰는 데이터를 저장하고 있다면, 그다음으로 자주 저장하는 데이터를 256번지점에 저장하는 것이다. 이렇게 한다면, 두 데이터를 하나의 페이지에 넣는 것보다 이론적으로 수명을 2배 늘릴 수 있다. 데이터가 저장되는 타이밍이 다를 때 응용하기 좋다. ESP32에서 EEPROM으로 제공하는 플래시 메모리의 크기는 약 500바이트 이므로, 대략 256 부터는 서로 다른 페이지라고 할 수 있다.

     

    두 번째 방법은 커밋과 업데이트를 구별하는 것이다.  EEPROM에 저장하기 전에 버퍼에 데이터를 먼저 업데이트하고 일정 시간이 지난 후에 플래시에 반영하는 것이다. 이것을 커밋이라고 한다. 커밋하기 전의 데이터는 기기에 전원 공급을 끊으면 사라지는 단점이 있다. 전원이 끊기는 경우에는 보완할 방법이 없지만, 재시작되는 경우엔 RTC_NOINIT_ATTR 영역에 저장하여 보완할 수 있다.

     

    이렇게 write cycle을 신경 씀으로써, 기기의 수명을 늘리고, 기기 교체 및 AS에 대한 비용을 줄일 수 있다.

    댓글

Designed by Tistory.