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

Kot_Schrodingera

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

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

  • Посещение

Репутация

0 Обычный

Информация о Kot_Schrodingera

  • Звание
    Участник
    Участник

Посетители профиля

494 просмотра профиля
  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, то есть мой девайс не может дождаться ответа от хоста, может можно как-то увеличить это время?
×
×
  • Создать...