реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> LwIP инициировать передачу
ConstHw
сообщение Nov 20 2015, 08:16
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 12-11-15
Пользователь №: 89 287



Разбираюсь с 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 а потом начать свою передачу?
Go to the top of the page
 
+Quote Post
shpongle
сообщение Dec 9 2015, 19:36
Сообщение #2





Группа: Новичок
Сообщений: 4
Регистрация: 1-11-15
Пользователь №: 89 128



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

Инициировать передачу лучше в основной программе, в функции main. А в функции recv_callback
устанавливать флаг запроса на передачу/чтение.
Go to the top of the page
 
+Quote Post
ConstHw
сообщение Dec 15 2015, 08:55
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 12-11-15
Пользователь №: 89 287



Хм, 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 не добавлял скорости
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th August 2025 - 17:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01344 секунд с 7
ELECTRONIX ©2004-2016