STM32F767 ethernet rychlost

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Sobota Říjen 7 14:25:52 CEST 2017


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 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/20171007/4d91dd1c/attachment.html>


Další informace o konferenci Hw-list