Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

STM32 Ethernet Problemi

Başlatan flowchartx, 08 Şubat 2023, 08:50:22

flowchartx

Herkese merhabalar F7 serisinde koşan bir ethernet udp programım var. Program iyi hoş her şey istediğim gibi çalışıyor. Sürekli pc ile veri alışveri içindeler. Bir matrix buton ile karta veri girişi yapıyorum. O da bunu pcye yolluyor. Ama ben 1 saat veri girişi yapmaz isem haberleşme donuyor. MPU birimini kullanmıyorum programda. Bir zararınıda görmedim. Acaba bu kopma/donmanın sebebi nedir?

kimlenbu

Cihazı debug'da bırakıp ETH donanımına ait register'ları gözlemeden yorum yapmak zor. MCU'nun kilitlenmediğinden emin misiniz ? Önce bir dahili watch dog'u kullanmayı deneyin isterseniz.

Ethernet kütüphanesinde deadlock'a sebep olabilecek kısımlar var, while döngüsünde takılabileceği bölümler çıkabiliyor, kütüphaneyi modifiye edip timeout özelliği eklemek gerekebilir.

flowchartx

Debuga bırakıp sadece kullandığım değişkenleri izledim. Haberleşme donduktan sonra her şey normal gözüküyor. Breakpointlerde duruyor, değişkenler olması gibi artıp azalıyor, Veri gönderiyor fakat veri almıyor. Ethernet registerlarını izlemedim onlarıda bir izlemeyi deneyeyim. Aklıma şöyle bişey geldi lwip kütüphanesinde ki p bufferında sıkıntı oluyor olabilir mi acaba ?

kimlenbu

Buffer boyutunu arttırıp denemek lazım, belki farkında olmadan taşmaya sebep oluyordur. Hangi mcu'da hangi ram bölgesini kullanıyorsunuz önemli aslında.

flowchartx

F746VG kullanıyorum. Hatayı aldıktan sonra TxBufferı ve RxBufferı SRAM'e yerleştirdim. Birde öyle denemek için Buffer boyutunu 10*1024 yaptım fakat daha kısa sürede kopmalar yaşadım. Şuan bufferlarım 0x20000738 den sonra default olarak yerleşiyorlar. lwipde ki boyutta 1600 byte. Haberleşmede en çok gönderdiğim veri 24 byte. İşin içinden çıkamadım bir türlü

Ziya

udp hiç kullanmadım. tcp de veri aldığınızda window alanı küçülür, 0 olduğunda veri alamazsınız. Veri gönderdiğinizde window artar. Veri aldıktan sonra lwip nin windowu orjinal boyutuna getirmesi için tcp_recved fonksiyonunu çağırmanız gerekir. Programı echo_server yazılımından kopyalamış iseniz orada gelen payload boyutu kadar geri gönderildiği için window boyutu değişmiyor, o nedenle tcp_recved fonksiyonunu çağırmamışlar. 2020 de bu sorunla karşılaştığımızda ST firmasına yazmıştık, cevap olarak bu şekilde kullanmamızı bildirmişlerdi.
...
else if(es->state == ES_CLOSING)
  {
    /* odd case, remote side closing twice, trash data */
    tcp_recved(tpcb, p->tot_len); /* windowu orjinal haline getirir */
    es->p = NULL;
    pbuf_free(p);
    ret_err = ERR_OK;
  }
...
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

sımışka

#6
1 saat matrix buton ile veri girişi yapmadığınız senaryoda, server-client arasında aktif belirli periyot / olaylarla devam eden bir hearbeat haberleşmeniz var mı ?
lwip sürümü nedir ? ve mümkünse wireshark görüntüsü / pcap dosyası paylaşabilir misiniz ?

ilyas KAYA

#7
Ping atmayı deneyin muhtemelen handshaking kopartiyor sizi. 5dk yada 10dk bir ping deneyin

Benzer Konular (5)