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

STM32F407: Ethernet + CHECKSUM_BY_SOFTWARE

Ниже пункта 1 описал, что изменение кода приводит к снятию эффекта

Причем даже отключение несвязанных между собой программных блоков приводит к снятию эффекта

Вероятно, код спроектирован не совсем неудачно.

Лечится создание пустого проекта и отладкой каждого модуля по-отдельности, независимо от других.

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

 

Если оставить один Eth, подозреваю висяка не будет
Все подозрения и предположения нужно заменять фактами ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вероятно, код спроектирован не совсем неудачно.

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

При отключении хардварного подсчета контрольной суммы, скорость работы интерфейса повысилась (что логично), а генерации пакетов снизилась.

Снять эффект зависания интерфейса можно, например, искусственно замедлив скорость интерфейса (тоже самое происходит при работе хардварного подсчета срс), вставив задержку или лишнее отладочное сообщение в функции приёма 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;

 

 

Есть у кого то понимание, как это могло помочь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...