Kot_Schrodingera
Участник-
Постов
21 -
Зарегистрирован
-
Посещение
Весь контент Kot_Schrodingera
-
Lwip
Kot_Schrodingera ответил Kot_Schrodingera тема в ARM
Но retransmission всё равно возникает И почему SCB_CleanInvalidateDCache() не помог? Перенес буферы приёма и передачи, дескрипторы в область DTCM, значительного улучшения не увидел -
Lwip
Kot_Schrodingera ответил Kot_Schrodingera тема в ARM
Вообще, видимо увидели слово Linux Scifi, Вы были правы, убрал cache заработало, но то что скинул Kabdim, я использовал в ethernet драйвере, единственное я использовал функцию SCB_CleanInvalidateDCache() -
Lwip
Kot_Schrodingera ответил Kot_Schrodingera тема в ARM
это конечно "приятная новость" а есть где-нибудь информация, как добавить учитывание кеша? -
Lwip
Kot_Schrodingera опубликовал тема в ARM
Всем привет обывателям форума Имеется stm32f7, прикручен lwip Идет постоянный обмен с железкой(на железке поднят linux) При подключении через хаб, всё работает более или менее, но когда подключено "точка-точка" начинают сыпаться сообщения об retransmission.(Если кому понадобиться могу скинуть dump) Из dump видно, что теряется пакет, отсюда вопрос, как его можно отследить на stm32? При включении debug сыпется много сообщений, так как на сообщения тратиться время, retransmission пропадает, то есть по моим выводам lwip или драйвер eth не успевает что-либо делать И ещё один вопрос, для получения оптимальной скорости был впилен костыль в виде уменьшения времени вызова timer tmr до 1 ms(TCP_TMR_INTERVAL 1) - как это может повлиять на систему и LWIP, кроме как загрузки цп? -
Lwip API socket
Kot_Schrodingera ответил Kot_Schrodingera тема в ARM
и никаких дополнительных настроек не требовалось? Просто использовали либу sockets.h? -
Lwip API socket
Kot_Schrodingera опубликовал тема в ARM
Всем привет Кто-нибудь на API socket открывал на 2 соединения для разных портов? На netconn у меня все работает, а вот через socket не получается Сложилось такое впечатление, что он не может разобрать какой порт -
Lwip c FreeRTOS или без? Но сути это не поменяет, у вас постоянно крутится в цикле, netconn_recv, в ней выделяется память под inbuf, а по скольку чистка памяти происходит после цикла, и как раз ошибка -1 говорит о недостатке памяти Если вам нужно отследить дисконект, то данный параметр записывается в структуре netconn
-
USB HS STM32F745
Kot_Schrodingera ответил Kot_Schrodingera тема в STM
Спасибо за советы, будем разбираться)- 4 ответа
-
- stm32f745 usb hs
- stm32f745
-
(и ещё 1 )
C тегом:
-
USB HS STM32F745
Kot_Schrodingera ответил Kot_Schrodingera тема в STM
1.Моя стмка на максимуме(216М) собственно шина тоже на 216М 2. Уже готовая плата Если думаете, что в проблема в разводке, было такое подозрение, потому что кривенько разведен участок от физики до разъема Но под рукой оказалась отладка на 746 камне и там проблема та же- 4 ответа
-
- stm32f745 usb hs
- stm32f745
-
(и ещё 1 )
C тегом:
-
USB HS STM32F745
Kot_Schrodingera опубликовал тема в STM
Работаю с stm32f745 Драйвер для usb взять из кубика я работаю в режиме хоста, в роли девайса выступает устройство, на котором стоит atmel+камера, и гонится картинка по usb Изначально работал в режиме FS и не испытывал никаких проблем Решили, что нужно HS, сделали новую плату, usb физику использовали 3320 И теперь появились проблемы при передаче, выражаются они вот в чем: В какой-то момент я не могу получить пакет от девайса Причем, в callback я изменяю статус о том, что данные приняты, и в функции по отправке я жду появление данного статуса И в какой то момент функция зависает в ожидании статуса. То есть callback даже не вызывается, и следовательно прерывание по приему тоже не происходит Может кто сталкивался с такой проблемой?Или проблема в самом девайсе? int write_and_read( USBH_HandleTypeDef *d, void *rx_buff, size_t rx_buff_size, void *tx_buff, size_t tx_buff_size) { status = 0x0; status_rx = 0x0; SCB_CleanInvalidateDCache(); int r = write(d, tx_buff, tx_buff_size, true); if (r < PB_PVS_SUCCESS) return r; timer_start(&timer_usb, 50); while((!(timer_check(&timer_usb)) == TIMER_STATE_TIMEOUT)) { if(status) break; }; if(!status) return PB_PVS_ERROR_LIBUSB; r = read(d, rx_buff, rx_buff_size, true); SCB_CleanInvalidateDCache(); if (r < PB_PVS_SUCCESS) { debug("read_error"); return r; } timer_start(&timer_usb, 50); while(!(status_rx)) { //в данном месте висит функция }; return PB_PVS_SUCCESS; }; int write( USBH_HandleTypeDef *d, void *buff, size_t buff_size, const bool pack) { uint8_t *data = (uint8_t *)buff; int res = PB_PVS_SUCCESS; USBH_PVS_Stop(d); const int r_usb = USBH_PVS_Transmit(d, data, buff_size); if(r_usb != USBH_OK) res = PB_PVS_ERROR_LIBUSB; return res; } int read( USBH_HandleTypeDef *d, void *buff, size_t buff_size, const bool unpack) { int res; uint8_t *data = (uint8_t *)buff; USBH_PVS_Stop(d); const int r_usb = USBH_PVS_Receive(d, data, buff_size); if(!r_usb) { res = PB_PVS_SUCCESS; } if (r_usb != USBH_OK) { res = PB_PVS_ERROR_LIBUSB; } return res; }- 4 ответа
-
- stm32f745 usb hs
- stm32f745
-
(и ещё 1 )
C тегом:
-
stm32f7+Lwip+lan8742
Kot_Schrodingera ответил Kot_Schrodingera тема в STM
Сейчас займусь этим, спасибо -
stm32f7+Lwip+lan8742
Kot_Schrodingera ответил Kot_Schrodingera тема в STM
Увеличил буффер TCP_SND_BUF И получил следующее "1213","5.672845","172.29.21.156","172.29.21.190","TCP","1514","20020 > 56571 [ACK] Seq=712117 Ack=1693 Win=1498 Len=1460" "1214","5.672951","172.29.21.156","172.29.21.190","TCP","1514","20020 > 56571 [ACK] Seq=713577 Ack=1693 Win=1498 Len=1460" "1215","5.673065","172.29.21.156","172.29.21.190","TCP","1514","20020 > 56571 [ACK] Seq=715037 Ack=1693 Win=1498 Len=1460" "1216","5.673137","172.29.21.190","172.29.21.156","TCP","60","56571 > 20020 [ACK] Seq=1693 Ack=710657 Win=65535 Len=0" "1217","5.673416","172.29.21.156","172.29.21.190","TCP","1514","[TCP Previous segment not captured] 20020 > 56571 [ACK] Seq=717957 Ack=1693 Win=1498 Len=1460" "1218","5.673745","172.29.21.190","172.29.21.156","TCP","60","56571 > 20020 [ACK] Seq=1693 Ack=713577 Win=65535 Len=0" "1219","5.673750","172.29.21.190","172.29.21.156","TCP","60","56571 > 20020 [ACK] Seq=1693 Ack=716497 Win=65535 Len=0" "1220","5.674088","172.29.21.156","172.29.21.190","TCP","1514","20020 > 56571 [ACK] Seq=719417 Ack=1693 Win=1498 Len=1460" "1221","5.674191","172.29.21.156","172.29.21.190","TCP","1514","20020 > 56571 [ACK] Seq=720877 Ack=1693 Win=1498 Len=1460" "1222","5.674314","172.29.21.156","172.29.21.190","TCP","1514","20020 > 56571 [ACK] Seq=722337 Ack=1693 Win=1498 Len=1460" "1223","5.674366","172.29.21.190","172.29.21.156","TCP","60","[TCP Dup ACK 1219#1] 56571 > 20020 [ACK] Seq=1693 Ack=716497 Win=65535 Len=0" "1224","5.675012","172.29.21.190","172.29.21.156","TCP","60","[TCP Dup ACK 1219#2] 56571 > 20020 [ACK] Seq=1693 Ack=716497 Win=65535 Len=0" "1225","5.675019","172.29.21.190","172.29.21.156","TCP","60","[TCP Dup ACK 1219#3] 56571 > 20020 [ACK] Seq=1693 Ack=716497 Win=65535 Len=0" "1226","5.675024","172.29.21.190","172.29.21.156","TCP","60","[TCP Dup ACK 1219#4] 56571 > 20020 [ACK] Seq=1693 Ack=716497 Win=65535 Len=0" "1227","5.675320","172.29.21.156","172.29.21.190","TCP","1514","[TCP Fast Retransmission] 20020 > 56571 [ACK] Seq=716497 Ack=1693 Win=1498 Len=1460" "1228","5.676263","172.29.21.190","172.29.21.156","TCP","60","56571 > 20020 [ACK] Seq=1693 Ack=723797 Win=65535 Len=0" "1229","5.676315","172.29.21.156","172.29.21.190","TCP","1514","[TCP Previous segment not captured] 20020 > 56571 [ACK] Seq=725257 Ack=1693 Win=1498 Len=1460" "1230","5.676904","172.29.21.190","172.29.21.156","TCP","60","[TCP Dup ACK 1228#1] 56571 > 20020 [ACK] Seq=1693 Ack=723797 Win=65535 Len=0" "1231","5.677312","172.29.21.156","172.29.21.190","TCP","1514","20020 > 56571 [ACK] Seq=726717 Ack=1693 Win=1498 Len=1460" "1232","5.678181","172.29.21.190","172.29.21.156","TCP","60","[TCP Dup ACK 1228#2] 56571 > 20020 [ACK] Seq=1693 Ack=723797 Win=65535 Len=0" "1244","7.145808","172.29.21.156","172.29.21.190","TCP","1514","[TCP Retransmission] 20020 > 56571 [ACK] Seq=723797 Ack=1693 Win=1498 Len=1460" "1245","7.146624","172.29.21.190","172.29.21.156","TCP","60","56571 > 20020 [ACK] Seq=1693 Ack=728177 Win=65535 Len=0" "1246","7.146985","172.29.21.156","172.29.21.190","TCP","1514","20020 > 56571 [ACK] Seq=728177 Ack=1693 Win=1498 Len=1460" "1247","7.147109","172.29.21.156","172.29.21.190","TCP","1514","20020 > 56571 [ACK] Seq=729637 Ack=1693 Win=1498 Len=1460" "1248","7.147869","172.29.21.190","172.29.21.156","TCP","60","56571 > 20020 [ACK] Seq=1693 Ack=729637 Win=65535 Len=0" "1249","7.147884","172.29.21.190","172.29.21.156","TCP","60","56571 > 20020 [ACK] Seq=1693 Ack=731097 Win=65535 Len=0" Я правильно понимаю, что проблемы не у меня? -
stm32f7+Lwip+lan8742
Kot_Schrodingera ответил Kot_Schrodingera тема в STM
Я думаю не имеет смысла выкладывать часть, которая относится к lwip, там я ничего не менял void netconn_thread(void const *argument) { HAL_GPIO_WritePin(GPIOE, USB_PWR_GPIO_Pin, GPIO_PIN_SET); HAL_Delay(10000); struct netconn *conn, *newconn; err_t err; conn = netconn_new(NETCONN_TCP); if(conn != NULL) { err = netconn_bind(conn, NULL, 20020); if(err == ERR_OK) { netconn_listen(conn); for(;;) { err = netconn_accept(conn, &newconn); connNoErr = true; //netconn_set_recvtimeout(newconn, 50); while((!ERR_IS_FATAL(netconn_err(newconn)))&(connNoErr)) { recv_and_resp_netconn(newconn); } //if(err != ERR_OK) //continue; netconn_close(newconn); netconn_delete(newconn); } } else { debug("Can not bind netconn"); } } else { debug("Can not create netconn"); } } static void recv_and_resp_netconn(struct netconn *conn) { struct netbuf *inbuf; err_t res; char *buf; u16_t buflen; uint8_t type; uint8_t buff_img[165000]; res = netconn_recv(conn, &inbuf); if(res == ERR_OK) { netbuf_data(inbuf, (void**)&buf, &buflen); if(buflen >= sizeof(packet_tx_t)) { uint8_t buffer[buflen]; memcpy(&buffer, buf, buflen); search_object_t *packet = (search_object_t *)&buffer[1]; if(packet->header.cmd != PB_PVS_CMD_LED) { pb_menu_process(buff_img, IMAGE_SIZE, buffer, buflen, packet->header.cmd); } packet_rx_t *packet_rx = (packet_rx_t *)&buff_img[1]; if(packet->header.cmd) { if(packet->header.cmd == CMD_GET_SCAN) { size_t size_rx; if(packet_rx->status) { size_rx = 20; } else { size_rx = IMAGE_SIZE + 14; }; static uint32_t lt1, lt2, ltd, lt, ltpr; //taskENTER_CRITICAL(); lt1 = xTaskGetTickCount(); netconn_write(conn, buff_img, size_rx, NETCONN_NOCOPY); lt2 = xTaskGetTickCount(); ltd = lt2-lt1; //taskEXIT_CRITICAL(); debug("qwerty\t%u", ltd); } else { netconn_write(conn, buff_img, 80, NETCONN_NOCOPY); } } memset(buff_img, 0, 20); } } else { debug("Error receiver : %d", res); connNoErr = false; } netbuf_delete(inbuf); } И еще, раз возникает retransmission, то есть мой девайс не может дождаться ответа от хоста, может можно как-то увеличить это время? -
stm32f7+Lwip+lan8742
Kot_Schrodingera ответил Kot_Schrodingera тема в STM
Данная строка присутствует, но увы...не помогло -
stm32f7+Lwip+lan8742
Kot_Schrodingera ответил Kot_Schrodingera тема в STM
Поставил вторую сетевуху и сделал мост Нашел эту большую паузу, оказалось вот что 5288 69.077155 172.29.21.156 172.29.21.190 TCP 1514 [TCP Previous segment not captured] 20020 → 40392 [ACK] Seq=1814255 Ack=3988 Win=1865 Len=1460 5289 69.077975 172.29.21.190 172.29.21.156 TCP 60 [TCP Dup ACK 5286#1] 40392 → 20020 [ACK] Seq=3988 Ack=1812795 Win=65535 Len=0 5311 70.366679 172.29.21.156 172.29.21.190 TCP 1514 [TCP Retransmission] 20020 → 40392 [ACK] Seq=1812795 Ack=3988 Win=1865 Len=1460 то есть я правильно понял?что процесс retransmission занимает секунду? -
stm32f7+Lwip+lan8742
Kot_Schrodingera ответил Kot_Schrodingera тема в STM
Нашел еще кое-что, когда виснет передача, основное время забирает передача ровно 2 пакетов (2920 байт). Время передачи 2 пакетов равно примерно 1-2 сек -
stm32f7+Lwip+lan8742
Kot_Schrodingera ответил Kot_Schrodingera тема в STM
wireshark не вариант, потому что обмен идет между железками и нужен хаб или настраиваемый свитч - можно об этом поподробнее? не подскажите где об этом можно найти информацию? Еще раз повторюсь, те настройки, которые предлагает lwip.wikia не удовлетворяют меня -
stm32f7+Lwip+lan8742
Kot_Schrodingera опубликовал тема в STM
Всем доброго дня Нуждаюсь в помощи с Lwip В распоряжение железка stm32f745 Передаю картинку(размер 156к) Прочитал все статьи которые есть на форуме, я даже получилась передача картинки за 30 мс Во первых, как я понял из многих статей, увеличение скорости передачи достигается путем настройки TCP_WND, TCP_MSS, PBUF_POOL_BUFSIZE, PBUF_POOL_SIZE Многие писали, что последние два параметра устанавливают порядка 100 и 16 соответственно, но это противоречит тому, что описано здесь http://lwip.wikia.com/wiki/Tuning_TCP Могли бы вы объяснить почему так или дать путь, в котором нужно искать информацию Во вторых, при передаче картинки бывают лаги, и вместо 30мс она передается за 1-3 с(использую API Netconn), время замерял следующим образом: static uint32_t lt1, lt2, ltd; lt1 = xTaskGetTickCount(); netconn_write(conn, buff_img, size_rx, NETCONN_NOCOPY); lt2 = xTaskGetTickCount(); ltd = lt2-lt1; То есть висит на этой функции Не могу понять, это в драйвере ethernet проблемы или lwip так устроен?и почему тогда данная проблема происходит через раз