28 puan yazan GN⁺ 2025-09-16 | Henüz yorum yok. | WhatsApp'ta paylaş
  • 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 C642F15 idi, 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) slattach ve socat ile sanal tty üzerinden SLIP ağı kuruldu
    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 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

Referans

Henüz yorum yok.

Henüz yorum yok.