CYD Studio › Belgeler › Çalışma modları ve bellek

Çalışma modları ve bellek

Her proje satırında bir N / T / S cipi vardır. Tıkla, sırayla değişir; seçim dosyaya kaydedilir (config.json modlar). Varsayılan N. Seçili dosyanın çubuğu: Kaydet · N|T|S · Çalıştır/Durdur (tek düğme) · Sil; koşarken Durdur olur, S seçiliyse "Solo başlat".

Üç mod

ModNasıl koşarHeapDahili DRAMNe için
N NormalTek ortak iş parçacığında asyncio görevi2–15 KB0 (ortak çalışan bir kez 17 KB)LED, sensör, küçük sayfa: çoğu proje
T ThreadKendi FreeRTOS thread'i, GIL ile dilimli (yalnız ESP32)aynı10–15 KBEkran çizen, sleep'siz sıkı döngü, ağır hesap
S SoloPanel kapalı, kart yeniden başlar, tek projehepsihepsiBLE, HTTPS

Normal mod nasıl çalışır: proje dosyası satır satır async def içine sarılır, üst düzey adlar global ilan edilir, cyd.sleep( → await, time.sleep( → await. Sonuç geçici dosyaya akıtılır ve execfile ile dosyadan derlenir; 12 KB'lik kaynak string olarak heap'e hiç girmez. Bekleme çağrısı bir def gövdesindeyse dönüşüm uymaz (MicroPython await'i düz def içinde sessizce generator'a çevirir, gövde hiç çalışmaz); ön tarama bunu yakalar ve proje kendiliğinden T'de açılır, log nedenini yazar. async def yazarsan dokunulmaz, main() koroutini çalıştırılır.

Solo tek seferliktir: main.py bayrağı ilk iş olarak siler; RESET'e basınca panel geri gelir. Panel: dosyayı seç → S → Çalıştır → WiFi açık/kapalı sorusu. API: POST /api/solo?name=<dosya>&wifi=0|1.

İki bellek

ESP32'de iki ayrı cep vardır ve kritik olan ikincisi:

MicroPython heapProjelerin verisi, gc.mem_free()
Dahili DRAMWiFi, soketler, thread yığınları, BLE, TLS. cyd.dram()

gc.mem_free() bol görünürken thread açılamayabilir ya da BLE/TLS ENOMEM verebilir. Doğru ölçüm panelin sistem kutusu ya da cyd.dram().

CYDStok v1.28.0CYD Studio firmware'i
Dahili DRAM boş, panel açık27,8 KB55 KB
Python heap boş80 / 137 (otomatik büyür, DRAM'i yutar)75 / 94 (sabit 96 KB)
Aynı anda proje1 (ikincisi can't create thread)7 normal + 2–3 thread

Firmware ne yaptı: 12 çekirdek modülü flash'a dondu; heap sabitlendi (otomatik ikiye katlama 2 küçük projeyle DRAM'i 76 → 12 KB'ye düşürüyordu); lwIP/WiFi tamponları küçüldü; canlı log halkası 250 → 100 satır (250 satır 20,7 KB tutup heap'i parçalıyordu); sunucu soket zaman aşımı 5 saniye.

Thread yığını dahili DRAM'den çıkar: proje başına 10–15 KB. Ekran çizen proje heap'ten 25–33 KB alır (durunca geri gelir). Sızıntı yok: aynı proje 4 kez aç/kapat → 65,7 / 65,7 / 65,9 / 65,8 KB.

Ölçüldü: yan yana projeler (CYD)

Sırayla açılanHeap'tenDRAM'denKoşan
yuk_kontrol (12 KB kaynak + /yuk rotaları)12,2 KB17,3 KB (ortak çalışan, bir kez)1
led_yakip_sondur2,202
gece_lambasi8,20,33
ornek_led4,704
isik_olcum7,705
harici_led7,107
ornek_isik_sensoru (ekrana çizer)33 KB → heap 1 KB08

Yedi küçük proje yan yana, dahili RAM 37 KB'de sabit; sınır artık heap. Heap'i büyütmek gerekirse frozen_esp32_build.py --heap 112 (DRAM 55 → 39 KB, yine 2 thread sığar).

Gerçekten yan yana mı?

10 ms'de bir tur atan "buton yoklayıcı" proje, turlar arası en uzun boşluk (15 saniye):

Senaryoortalamaen uzun>100 ms boşluk
Tek başına, normal12,9 ms21 ms0
+ 4 normal proje (LED/LDR)15,93525
+ ekrana çizen proje (normal)25,597333
+ thread'de %90 CPU hesap21134055
Aynı yük, yoklayıcı T modunda12,0370

Okuma: LED/sensör komşularıyla normal mod gerçekten dönüşümlü. Ekrana çizen proje normal modda kötü komşudur (SPI dolgusu tek iş parçacığını ~1 sn tutar): T yap. CPU'yu bırakmayan thread normal çalışanı aç bırakır: ağır döngüye cyd.sleep(0.001) koy ya da giriş projesini T yap. Buton için asıl yol yoklama değil cyd.buton (kesme).

Durdurma ve bekçi

Thread izolasyon sağlamaz: MicroPython'un GIL'i var, aynı anda tek thread bytecode çalıştırır. CPU'yu bırakmayan bir proje paneli aç bırakır. Buna karşı:

  1. Sunucu her turda nabız yazar; dinleyici soket zaman aşımlıdır ki accept() nabzı durdurmasın.
  2. İlk iş başlayınca bir bekçi thread'i açılır, 2 saniyede bir nabza bakar.
  3. Panel 20 saniye nabız vermezse çalışan projelere durdurma bayrağı.
  4. Proje 4 saniyede durmazsa machine.reset(). Panel her koşulda geri gelir; doğrulandı: boğan proje 28. saniyede durduruldu, panel 302 ms'ye döndü.

ESP8266'da

_thread yok. N = sunucunun asyncio döngüsünde görev (T cipi gizli), S var. Ölçüldü: 3 normal proje yan yana, heap 19 → 9 KB (proje başına 2,5–5 KB), panel en uzun 0,69 sn. Pratik sınır 3 proje. cyd.sleep() çağırmayan proje için zamanlayıcı kesicisi 100 ms'de bir bakar, 400 ms'dir pompa dönmediyse sunucu turunu iki bytecode arasına sokar; while True: x += 1 koşarken 6/6 durum sorgusu cevaplandı. Durdurma isteği 4,5 saniyeyi aşarsa loga !!! yanit vermiyor yazılıp kart resetlenir (~10 sn'de panel geri gelir).

Son güncelleme 2026-10-17 · Bu sayfa Markdown olarak