Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LwIP инициировать передачу
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
ConstHw
Разбираюсь с LwIP, c записью данных (PC пишет в Zynq) все вроде понятно.
Пытаюсь иниицировать передачу. Приходит пакет-команда "дай данных", в обработчике пакета вызываю функцию
Код
err_t recv_callback(void *arg, struct tcp_pcb *tpcb,
                               struct pbuf *p, err_t err)

    if (!p) {
        tcp_close(tpcb);
        tcp_recv(tpcb, NULL);
        return ERR_OK;
    }
    /* indicate that the packet has been received */
    tcp_recved(tpcb, p->len);

///// ТУТ ОБРАБОТАЛИ КОМАНДУ И ВЫЯСНИЛИ ЧТО НАДО ЧИТАТЬ/////

for (i=0;i<10;++) // Запускаем передачу 10 раз
        if (tcp_sndbuf(tpcb) > p->len) { //Проверили что есть место
                        tcp_write(tpcb, tcptrx->curr_addr, step, 1); //Пищем пакет длины step
            tcptrx->curr_addr=tcptrx->curr_addr+step; // Инкерементим Step
            xil_printf("    Curr Addr : 0x"); putnum(tcptrx->curr_addr);xil_printf("\r\n");
        }
    }


В консоли вижу пробегание счетчика адресов, но на приемной стороне ничего не появляется.
Мне кажется, что я неправильно инициирую передачу. Как сделать это правильно? Чтобы сначала закончить обработку принятого pbuf а потом начать свою передачу?
shpongle
После tcp_write надо сделать tcp_output, чтобы отправить данные.
Следующую порцию можно отправить таким же образом, но лучше через функцию sent_callback,
которая привязывается через функцию tcp_sent. Функция sent_callback вызывается всякий раз,
когда приходит подтверждение данных и освобождается память в tcp_sndbuf.
Условие if (tcp_sndbuf(tpcb) > p->len) не внятное, что программа будет делать?

Инициировать передачу лучше в основной программе, в функции main. А в функции recv_callback
устанавливать флаг запроса на передачу/чтение.
ConstHw
Хм, Xilinx в своих примерах шлет внутри вызываемой по таймауту функции transfer_data()
Код
    /* receive and process packets */
    while (1) {
        if (TcpFastTmrFlag) {
            tcp_fasttmr();
            TcpFastTmrFlag = 0;
        }
        if (TcpSlowTmrFlag) {
            tcp_slowtmr();
            TcpSlowTmrFlag = 0;
        }
        xemacif_input(echo_netif);
        transfer_data();
    }


Я пробовал и так и так, вызов через sent_callback() той же transfer_data не добавлял скорости
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.