-
일회용 전자담배에 내장된 저성능 ARM Cortex-M0+ 마이크로컨트롤러를 활용해 웹서버를 구동한 경험 공유임
-
24KiB 플래시와 3KiB RAM을 가진 PUYA 사의 PY32F002B 칩을 분석, SLIP 방식으로 네트워크 연결성 구현임
-
Semihosting과 SLIP 프로토콜, uIP TCP/IP 스택을 활용하여 가상 tty를 통해 TCP/IP 통신 및 HTTP 서버 기능을 포팅함
- 본래 매우 느렸으나 버퍼 최적화와 데이터 처리 개선을 통해 반응속도 및 페이지 로딩 속도 대폭 향상함
-
저용량 메모리 환경에서도 동적 서버 코드 구동 및 API 엔드포인트 제공까지 실현한 것이 특징임
서문
- 본 글은 일회용 전자담배에서 직접 구동하는 웹서버로 서비스되는 것이 아니라 동일한 내용을 별도의 서버에서 제공함을 먼저 밝힘
- 실물 예시는 별도 링크에서 확인 가능함
배경
- 몇 년간 지인들에게서 일회용 전자담배를 수집하여 배터리를 재활용하려던 목적이 있었음
- 최근 일회용 전자담배 기기가 점점 고도화되어 USB-C와 재충전식 배터리가 탑재되기 시작한 점을 언급함
- 해체 중 PUYA라는 이름의 플래시 칩 내장 ARM Cortex-M0+ 마이크로컨트롤러를 발견, 저가 마이크로컨트롤러로 잘 알려진 칩임을 소개함
- 여러 모델의 기기를 수집하며 디버깅 핀이 명확하게 표시되어 있음에 감사함을 표현함
사용한 하드웨어
- 칩 표시는 PUYA C642F15였으며 실제로는 PY32F002B임을 확인함
- 주요 제원:
-
24MHz Cortex-M0+
-
24KiB 플래시
-
3KiB RAM
- 여러 주변장치 존재하나 본 프로젝트에서는 미활용
- 매우 낮은 사양이나, 이러한 칩에서도 웹서버 운영이 가능함을 목표로 설정함
네트워크 연결
- 최초 발상은 아니었으나, semihosting 개념을 실험하면서 웹서버 구동 아이디어를 착안함
- Semihosting은 임베디드 ARM에서 syscall을 흉내내는 방법임
- 레지스터에 값/포인터를 넣고 breakpoint 호출 시, 디버거가 이를 해석해 동작을 처리함
- 일반적으로 로그 전송 용도지만, 양방향 데이터 통신이 가능함
- USB 시리얼 디바이스들이 SLIP(Serial Line Internet Protocol) 프로토콜을 지원, 이를 활용해 네트워크 인터페이스로 사용함
- Linux(및 일부 macOS)에서 slattach와 socat 등으로 가상 tty를 통한 SLIP 네트워크 환경을 구축함
pyocd gdb -S -O semihost_console_type=telnet -T $(PORT) $(PYOCDFLAGS) &
socat PTY,link=$(TTY),raw,echo=0 TCP:localhost:$(PORT),nodelay &
sudo slattach -L -p slip -s 115200 $(TTY) &
sudo ip addr add 192.168.190.1 peer 192.168.190.2/24 dev sl0
sudo ip link set mtu 1500 up dev sl0
- TCP/IP 스택으로 uIP를 선택, 매우 작고 RTOS 불필요하며 포팅이 용이함
- uIP 예제 중 HTTP 서버 활용, SLIP 코드를 semihosting 방식에 맞춰 포팅하여 웹서버 기동에 성공함
- ARM 구조에서 16비트 정렬 문제가 있어 filesystem 생성 스크립트 수정 및 Perl로 변환 처리 진행함
속도 최적화
- 초기 상태에서는 ping 1.5초, 50% 패킷 손실, 페이지 로딩 20초 이상으로 매우 느린 응답 속도임
- 원인은 바이트 단위 입출력의 큰 오버헤드 때문이었음
-
3KiB RAM을 적극 활용해 링버퍼 추가, SLIP 함수에 일괄 데이터 공급 구조로 개선함
-
쓰기 또한 배치로 분할해 전송 처리, 빠른 클린업을 구현함
- 최적화 결과 ping 20ms, 무손실, 페이지 로딩 160ms 달성
- 전체 RAM과 플래시 사용량:
- 플래시: 24KB 중 5,116B(20.82%)
- RAM: 3KB 중 1,380B(44.92%)
- 전체 블로그 콘텐츠도 무리없이 서비스 가능한 용량이며, 서버사이드 C 코드 구동도 가능함
기타 기능 및 마무리
-
API 엔드포인트를 직접 구현, 메인 페이지 요청 횟수 및 마이크로컨트롤러 유니크 ID 리턴
- 극한의 저사양 하드웨어와 최소한의 메모리로 동적 웹서버와 API까지 구현한 실험임
참조