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_write
를putchar
와fflush
를 사용하여 구현합니다. - 기타 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에 포팅하여 구현한 결과입니다.