Перейти к содержанию
    

Kot_Schrodingera

Участник
  • Постов

    21
  • Зарегистрирован

  • Посещение

Весь контент Kot_Schrodingera


  1. Lwip

    Не помогает
  2. Lwip

    Но retransmission всё равно возникает И почему SCB_CleanInvalidateDCache() не помог? Перенес буферы приёма и передачи, дескрипторы в область DTCM, значительного улучшения не увидел
  3. Lwip

    Вообще, видимо увидели слово Linux Scifi, Вы были правы, убрал cache заработало, но то что скинул Kabdim, я использовал в ethernet драйвере, единственное я использовал функцию SCB_CleanInvalidateDCache()
  4. Lwip

    это конечно "приятная новость" а есть где-нибудь информация, как добавить учитывание кеша?
  5. Lwip

    Всем привет обывателям форума Имеется stm32f7, прикручен lwip Идет постоянный обмен с железкой(на железке поднят linux) При подключении через хаб, всё работает более или менее, но когда подключено "точка-точка" начинают сыпаться сообщения об retransmission.(Если кому понадобиться могу скинуть dump) Из dump видно, что теряется пакет, отсюда вопрос, как его можно отследить на stm32? При включении debug сыпется много сообщений, так как на сообщения тратиться время, retransmission пропадает, то есть по моим выводам lwip или драйвер eth не успевает что-либо делать И ещё один вопрос, для получения оптимальной скорости был впилен костыль в виде уменьшения времени вызова timer tmr до 1 ms(TCP_TMR_INTERVAL 1) - как это может повлиять на систему и LWIP, кроме как загрузки цп?
  6. и никаких дополнительных настроек не требовалось? Просто использовали либу sockets.h?
  7. Lwip API socket

    Всем привет Кто-нибудь на API socket открывал на 2 соединения для разных портов? На netconn у меня все работает, а вот через socket не получается Сложилось такое впечатление, что он не может разобрать какой порт
  8. Lwip c FreeRTOS или без? Но сути это не поменяет, у вас постоянно крутится в цикле, netconn_recv, в ней выделяется память под inbuf, а по скольку чистка памяти происходит после цикла, и как раз ошибка -1 говорит о недостатке памяти Если вам нужно отследить дисконект, то данный параметр записывается в структуре netconn
  9. Спасибо за советы, будем разбираться)
  10. 1.Моя стмка на максимуме(216М) собственно шина тоже на 216М 2. Уже готовая плата Если думаете, что в проблема в разводке, было такое подозрение, потому что кривенько разведен участок от физики до разъема Но под рукой оказалась отладка на 746 камне и там проблема та же
  11. USB HS STM32F745

    Работаю с 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; }
  12. Сейчас займусь этим, спасибо
  13. Увеличил буффер 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" Я правильно понимаю, что проблемы не у меня?
  14. Я думаю не имеет смысла выкладывать часть, которая относится к 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, то есть мой девайс не может дождаться ответа от хоста, может можно как-то увеличить это время?
  15. Данная строка присутствует, но увы...не помогло
  16. Поставил вторую сетевуху и сделал мост Нашел эту большую паузу, оказалось вот что 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 занимает секунду?
  17. Нашел еще кое-что, когда виснет передача, основное время забирает передача ровно 2 пакетов (2920 байт). Время передачи 2 пакетов равно примерно 1-2 сек
  18. wireshark не вариант, потому что обмен идет между железками и нужен хаб или настраиваемый свитч - можно об этом поподробнее? не подскажите где об этом можно найти информацию? Еще раз повторюсь, те настройки, которые предлагает lwip.wikia не удовлетворяют меня
  19. stm32f7+Lwip+lan8742

    Всем доброго дня Нуждаюсь в помощи с 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 так устроен?и почему тогда данная проблема происходит через раз
×
×
  • Создать...