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

Dec_NN

Свой
  • Постов

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Частый гость
    Частый гость

Контакты

  • Сайт
    Array
  • ICQ
    Array

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

2 456 просмотров профиля
  1. Добрый день! Подскажите кто в России надежно занимается поставкой Gowin? И у кого можно получить лицензию на Gowin EDA?
  2. В итоге Ангстрем вроде как делает, но со сроком поставки от года. По Интегралу сроки пока не знаю, но в перечне минпромторга их не видно.
  3. Добрый день! Подскажите, есть ли российские производители стандартной логики в корпусах soic14 и soic16 с приемкой ОТК? Желательно присутствующие в перечне минпромторга. Желательно, чтобы можно было купить. Спасибо.
  4. Каталога производимой продукции на сайте нет. Даже после удачной регистрации. Напишите им на электронку запрос, они пришлют вам информацию.
  5. Не понимаю как это выяснить.
  6. Т.е. по установке бита RS в статусном регистре DMA? Попробую сейчас, но вроде я уже это проверял. Посмотрел сейчас регистр настройки DMA, в нем бит RSF=0, т.е. включен режим cut-through mode. Может в этом проблема.
  7. Вы имеете ввиду PBUF_POOL_SIZE? Сейчас PBUF_POOL_SIZE = 16, PBUF_POOL_BUFSIZE = 1200 байт Делал и больше, никакого влияния не оказывает. Платы соединены напрямую, так что других пакетов там нет, кроме ARP запросов ответов. Если рассуждать логически, т.к. теряется последний пакет в пачке, то значит он куда то не влезает. Но места куда влезть более чем достаточно. Ну и непонятно как влияет наличие передачи по UDP. Приемные и передающие буфера ведь должны быть разделены и никак не пересекаться.
  8. Да вроде должна успевать. Проверка на входящие пакеты производится каждые 30 мкс. Делал чаще, ничего не меняется. В чем то здесь в другом проблема.
  9. Добрый день! Не могу до конца разобраться с проблемой. Прошу подсказки. STM32F767 LWIP RAW UDP Две одинаковые платы обмениваются пакетами UDP. Раз в 1мс посылается 5 пакетов по 272 байта. Пакеты отправляются пачкой, практически друг за другом с задержкой где то 15-20 мкс, затем пауза. В итоге периодически на приеме происходят пропадания пакетов. Сначала все принимается (минуту-две), затем несколько секунд могут происходить пропадания, затем все опять принимается исправно и т.д. При этом: 1. Пропадают исключительно пакеты отправляемые из пачки пятыми, очень редко четвертыми. Пакеты с 1го по 3-й не теряются совсем. 2. Пропадания возникают только если на данной плате производится передача UDP. Если на плате отключить передачу UDP пакетов, то на приеме ошибки исчезают. 3. Выяснено, что пропадания совпадают с моментами, когда в функции low_level_input программа попадает в условие, что дескриптор принадлежит хосту и не может быть получен DMA. /* When Rx Buffer unavailable flag is set: clear it and resume reception */ if ((heth.Instance->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET) { /* Clear RBUS ETHERNET DMA flag */ heth.Instance->DMASR = ETH_DMASR_RBUS; /* Resume DMA reception */ heth.Instance->DMARPDR = 0; test_counter++; } В какой то момент test_counter начинает активно расти и в это же время начинают пропадать пакеты. Затем пропадания прекращаются и test_counter также перестает расти. Значение test_counter значительно больше чем количество пропаданий. Не могу понять куда дальше смотреть, почему теряются только последние пакеты из пачки и как это связано с передачей.
  10. Отключил DCache. Все стало работать. Почему включение кеша данных вызывает мою проблему пока не понимаю. Буду разбираться.
  11. Это первый ARM с которым работаю, так уж досталось по наследству, и опыта работы с ними нет. RTOS обязательно буду осваивать.
  12. Я пробовал делать похожим образом, но дело в том, что в основном цикле есть куски надолго блокирующие выполнение кода. Например функция вывода статистики в консоль и т.д. и пока дело дойдет до проверки флага, часть пакетов просто теряется. Поэтому решил сделать прерывание по таймеру, чтобы гарантированно забирать пришедшие пакеты. Upd: Сейчас попробовал убрать прерывание и делать вызов ethernetif_input() из основного цикла. Ничего не изменилось.
  13. А каким образом тогда обеспечить регулярную проверку входящих пакетов? В основном цикле с необходимой частотой этого не сделать. Здесь я, к сожалению, не совсем понимаю о чем речь. Не заходит в udp_receive handler по причине того, что не проходит условие в строчке указанной выше.
  14. Похоже затыкается LWIP. А именно в файле stm32f7xx_hal_eth.c условие /* Check if segment is not owned by DMA */ if(((heth->RxDesc->Status & ETH_DMARXDESC_OWN) == (uint32_t)RESET)) никогда не срабатывает.
  15. STM32F7 (RAM: 512Кбайт). Среда CubeIDE. Есть функция в которой принятые UDP пакеты складываются в кольцевые буферы. Буферы - это глобальный трехмерный массив: udp_rxbuf[snum][128][256], где snum - количество сокетов. Т.е. для каждого сокета можно сохранить до 128 пакетов по 256 байт. При количестве сокетов до 3-х все работает корректно. Как только увеличиваю размер массива до работы с 4-мя сокетами (snum=4), все ломается. Работа с сокетами происходит следующим образом: Есть таймер. В его обработчике прерывания вызываются функции: ethernetif_input(&gnetif); sys_check_timeouts(); При получении udp пакета программа прыгает в в связанную с сокетом функцию void udp_receive_handler(void *arg, struct udp_pcb *upcb, struct pbuf *p, const struct ip4_addr *addr, u16_t port), где полученный пакет укладывается в буффер. Хотя массив буферов и большой - 160 кбайт, но линкер показывает, что памяти RAM еще вполне достаточно, больше половины свободно. Понимаю, что где то, что то нехватает, или что то на что то налазиет, но не знаю что. Т.к. данный массив глобальный, он ведь никак не должен забивать стек, но что то происходит и все ломается. Подскажите, что я делаю не так.
×
×
  • Создать...