Hacker News

Show HN: Esp32sim – Run ESP32 firmware in the browser

Show HN: Esp32sim - 브라우저에서 ESP32 펌웨어 실행하기

Esp32sim은 ESP32-S3, C3, C6와 클래식 ESP32의 펌웨어를 실제 ROM과 부트로더부터 실행하는 오픈소스 에뮬레이터입니다. 명령줄과 브라우저에서 수정하지 않은 펌웨어를 돌리고, 주변장치와 보드, 가상 Wi-Fi 네트워크도 모델링합니다. 하드웨어 비교 결과와 각 칩의 지원 범위를 함께 공개합니다.

에디터 노트

하드웨어 없이 실제 펌웨어를 부팅하고 주변장치까지 연결하는 구성은 기능 시뮬레이터보다 펌웨어 자체를 테스트하려는 개발 흐름에 맞습니다. 특히 C3와 C6에서 실제 보드와 콘솔 출력을 대조하고, S3에서 JTAG 실행을 비교한 점이 주장의 설득력을 보탭니다. 다만 비교 결과는 수동 실행이며, C3와 C6는 지원 범위가 초안 단계이고 일부 동작에는 스텁이 필요합니다. 댓글에서 Wokwi와 비교한 질문에는 무료 오픈소스와 GitHub Pages 배포가 차이로 제시됐습니다. 반면 README의 긴 설명을 읽기 어렵다는 지적도 나왔습니다. 프로젝트의 기술 범위는 구체적이지만 문서가 길고 복잡해, 기능을 처음 살펴보는 독자가 지원 칩과 제한을 빠르게 찾기 어렵다는 점이 실제 사용성에 영향을 줍니다.

AI 요약

Esp32sim은 Espressif의 두 CPU 아키텍처인 Xtensa와 RISC-V를 아우르는 ESP32 에뮬레이터입니다. ESP32-S3, C3, C6에서는 실제 mask ROM과 2단계 부트로더를 거쳐 수정하지 않은 애플리케이션 이미지를 실행합니다. 클래식 ESP32는 듀얼 LX6 코어에서 ECO3 ROM을 부팅합니다. MIT 라이선스로 공개했으며, 브라우저에서는 WebAssembly로 실행합니다. 브라우저 데모는 실시간으로 동작하지만 브라우저 환경에는 소켓이 없어 NAT 네트워크 기능은 제공하지 않습니다.

칩과 에뮬레이션

S3는 듀얼 Xtensa LX7 코어를, C3는 단일 RISC-V RV32IMC 코어를, C6는 단일 RV32IMAC 코어를 모델링합니다. 세 칩 모두 ROM, 부트로더, FreeRTOS, 애플리케이션 순서로 부팅합니다. S3 에뮬레이터는 블록 인터프리터와 AArch64 JIT를 사용하며, 프로젝트가 보고한 속도는 초당 약 1억 5천만~2억 4천만 명령입니다. C3와 C6는 아직 JIT 없이 인터프리터를 사용합니다. 세 칩의 ROM과 펌웨어는 브라우저에서도 실행됩니다.

SoC 구현은 공통 주변장치 모델을 공유합니다. C3와 C6는 S3의 UART, GPIO, SPI 플래시 컨트롤러, DMA, 암호화 장치 모델 등을 재사용하고, 각 칩에 맞는 메모리 맵과 캐시, 인터럽트 처리 모델을 추가합니다. 보드 모델은 GPIO 변화와 RMT, I2C, 카메라 입력 같은 핀 단위 이벤트를 실제 보드 장치 동작으로 연결합니다. S3에서는 LCD, 카메라, 오디오 장치가 포함된 여러 Waveshare 보드도 지원하며, 보드마다 펌웨어를 바꾸지 않고 실행하는 사례를 제공합니다.

네트워크와 디버깅

가상 액세스 포인트는 펌웨어의 Wi-Fi 검색과 인증을 처리하고 DHCP, DNS, NTP를 제공합니다. 명령줄 실행에서는 NAT를 통해 호스트의 실제 네트워크로 TCP와 UDP 트래픽을 전달할 수 있습니다. 펌웨어 수정이나 root 권한, TUN 장치 없이 동작합니다. C3와 C6의 Wi-Fi에는 지원 범위 제한이 있으며, C6는 단일 스테이션과 레거시 전송률을 지원합니다. C6의 무선 실행에는 아날로그 하드웨어에 의존하는 PHY 보정을 피하기 위한 --stub bb_init=0 설정이 필요합니다.

