Etkilesimli STM32 USB CDC ve Ring Buffer

İçindekiler

Etkilesimli STM32 USB CDC ve Ring Buffer#

STM32 / Ders 16

Bu laboratuvar, `USB CDC` haberlesmesini yalnizca "terminal acildi, veri geldi" seviyesinde degil; `RX callback`, `ring buffer`, `line framing`, `parser budget` ve `overflow` arasindaki gercek bag olarak gorunur kilar. Hedef, host'tan gelen veri patlamalarinda neden callback'in hafif kalmasi gerektigini ve neden parser'in task seviyesinde, kontrollu bir `ring buffer` akisi uzerinden calistirilmasinin daha dayanikli oldugunu sezgisel hale getirmektir.

Ne Yap Trafik profilini, ring buffer boyutunu, parser butcesini, servis araligini ve framing modunu degistir; ardindan backlog, kayip byte ve tamamlanan komut sayisini izle.
Ne Ogren `CDC_Receive_FS`, `ring write`, `line parser`, `overflow`, `backpressure` ve `newline` seciminin neden tek karar zinciri oldugunu gor.
Gorev Once terminal komutlarini temizce akan bir ayar kur. Sonra burst profiline gecip kucuk buffer ile neden veri kaybi yasandigini gor; en sonda parser ritmini arttirarak sistemi toparla.
USB CDC tarafinda asil hata cogu zaman "USB bozuk" degildir. Sorun genellikle callback icinde fazla is yapilmasi, ring buffer'in kucuk secilmesi ya da parser'in `newline` beklerken backlog biriktirmesidir.

Bu Derste Ne Oturmali?#

  1. USB CDC RX callback, veri kopyalama ve yeniden Receive hazirlama gibi hafif isler icin iyidir; parser’in tamamini callback icine yigmamak gerekir.

  2. Ring buffer, host patlamalari ile uygulama parser hizi arasinda tampon gorevi gorur; kucuk secilirse byte kaybi, gereksiz buyuk secilirse gizli gecikme artabilir.

  3. Line framing, komut tabanli sistemlerde temizdir; ama newline gec gelirse parser bir sure hicbir sey uretmeyebilir ve backlog siser.

  4. Dogru USB CDC tasarimi sadece printf atmak degil; gelen veri profiline, parser ritmine ve buffer geri basincina birlikte bakmaktir.

Not

Bir sonraki dogal laboratuvarlar reset reason + backup registers, stream buffer / message buffer, FDCAN + mailbox ya da USB CDC + DMA / double buffer olabilir.