Kot_Schrodingera
Участник-
Постов
21 -
Зарегистрирован
-
Посещение
Репутация
0 ОбычныйИнформация о 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, то есть мой девайс не может дождаться ответа от хоста, может можно как-то увеличить это время?