명령줄에는 실행 추적, 중단점, 메모리 감시, 레지스터와 메모리 확인, 주변장치 로그 기능이 있습니다. S3는 실제 보드와 JTAG 단일 명령 실행을 비교하고, C3와 C6는 같은 펌웨어를 보드와 에뮬레이터에서 실행한 콘솔 출력을 비교합니다. 프로젝트 보고에 따르면 C3는 208줄 중 205줄, C6는 204줄 중 203줄이 일치했습니다. S3는 ROM 초기화 경로 8,000단계와 IDF 5.5 부트로더 3,000단계 이상에서 PC 불일치가 없었다고 보고합니다. 다만 이 수치는 수동 실행 결과이며 CI에서는 저장소에 포함한 일부 디코더 테스트와 기준 출력만 확인합니다. JTAG 비교도 예외 구간과 지연 루프를 보정하므로 전 과정의 사이클 단위 일치를 뜻하지 않습니다.

Hacker News 반응

  • @turbine401 — Wokwi.com과 무엇이 다른가요? Wokwi는 몇 년 전부터 여러 마이크로컨트롤러를 에뮬레이션해 왔습니다.
    • @tyromaniac — 이건 바이브 코딩으로 만든 프로젝트입니다.
    • @joakimeriksson — 네, 요즘은 다들 평범한 어셈블리만 쓰는 것보다 나은 도구를 씁니다. 도구가 계속 좋아져서 정말 기쁩니다. 제게 가장 힘들었던 때는 C64에 빠른 코드를 넣으려고 DATA를 입력하던 시절이었습니다. 이제는 살기 좋아졌습니다.
    • @crazysim — 오픈소스이고 가격은요? 바이브 코딩으로 만들었더라도 무료입니다.
    • @joakimeriksson — 네, GitHub Pages에서 멋진 ESP32 소프트웨어 데모를 무료로 보여줄 수 있습니다.
    • @matthewfcarlson — Wokwi를 여러 번 써보려 했지만 원하는 작업을 하려다 막혔습니다. 비용을 받으려는 이유는 이해하지만, 원하는 대로 쓸 수 있는 오픈소스 대안이 좋습니다.
    • @joakimeriksson — 막히면 이슈를 올리거나 PR을 보내주세요.
    • @joakimeriksson — Wokwi는 월 이용료가 있는 SaaS 에뮬레이터입니다. 저는 새 ESP32 소프트웨어를 바이브 코딩할 때 쓸 도구가 필요했고, 이 도구가 필요했습니다. 모두에게 무료로, 영원히 무료로 제공하는 게 계획입니다. 에뮬레이터 개발자들이 Claude를 사용해 개발했다고 부르겠습니다. '바이브'만으로 만든 게 아니라 명세 기반 작업과 바이브 코딩을 함께 했습니다. Claude가 명세를 읽어주니 정말 좋지만, 무엇을 하는지 알려면 여전히 알아야 합니다. 저는 1990년대 중반부터 에뮬레이터를 개발했습니다.
  • @dofm — 언젠가 써보고 싶습니다. 하지만 README의 보드 설명처럼 형식이 엉성하고 AI가 쓴 듯한 긴 문단은 읽기 너무 힘듭니다. 전문 지식이 있는 젊은 독자에게도 피곤한 글이라고 생각합니다. 페이지 구성을 다시 고민해 주셨으면 합니다.
    • @rvz — README.md가 DONTREADME.md가 되는 조건은 내용이 소설처럼 길고, 형식이 엉성하고, 문장마다 클로드 특유의 표현이 여러 개 들어가는 것입니다. 읽지 않을 거고 작성자도 다시 읽지 않았을 겁니다. 코드 품질을 말하던 사람들은 사라지고 이런 글은 더 나빠지고 있습니다.
    • @exe34 — 이건 표로 만들었어야 합니다.
  • @raminf — 정말 좋습니다. IoT 프로젝트에서는 하드웨어를 기다리는 동안 모바일과 클라우드 개발자가 작업하도록 BLE나 Wi-Fi/API 명령 수준의 기능 시뮬레이터를 만드는 편이 쉽습니다. 하드웨어가 생기면 CI/CD 테스트에만 쓰기도 합니다. 실제 펌웨어를 실행하는 에뮬레이터라면 모바일, 백엔드 개발자와 CI/CD 실행기에서 유용하겠습니다.
    • @joakimeriksson — 에이전트 기반 ESP32 코딩에도 매우 유용합니다. 어느 정도 동작할 때까지 하드웨어에 플래시하지 않아도 되므로 플래시에 쓰는 시간이 줄어듭니다.
  • @djmips — RP2350용도 있나요?
    • @joakimeriksson — esp32sim에는 없지만 Cooja-NG에는 RISC-V와 ARM Cortex-M33이 있습니다. 에뮬레이션이 불가능한 일은 아닙니다.
  • @snakeman — P4 지원 계획이 있나요? S3와 C6도 많이 쓰지만 요즘은 P4에 관심이 많이 쏠립니다.
    • @joakimeriksson — 계획에 있습니다. P4 보드도 구해야 합니다. 몇 주 안에 지원할 가능성이 있습니다.

원문: Hacker News / 번역·요약: Trawling