Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Cетевые протоколы и технологии

Cетевые протоколы и технологии TCP/IP стек

Ответ
 
Опции темы Опции просмотра
Старый 25.06.2018, 11:14   #1
maxNTF
Senior Member
 
Регистрация: 12.07.2007
Возраст: 35
Сообщений: 908
Вес репутации: 287/53
maxNTF is a jewel in the roughmaxNTF is a jewel in the roughmaxNTF is a jewel in the rough
Question uIP - кто вызывает uip_poll?

Всем привет!
Кто подскажет где вызывается периодическое событие пулинг, после конекта с удаленным хостом. Я думал что оно вызывается только принудительно функцией uip_poll_conn, чтоб экстренно вызвать калбак функцию для передачи данных. Но вызов происходит с постоянной периодичностью, у меня 800мсек. uIP + FreeRTOS. Может в uIP есть какой то таймер, тогда где он настраивается, и можно ли его отключить?
Код:
void vTask_uIP_periodic(void *pvParameters) {
	uint32_t i;
	uint8_t delay_arp = 0;

	for (;;) {
		vTaskDelay(configTICK_RATE_HZ/2);
		delay_arp++;
		for (i = 0; i < UIP_CONNS; i++) {//обрабатываем все соединения заданные в макросе UIP_CONF_MAX_CONNECTIONS
			uip_periodic(i);
			if (uip_len > 0) {
				uip_arp_out();//запрос наличия записи с адресом destination IP
				if(xSemaphoreTake(xSemSPI2, 100) != pdTRUE)	{//задать верное ТО!!!!!!!!!!
					//что-то делать с ошибкой!!!!!!!!!
				}else	{
					enc28j60_send_packet((uint8_t *) uip_buf, uip_len);
					xSemaphoreGive(xSemSPI2);
				}
			}
		}
		if (delay_arp >= 20) {//вызов каждые 10 секунд
			delay_arp = 0;
			uip_arp_timer();//проверка записей с адресом destination IP
		}
	}
}
//--------------------------------------------------------------
void vTask_uIP(void *pvParameters) {

	for (;;) {
		if(xSemaphoreTake(xSemSPI2, 100) != pdTRUE)	{//задать верное ТО!!!!!!!!!!
			//что-то делать с ошибкой!!!!!!!!!
		}else	{
			uip_len = enc28j60_recv_packet((uint8_t *) uip_buf, UIP_BUFSIZE);
			xSemaphoreGive(xSemSPI2);
		}

		if (uip_len > 0) {
			if (BUF->type == htons(UIP_ETHTYPE_IP)) {//если пакет IP, то засылаем в стек
				uip_arp_ipin();
				uip_input();
				if (uip_len > 0) {
					uip_arp_out();
					if(xSemaphoreTake(xSemSPI2, 100) != pdTRUE)	{//задать верное ТО!!!!!!!!!!
						//что-то делать с ошибкой!!!!!!!!!
					}else	{
						enc28j60_send_packet((uint8_t *) uip_buf, uip_len);
						xSemaphoreGive(xSemSPI2);
					}
				}
			}else if (BUF->type == htons(UIP_ETHTYPE_ARP)) {//если это касается ARP, то передаем в блок ARP
				uip_arp_arpin();
				if (uip_len > 0) {
					if(xSemaphoreTake(xSemSPI2, 100) != pdTRUE)	{//задать верное ТО!!!!!!!!!!
						//что-то делать с ошибкой!!!!!!!!!
					}else	{
						enc28j60_send_packet((uint8_t *) uip_buf, uip_len);
						xSemaphoreGive(xSemSPI2);
					}
				}
			}
		}
		vTaskDelay(1);
	}
}

void vTask_IpConnect(void *pvParameters)
{
	uip_ipaddr_t ipaddr;
	uint8_t c_err;
	
	myip_state.flag_Abort = 0;
	for(;;)	{
		vTaskDelay(configTICK_RATE_HZ*5);
		if(myip_state.state == STATE_DISCONNECT) {
			uip_ipaddr(&ipaddr, 192,168,0,10);
			my_conn = uip_connect(&ipaddr, HTONS(6000));
			if(my_conn != NULL) {
				myip_state.state = STATE_ISCONNECT;//если соединение запущено
			}
		}else	if(myip_state.state == STATE_ISCONNECT) {
			if(++c_err > 8) {
				myip_state.flag_Abort = 1;
				c_err = 0;
				uip_poll_conn(my_conn);
			}
		}
	}
	
}

