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