STM32F767 ethernet rychlost

Josef Štengl ok1ced na nagano.cz
Sobota Říjen 7 19:21:04 CEST 2017


Nepíši nic informativně hodnotného jen aby vám nebylo v tomto vlákně samotnému moc smutno :-D

U 180 MHz ARMu jsem dosáhl stabilně přenos něco přes 2,4 Mbit. Ale:
Byl to cortex R (je to oproti M malinko rychlejší), bylo to UDP a vlastní minimalistická implementace, která zvládala jen 
UDP přenos a minimální podporu ARP, aby se mě to neodpojovalo od PC. Zakoplo to o první router v cestě (což byla vlastnost 
v tomto případě kladně vnímaná :-). Neumělo to skládat pakety (nebylo cílem) a nepočítalo to checksumu (v tomto případě 
zbytečné, protože data byla jen z jednoho paketu), takže jen IPv4.
Nebylo to od ST, ale to by nemělo mít velký vliv.

Test probíhal tak, že jsem vysílal z ARMu a PC mě vracelo pozměněné pakety. Cílem bylo dostat spoustu dat z ARMu, tak jsem 
nic jiného neřešil.

To jen pro porovnání. 1MBit se mě zdá, jako neodborníkovi, blížící se limitu. Přeci jen, je to TCP.

Bohužel s LwIP nepomohu, sice jsem ho četl ale nepoužíval.

Jediný důvod proč by se přenos mohl kousnout, který mě napadá jako totálního diletanta je, jestli se neposílají 
vícerámcové TCP pakety, ale jejich další části jsou odmítnuty kvůli nestíhání a začátky TPC paketů pak nezaplní buffery 
čekajíc na své konce, kteréžto nemohou přijít, protože nemají kam.

Jo a pochlubte se, jestli se vám podaří stabilní přenos.
Díky.



Dne 7.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 by www.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
>
>
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>


Další informace o konferenci Hw-list