Picoruby를 ESP32 마이크로컨트롤러에 포팅하기

[JA] Porting PicoRuby to Another Microcontroller: ESP32 / Yuhei Okazaki @Y_uuu

작성자
RubyKaigi
발행일
2025년 05월 27일

핵심 요약

  • 1 Picoruby를 저전력, 저비용 IoT 마이크로컨트롤러인 ESP32에 성공적으로 포팅하는 과정을 상세히 설명합니다.
  • 2 포팅 과정에서 발생하는 워치독 타이머 오류, 스택 오버플로우, 표준 입출력 문제 등 다양한 기술적 난관과 해결책을 제시합니다.
  • 3 포팅된 Picoruby를 활용하여 ESP32에서 루비 셸, IRB, 그리고 SPI, ADC, PWM을 이용한 블록 깨기 게임 데모를 시연합니다.

도입

본 발표는 마이크로컨트롤러를 위한 초소형 루비 구현체인 Picoruby를 Espressif Systems가 개발한 저전력, 저비용 마이크로컨트롤러인 ESP32에 포팅하는 과정을 다룹니다. 발표자는 Picoruby의 높은 이식성을 강조하며, 아직 초기 단계인 Picoruby의 다양한 마이크로컨트롤러 지원 확대를 목표로 ESP32 포팅을 시도했습니다. 특히 RISC-V 아키텍처를 사용하는 ESP32C3과 Xtensa 아키텍처를 사용하는 ESP32 DevKitC 두 가지 장치를 대상으로 포팅을 진행하여 아키텍처별 대응의 중요성을 부각합니다.

Picoruby를 ESP32에 포팅하는 과정은 크게 코어 빌드, 표준 입출력 및 젬 포팅, 트러블슈팅의 세 가지 주요 단계로 진행되었습니다.

1. Picoruby 코어 및 프로젝트 빌드

  • 크로스 컴파일 환경: ESP-IDF를 사용하여 ESP32용 Xtensa 및 RISC-V 크로스 컴파일러를 설정하고, 루비로 작성된 build_config 파일을 통해 컴파일 옵션을 지정합니다.
  • 라이브러리 및 바이너리 생성: rake 명령으로 Picoruby 코어 라이브러리(libmrb.a)를 생성하고, 이를 ESP-IDF 프로젝트에 링크하여 idf.py build로 최종 실행 바이너리(R2p2ESP32.bin)를 만듭니다.

2. 표준 입출력 및 MRB 젬 포팅

  • 표준 입출력 (hal_write): 루비 puts 메서드 호출을 picoruby-machine 젬의 hal_write 함수로 연결합니다. ports 디렉토리에 ESP32 전용 hal_writeputcharfflush를 사용하여 구현합니다.
  • 기타 MRB 젬: 셸 실행에 필요한 picoruby-shell 및 의존 젬들을 분석하여 포팅합니다. picoruby-io, picoruby-console은 기존 코드를 재활용하며, picoruby-file-system-fat은 초기 스텁 구현 후 완전 포팅을 완료했습니다.

3. 주요 트러블슈팅 및 해결책

  • 워치독 타이머 에러: Picoruby VM의 독자적 태스크 전환과 RTOS 워치독 충돌. 해결: 워치독 비활성화.
  • require 미작동: 동적으로 생성된 C 소스 코드가 main에서 호출되지 않아 발생. 해결: main 함수에서 해당 함수를 명시적으로 호출.
  • 스택 오버플로우: IRB 실행 시 app_main 태스크 스택 부족. 해결: SDK_CONFIG_DEFAULTS에서 스택 크기를 8KB로 증설.
  • CSI 명령 미작동: hal_write 구현 오류로 터미널 상태 확인 실패. 해결: for 루프와 putchar, fflush를 활용한 정확한 hal_write 구현.

데모 시연

ESP32 기반 자작 기판에서 Picoruby로 구현된 블록 깨기 게임을 시연했습니다. 이는 picoruby-spi (매트릭스 LED), picoruby-adc (조이스틱), picoruby-pwm (부저) 젬들을 ESP32에 포팅하여 구현한 결과입니다.

결론

본 세션은 Picoruby를 ESP32에 성공적으로 포팅하는 방법론을 제시했으며, 이 과정에서 겪었던 다양한 기술적 난관과 그 해결책을 공유했습니다. 제시된 포팅 방법은 ESP32뿐만 아니라 STM32, NRF52와 같은 다른 마이크로컨트롤러에도 확장 적용 가능함을 시사합니다. 발표자는 Picoruby의 포팅 생태계 확장을 위해 커뮤니티의 지속적인 기여와 관심을 촉구하며, 실제 포팅에 관심 있는 개발자들에게 지원을 약속했습니다. 이 프로젝트는 임베디드 환경에서 루비를 활용하는 새로운 가능성을 열었으며, 루비 개발자들이 마이크로컨트롤러 분야로 진출할 수 있는 중요한 발판을 마련했습니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!