<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html;
      charset=iso-8859-2">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">Tak zpet, to ani tak klicove neni,
      dulezitejsi je zavolat tcp_output(pcb), bez toho to posle az po
      nejakem timeoutu, i kdyz jsou plne buffery<br>
      <br>
      Co je horsi, je stabilita, pokud posilam data max. rychlosti,
      dojde po case k zacykleni, coz me trosku znervoznuje... Proto ten
      delay.<br>
      <br>
      Jeste jsem zmenil princip cekani na pakety v
      ethernetif.c/ethernetif_input, je tam binarni semafor, tak kdyz to
      nestihne oblouzit do prichodu dalsiho paketu, ztrati se informace
      a pakety se zacnou "courat" zpozdene. Zmenil jsem ho na pocitaci a
      pocet bufferu zvetsil ze 4 -> 8<br>
      <br>
      Ma nekdo nejake hlubsi zkusenosti jak to dal stabilizovat?  <br>
      <br>
      <br>
      Nejstabilnejsi vysledky dava tento program ale stejne se dosahne
      jenom cca 500kB/s: (s optimalizovanym prekladem 1MB pokud delay
      zmensim na 1ms, ale Yield nestaci a stejne se to po cca 300MB
      sekne...)<br>
      <br>
              if (connCount != 0)<br>
              {<br>
                  uint16_t n = tcp_sndbuf(pcbAccepted);<br>
                  if (n == 0)<br>
                  {<br>
                      osDelay(3);<br>
                  }<br>
                  else<br>
                  {<br>
                      if (n > sizeof(bufSend)) n = sizeof(bufSend);<br>
                      err_t e = tcp_write(pcbAccepted, bufSend, n,
      TCP_WRITE_FLAG_MORE);    //TCP_WRITE_FLAG_MORE);<br>
                      if (e == ERR_OK)<br>
                      {<br>
                          tcp_output(pcbAccepted);<br>
                          HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin,
      GPIO_PIN_SET);<br>
                      }<br>
                      else<br>
                      {<br>
                          //Error_Handler();<br>
                      }<br>
                  }<br>
              }<br>
      <br>
      <br>
      <br>
      Dne 07.10.2017 v 11:50 Jaroslav Buchta napsal(a):<br>
    </div>
    <blockquote type="cite"
      cite="mid:90c8c6be-4382-8a64-652e-d604258bdaee@hascomp.cz">
      <meta http-equiv="Content-Type" content="text/html;
        charset=iso-8859-2">
      <div class="moz-cite-prefix">Tak jsem zjistil, ze klicove je
        pouzit<br>
        tcp_nagle_disable(pcb);<br>
        Nyni to zase zdrzuje PC nez odpovi ACK, jdu zkoumat dal...<br>
        <br>
        Dne 07.10.2017 v 11:31 Jaroslav Buchta napsal(a):<br>
      </div>
      <blockquote type="cite"
        cite="mid:573b179a-ec92-e34b-df7a-6c12ec60f3b2@hascomp.cz">Zdravim,
        <br>
        <br>
        mam problem s implementaci subj, pouziva HAL, vse
        nakonfigurovano pokusne v prazdnem projektu. <br>
        <br>
        Aplikace pouze odesila data po pripojeni klienta, prenosova
        rychlost je zoufala, asi 1kB/s.... Netusi nekdo, v cem muze byt
        problem? Asi malo nejakych bufferu? Ale experimenty nikam
        nevedly. <br>
        <br>
        Pres switch to chodi asi 3x rychleji nez primo pripojene k PC,
        asi to servisni komunikace nejak zahlti? Nebo delam neco spatne?
        <br>
        <br>
        Sledovana komunikace ale vypada plynula bez komplikaci, .123 je
        PC, .9 STM, viz priloha <br>
        <br>
        <br>
        Vypis dulezite casti programu: <br>
        <br>
        /* USER CODE BEGIN 4 */ <br>
        static err_t echo_accept(void *arg, struct tcp_pcb *pcb, err_t
        err); <br>
        static err_t echo_recvd(void * arg, struct tcp_pcb * tpcb,
        struct pbuf * p, err_t err); <br>
        static err_t echo_sent(void * arg, struct tcp_pcb * tpcb, u16_t
        len); <br>
        static void echo_err(void * arg, err_t err); <br>
        <br>
        static struct tcp_pcb *pcbListened = NULL; <br>
        static struct tcp_pcb *pcbAccepted = NULL; <br>
        static int connCount; <br>
        static osSemaphoreId transferSemphHandle = NULL; <br>
        <br>
        static err_t echo_accept(void *arg, struct tcp_pcb *pcb, err_t
        err) <br>
        { <br>
            LWIP_UNUSED_ARG(arg); <br>
            LWIP_UNUSED_ARG(err); <br>
            if (pcbListened == NULL) return ERR_ARG; <br>
            if (connCount >= 1) <br>
            { <br>
                tcp_abort(pcb); <br>
                return ERR_ABRT; <br>
            } <br>
            connCount++; <br>
            tcp_arg(pcb, NULL); <br>
            tcp_recv(pcb, echo_recvd); <br>
            tcp_sent(pcb, echo_sent); <br>
            tcp_err(pcb, echo_err); <br>
            //      tcp_setprio(pcb, TCP_PRIO_MIN); <br>
            tcp_accepted(pcbListened); <br>
            pcbAccepted = pcb; <br>
            return ERR_OK; <br>
        } <br>
        <br>
        <br>
        static err_t echo_recvd(void * arg, struct tcp_pcb * tpcb,
        struct pbuf * p, err_t err) <br>
        { <br>
            if (p == NULL) <br>
            {   // EOF signal, connection closed <br>
                tcp_close(tpcb); <br>
                pcbAccepted = NULL; <br>
                connCount--; <br>
                if (arg != NULL) <br>
                { <br>
                    //            mbsDescFree((MBS_Descriptor *)arg); <br>
                } <br>
            } <br>
            else <br>
            { <br>
                tcp_recved(tpcb, p->tot_len); <br>
                //        DBGUSART_Format("MBS-> Received %08x, %d
        B"DBGSTRNL, (uint32_t)tpcb, p->tot_len); <br>
                uint8_t *pd = (uint8_t *)p->payload; <br>
                uint16_t len = p->len; <br>
                uint8_t exc = 0; <br>
        <br>
                if (p != NULL) pbuf_free(p); <br>
            } <br>
            return ERR_OK; <br>
        } <br>
        <br>
        uint8_t bufSend[1024]; <br>
        uint8_t sendPcs = 0; <br>
        <br>
        static err_t echo_sent(void * arg, struct tcp_pcb * tpcb, u16_t
        len) <br>
        { <br>
            osSemaphoreRelease(transferSemphHandle); <br>
            //TerminalFormatNl("MBS-> Sent %08x, %d B",
        (uint32_t)tpcb, (uint32_t)len); <br>
            //osMutexRelease(transferMutexHandle); <br>
            HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET); <br>
            return ERR_OK; <br>
        } <br>
        <br>
        static void echo_err(void * arg, err_t err) <br>
        { <br>
        <br>
        } <br>
        <br>
        <br>
        <br>
        /* USER CODE END 4 */ <br>
        <br>
        /* StartDefaultTask function */ <br>
        void StartDefaultTask(void const * argument) <br>
        { <br>
          /* init code for LWIP */ <br>
          MX_LWIP_Init(); <br>
        <br>
          /* USER CODE BEGIN 5 */ <br>
            osSemaphoreDef(transferSemph); <br>
            transferSemphHandle =
        osSemaphoreCreate(osSemaphore(transferSemph), 1); <br>
        <br>
            struct tcp_pcb *pcb = tcp_new(); <br>
            if (pcb == NULL) Error_Handler(); <br>
            err_t err = tcp_bind(pcb, IP_ADDR_ANY, 52222); <br>
            if (err != ERR_OK) Error_Handler(); <br>
            pcb = tcp_listen(pcb); <br>
            if (pcb == NULL) Error_Handler(); <br>
            tcp_accept(pcb, echo_accept); <br>
            pcbListened = pcb; <br>
        <br>
            uint32_t tckLed = 0; <br>
        <br>
            /* Infinite loop */ <br>
            for(;;) <br>
            { <br>
                uint32_t tck = osKernelSysTick(); <br>
                if (tck-tckLed>250) <br>
                { <br>
                    tckLed = tck; <br>
                    HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin); <br>
                } <br>
                osSemaphoreWait(transferSemphHandle, 50); <br>
                if (connCount != 0) <br>
                { <br>
                    err_t e =  tcp_write(pcbAccepted, bufSend,
        sizeof(bufSend), TCP_WRITE_FLAG_MORE); <br>
                    if (e == ERR_OK) <br>
                    { <br>
                        HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin,
        GPIO_PIN_SET); <br>
                    } <br>
                    else <br>
                    { <br>
        <br>
                    } <br>
                } <br>
            } <br>
          /* USER CODE END 5 */ <br>
        } <br>
        <br>
        <br>
        <fieldset class="mimeAttachmentHeader"></fieldset>
        <br>
        <pre wrap="">_______________________________________________
HW-list mailing list  -  sponsored by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz" moz-do-not-send="true">www.HW.cz</a>
<a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz" moz-do-not-send="true">Hw-list@list.hw.cz</a>
<a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list" moz-do-not-send="true">http://list.hw.cz/mailman/listinfo/hw-list</a>
</pre>
      </blockquote>
      <p><br>
      </p>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
HW-list mailing list  -  sponsored by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a>
<a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
<a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
</pre>
    </blockquote>
    <p><br>
    </p>
  </body>
</html>