Tek kullanımlık elektronik sigarayla web sitesi barındırmak
(bogdanthegeek.github.io)- Tek kullanımlık elektronik sigara içine gömülü düşük performanslı ARM Cortex-M0+ mikrodenetleyici kullanılarak bir web sunucusu çalıştırılan deneysel bir proje
- 24KiB flash ve 3KiB RAM'e sahip PUYA'nın PY32F002B çipi analiz edilerek SLIP yöntemiyle ağ bağlantısı kuruldu
- Semihosting, SLIP protokolü ve uIP TCP/IP yığını kullanılarak sanal tty üzerinden TCP/IP iletişimi ve HTTP sunucusu işlevi port edildi
- Başta çok yavaştı, ancak buffer optimizasyonu ve veri işleme iyileştirmeleriyle tepki süresi ve sayfa yükleme hızı büyük ölçüde artırıldı
- Düşük kapasiteli bellek ortamında bile dinamik sunucu kodu çalıştırma ve API endpoint'leri sağlama başarıldı
- Kod yayımlanmış durumda; pratikte barındırma mümkün olsa da bellek gibi kaynak kısıtları büyük
Giriş
- Bu yazının, doğrudan tek kullanımlık elektronik sigara üzerinde çalışan web sunucusundan servis edilmediğini; aynı içeriğin ayrı bir sunucuda sunulduğunu en başta belirtelim
- Gerçek çalışma örneği http://ewaste.fka.wtf/ adresinde görülebilir
Arka plan
- Son birkaç yıldır bataryaları yeniden kullanmak amacıyla tanıdıklardan tek kullanımlık elektronik sigara toplandı
- Son dönemde tek kullanımlık elektronik sigara cihazlarının giderek gelişip USB-C ve yeniden şarj edilebilir batarya ile gelmeye başlaması dikkat çekti
- Söküm sırasında PUYA adlı, flash çip entegreli ARM Cortex-M0+ mikrodenetleyici bulundu; bu çip düşük maliyetli mikrodenetleyici olarak iyi biliniyor
- Bu mikrodenetleyiciler farklı modellerden toplandı ve üzerlerinde debug pin etiketleri bulunduğu için analiz kolaylaştı
Kullanılan donanım
- Çip üzerindeki işaretleme
PUYA C642F15idi, ancak gerçekte PY32F002B ailesinden olduğu tahmin ediliyor - Başlıca özellikler:
- 24MHz Cortex-M0+ çekirdek
- 24KiB flash
- 3KiB RAM
- Çeşitli çevre birimleri mevcut, ancak bu projede kullanılmadı
- Genel bir akıllı telefona kıyasla zayıf olsa da gömülü ortamda basit bir web sunucusu kurmak fazlasıyla mümkün
Ağ bağlantısı
- Fikir tamamen yeni değildi, ancak semihosting kavramı denenirken web sunucusu çalıştırma fikri ortaya çıktı
- Semihosting, gömülü ARM üzerinde syscall benzetimi yapmanın bir yolu
- Register'lara değer/işaretçi konup breakpoint çağrıldığında debugger bunu yorumlayıp işlemi gerçekleştiriyor
- Genelde log aktarmak için kullanılsa da çift yönlü veri iletişimi de mümkün
- USB seri aygıtları SLIP (Serial Line Internet Protocol) protokolünü destekliyor; bu da ağ arayüzü olarak kullanıldı
- Linux'ta (ve bazı macOS sürümlerinde)
slattachvesocatile sanal tty üzerinden SLIP ağı kuruldupyocd 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 yığını olarak uIP seçildi; çok küçük, RTOS gerektirmiyor ve port etmesi kolay
- uIP örneklerindeki HTTP sunucusu kullanıldı, SLIP kodu semihosting yaklaşımına uyarlanarak web sunucusunun başarıyla ayağa kalkması sağlandı
- ARM mimarisinde 16 bit hizalama sorunu olduğundan filesystem oluşturma betiği değiştirildi ve Perl ile dönüştürme işlemi yapıldı
Hız optimizasyonu
- İlk durumda ping 1,5 saniye, %50 paket kaybı, sayfa yükleme süresi ise 20 saniyenin üzerindeydi; yani yanıt hızı son derece düşüktü
- Bunun nedeni bayt düzeyinde giriş/çıkış işlemlerinin yüksek ek yük oluşturmasıydı
- 3KiB RAM aktif biçimde kullanılarak ring buffer eklendi ve SLIP işlevlerine veriyi toplu verme yapısına geçildi
- Yazma işlemleri de paketler hâlinde bölünerek aktarıldı ve hızlı temizleme sağlandı
- Optimizasyon sonucunda 20ms ping, kayıpsız iletişim ve 160ms sayfa yükleme elde edildi
- Toplam RAM ve flash kullanımı:
- Flash: 24KB'nin 5,116B'si (%20,82)
- RAM: 3KB'nin 1,380B'si (%44,92)
- Tüm blog içeriğini de rahatça servis edebilecek kapasite mevcut ve sunucu tarafında C kodu çalıştırmak da mümkün
Diğer işlevler ve kapanış
- API endpoint'leri doğrudan uygulandı; ana sayfa istek sayısı ve mikrodenetleyicinin benzersiz ID'si döndürülebiliyor
- Son derece düşük özellikli donanım ve asgari bellekle dinamik web sunucusu ve API bile gerçekleştirilebildiğini gösteren deneysel bir çalışma
Henüz yorum yok.