Jump to content

    

BorisBritwa

Участник
  • Content Count

    9
  • Joined

  • Last visited

Community Reputation

0 Обычный

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. STM32F7LWIP

    В итоге перешел на RTOS+LWIP проблем никаких нет.Проц на максимальной частоте.Кэш выключен.TCM INTERFACE+ART+PRETHETCH скорость передачи по TCP до 14 Мегабит.Если как у меня на полную используется DMA DCMI, то скорость передачи до 12 мегабит больше пока не удалось получить(ну я сильно не старался).Не замерял какая скорость передачи у ESP32CAM, вблизи точки доступа было бы интересно сравнить.
  2. STM32F7LWIP

    Спасибо буду иметь ввиду. Не написал, что кэши и кучу поднимал аж до 0x4000(которые в startup, сейчас 0x1000) для lwip памяти давал за 100К результата ноль. Пока вопрос почему так происходит открыт, но уже можно с этим жить.Сейчас буфер кратен MSS*10.Удалось до 5 мегабит поднять, пока хватит можно стримить. На wiznet w5500 и F4 мне не удалось добиться такой скорости.Там либо SPI медленный,вешаешь на другой канал spi уже быстрый, так уже задействовано одно и тоже ДМА с разными "каналами" и по скорости хуже получается.То есть одно ДМА обслуживает и SPI и DCMI. В итоге на F7 SYSCLK 96MHZ ,если установить в два раза выше то появятся ошибки при передаче( опять дескриптор будет, будет не доступен для ДМА, когда ему вздумается) если их не было. Сейчас задействовано еще одно DMA DCMI, получаю 15 FPS 480x320, c OV2640 в норм качестве, по TCP.Ошибок при вызове функций нет.Если смотреть в wire shark, то не значительно на основном фоне ретрансмиты и dup_ack.
  3. STM32F7LWIP

    НАДЕЮСЬ ЭТО СЭКОНОМИТ КОМУ-ТО ВРЕМЯ.МОИ НАБЛЮДЕНИЯ РАЗМЕР СООБЩЕНИЯ КРАТЕН MSS, если одна посылка то <=MSS. РАЗМЕР ОТПРАВЛЯЕМОГО ПАКЕТА НЕ БОЛЕЕ 6*MSS . Кэш не включен MSS1460 куча 60 кило,размер TSP_SND_BUF 60*MSS удается прокачивать до 6 мегабит без ошибок, частота SYSCLK 96MHZ, уменьшал до 10 TCP_TMR_INTERVAL, быстрее буфер освобождается. Можно не уменьшать но буфер тогда надо по шире. В логах статистики запас по буферам и памяти не придраться.Кроме TCP_SND_BUF при ошибках его будет ужирать. ETH_TX_buf его размер меняется и указан в функции "отправки",правильнее сказать функции записи в другой буфер, под который предварительно выделяется память.И после каждой tcp_write() вызывается tcp_output() как выше писал.Настройки lwip прилагаю. Например отправляю рас в 500мс буфер отправки TCP_SND_BUF свободен на 80% : tcp_write(CI.tcp_client_pcb,ETH_TX_buf,1460*6, 1); будет работать без ошибок MSS 1460 tcp_write(CI.tcp_client_pcb,ETH_TX_buf,1500*6, 1); будет работать c ошибками. ERR_USE и повторные отправки tcp_write(CI.tcp_client_pcb,ETH_TX_buf,1460*7, 1);будет работать c ошибками.ERR_USE и повторные отправки tcp_write(CI.tcp_client_pcb,ETH_TX_buf,1460*8, 1);будет работать c ошибками.ERR_USE после вызова tcp_output() повторных оправок нет, но если увеличить скорость передачи думаю появятся . Если включить ART и изменить адрес как выше писал, то опять ошибки при передаче.Если не включать ART поднять частоту выше 216MHZ опять ERR_USE и повторные отправки.Короче одно шайтнство.Корень проблемы указан выше и где он возникает,но решают его каждый по разному . Сейчас добавлю еще работу с DMA и все по хер...ся. lwipopt.txt
  4. STM32F7LWIP

    Прилепляю лог статистики для нового чистого проекта только с lwip отправка рас в секунду 16 кило, как отправляю указал выше.Есть ошибки ERR_USE после вызова tcp_output(); в текстовом файле они можно найти по строке "tcp_output err -8". Кэш пока не использую, могу скинуть проект если кому это поможет.Пакеты передаются но много ошибок писал выше. Ошибки ERR_USE появляются в функции low_level_output() находится в файле ethernetif.c строки : /* Is this buffer available? If not, goto error */ if((DmaTxDesc->Status & ETH_DMATXDESC_OWN) != (uint32_t)RESET) { errval = ERR_USE; goto error; } Данная проблема уже давно https://community.st.com/s/question/0D50X00009Xkgff/stm32f746-ethernet-dma-transmit-problem statistic.txt
  5. STM32F7LWIP

    По буферам запас было видно из статистики, кроме TCP_SND_BUF, иногда не хватает. Сейчас все на минимуме, рас в секунду 16 кило.Проект собрал заново без использования другой периферии ethernet +usart для отладки(скорость 2000000). Размер окна TCP_WND, только на прием будет влиять? Во всяком, ставил больше изменений не видно было. MEMP_NUM_PBUF в порог не упирался исходя из статистики.
  6. STM32F7LWIP

    Также читал __DSB у меня такой строчки нет, и ее добавление ничего не решает в моем случае. Вернулся к истокам.Собрал дефолтный проект с lwip и больше ничего, изменил MEM_SIZE 65536,MEMP_NUM_TCP_SEG 401,TCP_SND_BUF 53600. КЭШ НЕ ВКЛЮЧАЛ.Передаю рас в секунду массив размером 16Кило.Передача идет но в wireshark много TCP_DUP_ACK,TCP_retransmission, while (1) { MX_LWIP_Process(); time_ms = HAL_GetTick(); if(time_ms - last_time_ms_task1 > 1000){//TCP_TMR_INTERVAL send_buf_frspace = get_tcp_sndbuf_free(&CI); printf("send_buf_frspace %d\n\r",send_buf_frspace); if (CI.conn_status == S_ESTABLISHED) if(ETH_TXBUF_SIZE < send_buf_frspace){ ret_err = tcp_write(CI.tcp_client_pcb,ETH_TX_buf,ETH_TXBUF_SIZE, 1); if(ret_err != ERR_OK)printf("tcp_write err %d\n\r",ret_err); ret_err = tcp_output(CI.tcp_client_pcb); if(ret_err != ERR_OK)printf("tcp_output err %d\n\r",ret_err); } last_time_ms_task1 = time_ms; } } валит ошибки ERR_USE после вызова tcp_output(); Причина ошибки файл ethernetif.c, тут функция low_level_output(). /* Check if the buffer is available */ if((DmaTxDesc->Status & ETH_DMATXDESC_OWN) != (uint32_t)RESET) { errval = ERR_USE; goto error; }
  7. STM32F7LWIP

    Плата NUCLEO stm32f767ZI . Задача передать поток с камеры ov2640 2-10Мегабит. Делал такое уже на w5500 и stm32f4. Сейчас разогнал мк В кубе включил TCM interface для flash.ART Accelerator,instruction perfetch настройки адреса flash изменил вручную, т.к. куб не прописывает для KEIL почему то.Потребление камня заметно возросло производительность тоже. Использую DMA (для DСMI) оно вроде как и FLASH( по умолчанию) работает через шину AHB->AXI и там вроде как могут пробыть проблемы если включить кэш команд и данных.Поэтому сделал как написал выше. В планах разместись стек и кучу и FIFO буфер в DTCM и обработчики прерываний в ITCM. Работаю без RTOS RAW API.Проблема в том, ЧТО Я НЕ МОГУ ПОЛУЧИТЬ нормальные 10 Мегабит не говоря уже о 10 Мегабайтах в секунду о которых пишут. Передаю пакеты размером 16Кило след. образом. while(ETH_TXBUF_SIZE > get_tcp_sndbuf_free(&CI)) MX_LWIP_Process(); tcp_write(CI.tcp_client_pcb,ETH_TX_buf,ETH_TXBUF_SIZE, 1); tcp_output(CI.tcp_client_pcb); Проблема в том что пришлось выкрутить TCP_TMR_INTERVAL в 1 вместо 250? Иначе не работает на таких скоростях. По идее TCP_TMR_INTERVAL я вообще не должен трогать!!! Сейчас удается передать поток 5 Мегабит с камеры, есть tcp retransmission,tcp dup ACK. Есть логи отладки через stats_display(); там все ОК. lwipopts.h
  8. Я разобрался с этим вопросом. проект https://drive.google.com/file/d/1QUBxso2SIrSIxNUaaQ84a-vVT9O6Jsrv/view?usp=sharing Теория здесь https://youtu.be/g8fs3wJxCtY