STM32F767 ethernet rychlost

Jiří Nesvacil nesvacil na posys.eu
Neděle Říjen 8 08:51:48 CEST 2017


V implementacich TCP je, ze po x us/ms nebo zaplneni bufferu se odesle 
packet. Nevola se explicitne tcp_output, to si zajistti ta nizsi vrstva 
sama. Mozna Vam v tom lwpi neco chybi, nejake pravidelne volani obsluhy 
ethernetu. Rozhodne by se ethernet mel obslouzit vicekrat nez vola ten 
Vas sw, pote to spatne dopadne asi nejspis jak pisete. Mozna to lwpi 
neovlada prijeti vice packetu najednou, ktere jdou mimo poradi a tim je 
nizsi rychlost, to nevim.

Jirka

Dne 07.10.2017 v 14:25 Jaroslav Buchta napsal(a):
> 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
>
> Co je horsi, je stabilita, pokud posilam data max. rychlosti, dojde po 
> case k zacykleni, coz me trosku znervoznuje... Proto ten delay.
>
> 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
>
> Ma nekdo nejake hlubsi zkusenosti jak to dal stabilizovat?
>
>
> 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...)
>
>         if (connCount != 0)
>         {
>             uint16_t n = tcp_sndbuf(pcbAccepted);
>             if (n == 0)
>             {
>                 osDelay(3);
>             }
>             else
>             {
>                 if (n > sizeof(bufSend)) n = sizeof(bufSend);
>                 err_t e = tcp_write(pcbAccepted, bufSend, n, 
> TCP_WRITE_FLAG_MORE);    //TCP_WRITE_FLAG_MORE);
>                 if (e == ERR_OK)
>                 {
>                     tcp_output(pcbAccepted);
>                     HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, 
> GPIO_PIN_SET);
>                 }
>                 else
>                 {
>                     //Error_Handler();
>                 }
>             }
>         }
>
>
>
> Dne 07.10.2017 v 11:50 Jaroslav Buchta napsal(a):
>> Tak jsem zjistil, ze klicove je pouzit
>> tcp_nagle_disable(pcb);
>> Nyni to zase zdrzuje PC nez odpovi ACK, jdu zkoumat dal...
>>
>> Dne 07.10.2017 v 11:31 Jaroslav Buchta napsal(a):
>>> Zdravim,
>>>
>>> mam problem s implementaci subj, pouziva HAL, vse nakonfigurovano 
>>> pokusne v prazdnem projektu.
>>>
>>> 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.
>>>
>>> Pres switch to chodi asi 3x rychleji nez primo pripojene k PC, asi 
>>> to servisni komunikace nejak zahlti? Nebo delam neco spatne?
>>>
>>> Sledovana komunikace ale vypada plynula bez komplikaci, .123 je PC, 
>>> .9 STM, viz priloha
>>>
>>>
>>> Vypis dulezite casti programu:
>>>
>>> /* USER CODE BEGIN 4 */
>>> static err_t echo_accept(void *arg, struct tcp_pcb *pcb, err_t err);
>>> static err_t echo_recvd(void * arg, struct tcp_pcb * tpcb, struct 
>>> pbuf * p, err_t err);
>>> static err_t echo_sent(void * arg, struct tcp_pcb * tpcb, u16_t len);
>>> static void echo_err(void * arg, err_t err);
>>>
>>> static struct tcp_pcb *pcbListened = NULL;
>>> static struct tcp_pcb *pcbAccepted = NULL;
>>> static int connCount;
>>> static osSemaphoreId transferSemphHandle = NULL;
>>>
>>> static err_t echo_accept(void *arg, struct tcp_pcb *pcb, err_t err)
>>> {
>>>     LWIP_UNUSED_ARG(arg);
>>>     LWIP_UNUSED_ARG(err);
>>>     if (pcbListened == NULL) return ERR_ARG;
>>>     if (connCount >= 1)
>>>     {
>>>         tcp_abort(pcb);
>>>         return ERR_ABRT;
>>>     }
>>>     connCount++;
>>>     tcp_arg(pcb, NULL);
>>>     tcp_recv(pcb, echo_recvd);
>>>     tcp_sent(pcb, echo_sent);
>>>     tcp_err(pcb, echo_err);
>>>     //      tcp_setprio(pcb, TCP_PRIO_MIN);
>>>     tcp_accepted(pcbListened);
>>>     pcbAccepted = pcb;
>>>     return ERR_OK;
>>> }
>>>
>>>
>>> static err_t echo_recvd(void * arg, struct tcp_pcb * tpcb, struct 
>>> pbuf * p, err_t err)
>>> {
>>>     if (p == NULL)
>>>     {   // EOF signal, connection closed
>>>         tcp_close(tpcb);
>>>         pcbAccepted = NULL;
>>>         connCount--;
>>>         if (arg != NULL)
>>>         {
>>>             //            mbsDescFree((MBS_Descriptor *)arg);
>>>         }
>>>     }
>>>     else
>>>     {
>>>         tcp_recved(tpcb, p->tot_len);
>>>         //        DBGUSART_Format("MBS-> Received %08x, %d 
>>> B"DBGSTRNL, (uint32_t)tpcb, p->tot_len);
>>>         uint8_t *pd = (uint8_t *)p->payload;
>>>         uint16_t len = p->len;
>>>         uint8_t exc = 0;
>>>
>>>         if (p != NULL) pbuf_free(p);
>>>     }
>>>     return ERR_OK;
>>> }
>>>
>>> uint8_t bufSend[1024];
>>> uint8_t sendPcs = 0;
>>>
>>> static err_t echo_sent(void * arg, struct tcp_pcb * tpcb, u16_t len)
>>> {
>>>     osSemaphoreRelease(transferSemphHandle);
>>>     //TerminalFormatNl("MBS-> Sent %08x, %d B", (uint32_t)tpcb, 
>>> (uint32_t)len);
>>>     //osMutexRelease(transferMutexHandle);
>>>     HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
>>>     return ERR_OK;
>>> }
>>>
>>> static void echo_err(void * arg, err_t err)
>>> {
>>>
>>> }
>>>
>>>
>>>
>>> /* USER CODE END 4 */
>>>
>>> /* StartDefaultTask function */
>>> void StartDefaultTask(void const * argument)
>>> {
>>>   /* init code for LWIP */
>>>   MX_LWIP_Init();
>>>
>>>   /* USER CODE BEGIN 5 */
>>>     osSemaphoreDef(transferSemph);
>>>     transferSemphHandle = 
>>> osSemaphoreCreate(osSemaphore(transferSemph), 1);
>>>
>>>     struct tcp_pcb *pcb = tcp_new();
>>>     if (pcb == NULL) Error_Handler();
>>>     err_t err = tcp_bind(pcb, IP_ADDR_ANY, 52222);
>>>     if (err != ERR_OK) Error_Handler();
>>>     pcb = tcp_listen(pcb);
>>>     if (pcb == NULL) Error_Handler();
>>>     tcp_accept(pcb, echo_accept);
>>>     pcbListened = pcb;
>>>
>>>     uint32_t tckLed = 0;
>>>
>>>     /* Infinite loop */
>>>     for(;;)
>>>     {
>>>         uint32_t tck = osKernelSysTick();
>>>         if (tck-tckLed>250)
>>>         {
>>>             tckLed = tck;
>>>             HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
>>>         }
>>>         osSemaphoreWait(transferSemphHandle, 50);
>>>         if (connCount != 0)
>>>         {
>>>             err_t e =  tcp_write(pcbAccepted, bufSend, 
>>> sizeof(bufSend), TCP_WRITE_FLAG_MORE);
>>>             if (e == ERR_OK)
>>>             {
>>>                 HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, 
>>> GPIO_PIN_SET);
>>>             }
>>>             else
>>>             {
>>>
>>>             }
>>>         }
>>>     }
>>>   /* USER CODE END 5 */
>>> }
>>>
>>>
>>>
>>> _______________________________________________
>>> HW-list mailing list  -  sponsored bywww.HW.cz
>>> Hw-list na list.hw.cz
>>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>>
>>
>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored bywww.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
>
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list

------------- dal¹í èást ---------------
HTML pøíloha byla odstranìna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20171008/e26e3482/attachment-0001.html>


Další informace o konferenci Hw-list