реклама на сайте
подробности

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
> STM32F407: Ethernet + CHECKSUM_BY_SOFTWARE
Forger
сообщение May 3 2017, 11:36
Сообщение #46


Знающий
****

Группа: Свой
Сообщений: 726
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(k000858 @ May 3 2017, 14:29) *
Ниже пункта 1 описал, что изменение кода приводит к снятию эффекта
Причем даже отключение несвязанных между собой программных блоков приводит к снятию эффекта

Вероятно, код спроектирован не совсем неудачно.
Лечится создание пустого проекта и отладкой каждого модуля по-отдельности, независимо от других.
Собираем все вместе только после этого. И то собираем все по-одному модуля, проверяя и тестируя каждый шаг.

Цитата
Если оставить один Eth, подозреваю висяка не будет
Все подозрения и предположения нужно заменять фактами wink.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 3 2017, 11:56
Сообщение #47


Гуру
******

Группа: Свой
Сообщений: 3 765
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Forger @ May 3 2017, 13:36) *
Вероятно, код спроектирован не совсем неудачно.

Удалённая отладка по сообщениям на форуме - вещь неблагодарная! biggrin.gif

PS: Имхо - вначале нужно сделать хотя-бы обработку исключений. С этого я начинаю любой проект. Тогда, возможно, некоторые исключения уже сами покажут на места багов.
Go to the top of the page
 
+Quote Post
k000858
сообщение May 23 2017, 10:15
Сообщение #48


Местный
***

Группа: Участник
Сообщений: 291
Регистрация: 31-01-12
Пользователь №: 69 978



Может быть кому то поможет. Нашлось решение проблемы, пока сам не допонял, чем именно помогло

При отключении хардварного подсчета контрольной суммы, скорость работы интерфейса повысилась (что логично), а генерации пакетов снизилась.
Снять эффект зависания интерфейса можно, например, искусственно замедлив скорость интерфейса (тоже самое происходит при работе хардварного подсчета срс), вставив задержку или лишнее отладочное сообщение в функции приёма eth-фрейма

Так же пофиксить зависание удалось следующим способом: в функции приёма фрейма в месте
Код
  /* Set Own bit in Rx descriptors: gives the buffers back to DMA */
  for (i=0; i< EthHandle.RxFrameInfos.SegCount; i++)
  {  
    dmarxdesc->Status |= ETH_DMARXDESC_OWN;
    dmarxdesc = (ETH_DMADescTypeDef *)(dmarxdesc->Buffer2NextDescAddr);
  }

  /* Clear Segment_Count */
  EthHandle.RxFrameInfos.SegCount =0;


сделать так:
Код
  /* Set Own bit in Rx descriptors: gives the buffers back to DMA */
  FlagStatus next_owned    = RESET;    // флаг занятости следующего дескриптора
  for (i=0; i< EthHandle.RxFrameInfos.SegCount; i++)
  {  
    dmarxdesc->Status |= ETH_DMARXDESC_OWN;
    dmarxdesc = (ETH_DMADescTypeDef *)(dmarxdesc->Buffer2NextDescAddr);

    // MY: если после смены дескриптора на следующий он не свободен
    if((dmarxdesc->Status & ETH_DMARXDESC_OWN) == (uint32_t)RESET)
        next_owned    = SET;
  }

  /* Clear Segment_Count */
  if(next_owned == RESET)    // если следующий дескриптор не занят DMA
      EthHandle.RxFrameInfos.SegCount =0;



Есть у кого то понимание, как это могло помочь?
Go to the top of the page
 
+Quote Post

4 страниц V  « < 2 3 4
Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th November 2017 - 17:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01199 секунд с 7
ELECTRONIX ©2004-2016