28 poin oleh GN⁺ 2025-09-16 | Belum ada komentar. | Bagikan ke WhatsApp
  • Proyek eksperimental yang menjalankan web server dengan memanfaatkan mikrokontroler ARM Cortex-M0+ berdaya rendah yang tertanam di rokok elektrik sekali pakai
  • Menganalisis chip PY32F002B dari PUYA yang memiliki 24KiB flash dan 3KiB RAM, lalu mengimplementasikan koneksi jaringan dengan metode SLIP
  • Dengan memanfaatkan Semihosting, protokol SLIP, dan stack TCP/IP uIP, proyek ini mem-porting komunikasi TCP/IP serta fungsi server HTTP melalui tty virtual
  • Awalnya sangat lambat, tetapi melalui optimasi buffer dan perbaikan pemrosesan data, kecepatan respons dan pemuatan halaman meningkat drastis
  • Bahkan dalam lingkungan dengan memori kecil, berhasil menjalankan kode server dinamis dan menyediakan endpoint API
  • Kode sudah dirilis, dan hosting sungguhan memang dimungkinkan, tetapi sangat dibatasi oleh sumber daya seperti memori

Pendahuluan

  • Penulis terlebih dahulu menjelaskan bahwa tulisan ini tidak disajikan langsung dari web server yang berjalan di rokok elektrik sekali pakai tersebut, melainkan dari server terpisah yang menyajikan konten yang sama
  • Contoh cara kerjanya yang sebenarnya dapat dilihat di http://ewaste.fka.wtf/

Latar belakang

  • Selama beberapa tahun, penulis mengumpulkan rokok elektrik sekali pakai dari kenalan dengan tujuan mendaur ulang baterainya
  • Belakangan ini, penulis tertarik pada perangkat rokok elektrik sekali pakai yang makin canggih dan mulai dilengkapi USB-C serta baterai isi ulang
  • Saat membongkar perangkat, penulis menemukan mikrokontroler ARM Cortex-M0+ dengan flash internal bernama PUYA, chip yang dikenal luas sebagai mikrokontroler murah
  • Penulis mengumpulkan mikrokontroler tersebut dari beberapa model, dan karena pin debug-nya diberi label, analisis menjadi lebih mudah

Perangkat keras yang digunakan

  • Penandaan chip adalah PUYA C642F15, tetapi diduga sebenarnya termasuk keluarga PY32F002B
  • Spesifikasi utama:
    • Core Cortex-M0+ 24MHz
    • 24KiB flash
    • 3KiB RAM
    • Ada berbagai periferal, tetapi tidak digunakan dalam proyek ini
  • Dibandingkan smartphone biasa, performanya memang rendah, tetapi di lingkungan embedded, membangun web server sederhana tetap sangat mungkin dilakukan

Koneksi jaringan

  • Ini bukan ide yang sepenuhnya baru, tetapi saat bereksperimen dengan konsep semihosting, penulis mendapat gagasan untuk menjalankan web server
  • Semihosting adalah cara meniru syscall pada ARM embedded
    • Ketika nilai/pointer dimasukkan ke register lalu breakpoint dipanggil, debugger menafsirkannya dan memproses tindakan yang diminta
    • Biasanya digunakan untuk mengirim log, tetapi komunikasi data dua arah juga dimungkinkan
  • Perangkat USB serial mendukung protokol SLIP (Serial Line Internet Protocol), dan ini dimanfaatkan sebagai antarmuka jaringan
  • Di Linux (dan sebagian macOS), lingkungan jaringan SLIP melalui tty virtual dibangun dengan slattach, socat, dan sebagainya
    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  
    
  • Sebagai stack TCP/IP, penulis memilih uIP karena sangat kecil, tidak memerlukan RTOS, dan mudah di-porting
  • Dengan memanfaatkan contoh server HTTP dari uIP, lalu mem-porting kode SLIP agar sesuai dengan metode semihosting, penulis berhasil menjalankan web server
  • Karena ada masalah alignment 16-bit pada arsitektur ARM, penulis memodifikasi skrip pembuatan filesystem dan melakukan proses konversi dengan Perl

Optimasi kecepatan

  • Pada kondisi awal, respons sangat lambat: ping 1,5 detik, packet loss 50%, dan pemuatan halaman lebih dari 20 detik
  • Penyebabnya adalah overhead besar dari I/O per byte
  • Dengan memanfaatkan RAM 3KiB secara agresif, penulis menambahkan ring buffer dan memperbaiki fungsi SLIP agar dapat memasok data secara batch
  • Penulisan data juga dibagi dalam batch untuk proses pengiriman, sehingga pembersihan dapat dilakukan lebih cepat
  • Hasil optimasi mencapai ping 20ms, tanpa packet loss, pemuatan halaman 160ms
  • Total penggunaan RAM dan flash:
    • Flash: 5.116B dari 24KB (20,82%)
    • RAM: 1.380B dari 3KB (44,92%)
  • Kapasitas ini juga cukup untuk menyajikan seluruh konten blog tanpa kendala, dan bahkan memungkinkan menjalankan kode C sisi server

Fitur lain dan penutup

  • Penulis mengimplementasikan langsung endpoint API yang mengembalikan jumlah permintaan ke halaman utama dan unique ID mikrokontroler
  • Ini adalah eksperimen yang berhasil mewujudkan web server dinamis dan API hanya dengan perangkat keras berkemampuan sangat rendah dan memori minimum

Referensi

Belum ada komentar.

Belum ada komentar.