void myip_appcall(void)
{
	if(uip_connected()) {
		myip_state.state = STATE_CONNECTED;
	}
	if(uip_closed() || uip_aborted()) {
		myip_state.flag_Abort = 0;
		myip_state.state = STATE_DISCONNECT;
	}
	if(uip_acked()) {//были подтверждены ранее отправленные данные
		myip_state.flag_Tx = 0;
	}
	if(uip_newdata())	{//поступили новые данные
		
	}
	if(uip_poll()) {//необходимо передать новые данные
			if(myip_state.flag_Abort) {
				uip_abort();				
			}else if(myip_state.flag_Tx) {
				uip_send(TxBuf, strlen((const char *)TxBuf));	
			}
	}
	if(uip_rexmit())	{//необходимо повторно передать данные
			uip_send(TxBuf, strlen((const char *)TxBuf));	
	}
}

Последний раз редактировалось maxNTF; 25.06.2018 в 11:25.
maxNTF вне форума   Ответить с цитированием
Старый 27.06.2018, 16:11   #2
bzx
Senior Member
 
Аватар для bzx
 
Регистрация: 25.02.2007
Адрес: St. Petersburg
Возраст: 45
Сообщений: 477
Вес репутации: 1181/58
bzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud of
Отправить сообщение для bzx с помощью ICQ Отправить сообщение для bzx с помощью Skype™
По умолчанию Re: uIP - кто вызывает uip_poll?

Цитата:
Сообщение от maxNTF Посмотреть сообщение
Всем привет!
...вызов происходит с постоянной периодичностью, у меня 800мсек. uIP + FreeRTOS. Может в uIP есть какой то таймер, тогда где он настраивается, и можно ли его отключить?
Для начала проснифь соединение и лог выложи.
__________________
Для связи email: info собака qbit.su
bzx вне форума   Ответить с цитированием
Старый 27.06.2018, 16:45   #3
maxNTF
Senior Member
 
Регистрация: 12.07.2007
Возраст: 35
Сообщений: 908
Вес репутации: 287/53
maxNTF is a jewel in the roughmaxNTF is a jewel in the roughmaxNTF is a jewel in the rough
По умолчанию Re: uIP - кто вызывает uip_poll?

Цитата:
Сообщение от bzx Посмотреть сообщение
Для начала проснифь соединение и лог выложи.
А что это даст?
Меня интересует почему устанавливается флаг в uip_poll(), когда моя программа не вызывает uip_poll_conn(my_conn). И это с периодическим интервалом. Значит uip_poll() устанавливается и по другим событиям, каким?
maxNTF вне форума   Ответить с цитированием
Старый 28.06.2018, 13:16   #4
bzx
Senior Member
 
Аватар для bzx
 
Регистрация: 25.02.2007
Адрес: St. Petersburg
Возраст: 45
Сообщений: 477
Вес репутации: 1181/58
bzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud of
Отправить сообщение для bzx с помощью ICQ Отправить сообщение для bzx с помощью Skype™
По умолчанию Re: uIP - кто вызывает uip_poll?

Цитата:
Сообщение от maxNTF Посмотреть сообщение
А что это даст?
Как открывается соединение, состояние флагов соккета, что и как передается.

Может Вы не чистите что то после отправки, например индексы, буферы и т.п.

Цитата:
Сообщение от maxNTF Посмотреть сообщение
А что это даст?
Значит uip_poll() устанавливается и по другим событиям, каким?
Например, UIP_POLL_REQUEST
__________________
Для связи email: info собака qbit.su
bzx вне форума   Ответить с цитированием
Старый 02.07.2018, 13:44   #5
maxNTF
Senior Member
 
Регистрация: 12.07.2007
Возраст: 35
Сообщений: 908
Вес репутации: 287/53
maxNTF is a jewel in the roughmaxNTF is a jewel in the roughmaxNTF is a jewel in the rough
По умолчанию Re: uIP - кто вызывает uip_poll?

Цитата:
Сообщение от bzx Посмотреть сообщение
Например, UIP_POLL_REQUEST
Код:
#define uip_poll_conn(conn) do { uip_conn = conn; \
                                 uip_process(UIP_POLL_REQUEST); } while (0)
P.S
Нашел в функции uip_process еще одно место, где устанавливается флаг UIP_POLL, похоже это оно.
Код:
     /* If the connection has outstanding data, we increase the
	 connection's timer and see if it has reached the RTO value
	 in which case we retransmit. */
if(uip_outstanding(uip_connr)) {
...
} else if((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED) {
	/* If there was no need for a retransmission, we poll the
           application for new data. */
	uip_flags = UIP_POLL;
	UIP_APPCALL();

Последний раз редактировалось maxNTF; 02.07.2018 в 13:57.
maxNTF вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +3, время: 20:52.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot