STM32F767 ethernet rychlost

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Čtvrtek Říjen 19 22:36:11 CEST 2017


Omlouvam se autorum LWIP,  STM, CUBE atp. a sypu si popel na hlavu, uz 
jsem zjistil, ze raw api nelze volat z jineho vlakna...
S pouzitim netconn vse za se funguje k plne spokojenosti... Kdyz uz je 
tu tak mrtvo, treba to nekomu pomuze ;-)

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/20171019/a9803898/attachment.html>


Další informace o konferenci Hw-list