본문 바로가기

ESP32

ESP32 펌웨어 크기로 OTA 안되는 문제 해결방법

반응형

 

ESP-IDF에서 제작한 펌웨어의 사이즈가 1MB보다 약간 커서 OTA를 사용할 수 없는 문제가 생겼다. 기본적으로 ESP-IDF에서 제공하는 펌웨어 업로드 옵션은 1MB이기 때문이다.

 

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html

 

Partition Tables - ESP32 - — ESP-IDF Programming Guide latest documentation

Note Using C file I/O API to open a file (fopen) in any write mode (w, w+, a, a+, r+) will fail and return NULL. Using open with any other flag than O_RDONLY will fail and return -1 while errno global variable will be set to EROFS. This is also true for an

docs.espressif.com

 

이 포스팅을 통해서 약 1~1.5MB 의 펌웨어도 OTA할 수 있도록 만드는 방법을 알 수 있다.

 

​OTA와 파티션의 관계 / 최대 펌웨어 크기

 

우선 OTA를 위해서는 3개의 파티션이 필요하다. 각각 factory, ota_0, ota_1 파티션이다.​

 

factory는 공장 초기 펌웨어가 저장될 공간이다. 우리가 펌웨어 업로드하는 것이 이 파티션에 들어가는 것이다.

ota_0와 ota_1에는 OTA를 통해 전달된 펌웨어가 들어가는 공간이다.

 

OTA 파티션이 2개가 필요한 이유는 두 파티션이 번갈아가며 OTA를 수행해야하기 때문이다.

 

 

https://docs.espressif.com/projects/esp-jumpstart/en/latest/firmwareupgrade.html?highlight=partition%20table

 

Firmware Upgrades - ESP32 - — ESP-Jumpstart Programming Guide 37d460a documentation

© Copyright 2018-2025, Espressif Systems (Shanghai) CO., LTD.

docs.espressif.com

 

 

이렇게 3개의 파티션과, 기본적으로 필요한 몇가지 파티션을 합쳐서 4MB를 넘지 않아야 한다. ESP32의 플래시 메모리가 4MB이기 때문이다.

 

혹시 NVS, SPIFFS, FAT를 활용하게 된다면, 이에 대한 메모리도 4MB안에 포함되어야 하는 것이다.

 

​ESP32 시리즈별 플래시 메모리 크기는 아래와 같다.

ESP8266의 경우에는 2MB다.

 

 

 

 

보통 phy_init, otadata, nvs 파티션이 0.1MB정도 차지하니, 펌웨어 파티션은 3.9MB이하여야 한다.

이 3.9MB에 factory, ota_0, ota_1 파티션이 들어가야하니, 1.3MB정도가 최대 펌웨어 크기다.

 

실전 : 파티션 나누기

 

이제 실전으로 가자. 우선 파티션을 커스텀하는 방법은 아래와 같다.

 

​1. ESP-IDF에서 파티션 설정하는 방법("Using ESP-IDF VS Code Extension" 부분 참고)

https://blog.espressif.com/how-to-use-custom-partition-tables-on-esp32-69c0f3fa89c8 

 

​2. 아두이노에서 파티션 설정하는 방법

https://iotespresso.com/how-to-set-partitions-in-esp32/ 

 

​아래는 내가 사용하는 파티션 csv의 내용이다.

 

# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs,      data, nvs,     0x9000,  0x4000,
otadata,  data, ota,     0xd000,  0x2000,
phy_init, data, phy,     0xf000,  0x1000,
factory,  app,  factory, 0x10000,  0x120000,
ota_0,    app,  ota_0,   0x130000, 0x120000,
ota_1,    app,  ota_1,   0x250000, 0x120000,

 

그리고 만약에 ESP-IDF를 사용하고 있다면

idf.py menuconfig 명령어를 통해 전체 파티션 크기를 조정해야한다.

기본값이 2MB로 되어 있을 수 있기 때문이다.

 

 

 

menuconfig > Serial flasher config > Flash size 에 들어가서 4MB를 선택하자.

 

이제 1MB가 넘는 펌웨어를 업로드 해 보자.

아래는 idf.py size 명령어를 통해 확인한 나의 펌웨어 크기이다.

total image size가 1MB를 약간 넘어선다. 그래서 기본 파티션 설정으로는 업로드가 안되었던 펌웨어다.

 

 

 

이제 위에 설명한 설정을 따라 다시 업로드를 해 보니 잘 된다.

 

 

 

펌웨어 파티션 더 키우기

 

위에서는 3개의 파티션이 필요하다고 했다. 일반적으로 factory 파티션은 있으면 좋다고 권장되는 파티션이다. 왜냐하면 OTA 진행 중에 실패하거나, 펌웨어에 문제가 발생했을 때 factory 파티션이 있으면 안전하기 때문이다.

 

하지만 Espressif의 공식 문서에서는 factory 파티션을 따로 두는 것을 권하고 있지는 않다. 공식 문서나 OTA 기본 예제의 파티션에서도 factory 파티션을 쓰고 있지 않다.

 

https://docs.espressif.com/projects/esp-jumpstart/en/latest/firmwareupgrade.html?highlight=partition%20table 

 

​그래서 아래와 같이 factory 파티션을 제거하게 되면 펌웨어의 최대 크기가 1.4MB까지 된다.

 

# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs,      data, nvs,     0x9000,  0x4000,
otadata,  data, ota,     0xd000,  0x2000,
phy_init, data, phy,     0xf000,  0x1000,
ota_0,  app,  ota_0, 0x10000,  0x140000,
ota_1,    app,  ota_1,   0x150000, 0x140000,

 

 

펌웨어 크기 줄이기

 

혹시라도 OTA를 사용할 수 있는 최대 펌웨어 크기인 1.4MB가 넘는다면 아래와 같은 시도들을 해 볼 수 있다. espressif의 공식 문서다. 성능은 줄이고 용량을 압축하는 등, 다양한 방법이 있다.

 

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/performance/size.html 

 

그대로 용량이 크다면..

MCU 추가하는 것도 방법이다. 굳이 모든걸 ESP32에 집어넣지 않아도 된다.

 

 

1.4MB 이상 용량에 대한 아이디어 제안

 

이건 아직 테스트 안 해보고 적어보는 아이디어이다.

OTA의 파티션 2개가 번갈아 펌웨어가 다운로드되기 때문에, 한 쪽 파티션을 최대한 키우는 방법이 있다.

 

 

 

우리가 원하는 펌웨어(이하 'A 펌웨어')를 최초업로드하게 되면 ota_0에 다운로드된다.

 

A에는 각종 기능이 있고, 새로운 펌웨어 버전이 나왔을 때 새로운 A를 다운로드할 수 있도록 하는 펌웨어(이하 '펌웨어 B')를 다운 받는 기능이 있다.​

 

펌웨어 B는 새로운 A를 다운로드할 수 있는 기능 외에는 아무것도 없도록 하여, 용량을 굉장히 작게 한다.

ota 파티션은 번갈아 펌웨어가 다운되기 때문에 B 펌웨어는 ota_1에 다운로드가 된다.

그리고 B 펌웨어는 새로운 A를 ota_0에 다운로드하는 것이다.

 

새로운 버전 A(ver.2)를 다운 받는 과정을 정리하면 아래와 같다.

 

ESP에 다운로드 되는 펌웨어 순서

A(ver.1) -> B -> A(ver.2)

 

(이거 잘 되면 댓글로 남겨주세요..ㅎㅎ)

 

반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

당신의 성공을 위해 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