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

STM32F407: Ethernet + CHECKSUM_BY_SOFTWARE

В проект включены LwIP (1.4.0) и FreeRTOS. Ethernet интерфейс работает на прерывании, которое освобождает семафору. Задача по освобождению семафоры забирается пакеты.

 

Версия проекта со включенной ETH_CHECKSUM_BY_HARDWARE (в драйвере Ethernet и LwIP стеке) хорошо выдерживает тест на шторм трафика, ничего не виснет

Версия проекта с софтовым расчетом контрольной суммы при тесте на шторм трафика виснет: Ethernet прерывание перестает выстреливать при получении пакетов, LwIP перестает получать пакеты. необходима именно эта версия проекта.

 

Кто нибудь сталкивался с таким эффектом? есть идеи как можно подебажить проблему?

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


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

освобождает семафору

"Семафору" как вы говорите не освобождают, (освобождать принято мьютексы), а им лишь сигналят - "семафорят", именно оттуда и взялся такой термин. :)

 

 

Кто нибудь сталкивался с таким эффектом?

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

Ведь софтовый расчет производится заметно дольше аппаратного.

Поэтому я бы замерил реальные цифры, поставил соотв. "ловушки" на переполнения буферов и т.п.

Дополнительно стоит убедиться, что доступ к софтовому "вычислителю" реализован лишь из одной точки (одной задачи) или защищен мьютексом.

Короче, методов много, но один общий всегда работает - вырезать все "лишнее мясо", тестировать, постепенно наращивая ранее вырезанное "мясцо".

Это помогает локализовать "виновника".

 

есть идеи как можно подебажить проблему?

Очень рекомендую подключить (для сборки DEBUG) вот такую штуку.

Мне она уже неоднократно помогала быстро находить подобные корявые баги. Жалею, что раньше не применял, иначе съэкономил бы вагон времени и нервов ))

Подключается быстро, т. к. там уже есть порт, заточенный под freertos.

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


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

"Семафору" как вы говорите не освобождают, (освобождать принято мьютексы), а им лишь сигналят - "семафорят", именно оттуда и взялся такой термин. :)

В uCOS например, для разделения ресурсов, кроме мьютексов, можно юзать семафоры. И их можно и занимать и освобождать.

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


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

Очень рекомендую подключить (для сборки DEBUG) вот такую штуку.

Мне она уже неоднократно помогала быстро находить подобные корявые баги. Жалею, что раньше не применял, иначе съэкономил бы вагон времени и нервов ))

Подключается быстро, т. к. там уже есть порт, заточенный под freertos.

к сожалению J-Link'а не имею, в моем распоряжении только ST-Link v2

 

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


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

к сожалению J-Link'а не имею, в моем распоряжении только ST-Link v2

В настоящее время полно вполне бюджетных клонов jlink, все они и работают быстрее этого st-link и возможностей дают больше.

Если речь идет про отладочную плату типа discovery от st, то ее встроенный st-link можно легко перешить в j-link (обратимая операция), вот подробности

 

 

В uCOS например, для разделения ресурсов, кроме мьютексов, можно юзать семафоры.

В принципе, можно вполне успешно забивать гвозди даже лопатой, но не все это поймут :)

 

Для самых "настырных": (выдержка из мануала на ucos-3):

13-5 SHOULD YOU USE A SEMAPHORE INSTEAD OF A MUTEX?

A semaphore can be used instead of a mutex if none of the tasks competing for the shared

resource have deadlines to be satisfied.

However, if there are deadlines to meet, you should use a mutex prior to accessing shared

resources. Semaphores are subject to unbounded priority inversions, while mutex are not.

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


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

В принципе, можно вполне успешно забивать гвозди даже лопатой, но не все это поймут :)

Для самых "настырных": (выдержка из мануала на ucos-3):

Не понял - и для чего это? Что за deadlines и какой от них прок?

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


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

Фраза:

Версия проекта со включенной ETH_CHECKSUM_BY_HARDWARE (в драйвере Ethernet и LwIP стеке)...

наталкивает на мысль, что доступ к софтовой считалке происxодит из разных потоков. Я бы начал поиск граблей с этого места.

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


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

наталкивает на мысль, что доступ к софтовой считалке происxодит из разных потоков. Я бы начал поиск граблей с этого места.

Уже было озвучено :)

 

 

Не понял - и для чего это? Что за deadlines и какой от них прок?

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

когда занятый ресурс ожидают несколько задач с разными приоритетами и может возникнуть взаимоблокировка (deadlock).

 

В простейших случаях, когда лишь одна задача ожидает объект (например, пришел байт в прерывании, который положили в буфер и просигналили об этом),

как раз лучше использовать семафор (причем, в случае с байтом по uart лучше использовать счетный семафор).

 

Кстати, во FreeRTOS для этого есть более быстрый метод - уведомление (notify), он жрет заметно меньше ресурсов.

 

Другими словами: использовать семафор как средство разделения общего ресурса - это неправильно в разных смыслах.

Цитирую: "Мьютекс отличается от семафора тем, что только владеющий им поток может его освободить, т.е. перевести в отмеченное состояние." (из википедии)

 

 

Ну, теперь понятно? :)

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


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

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

когда занятый ресурс ожидают несколько задач с разными приоритетами и может возникнуть взаимоблокировка (deadlock).

Вообще-то - взаимоблокировка - это нечто другое. Взаимоблокировка - это баг в ПО.

Это когда например задача1 владеет неким ресурсом1 и в это время пытается занять ресурс2, занятый задачей2. Она соответственно уходит в ожидание. И в этот время задача2 если попытается занять ресурс1, то вот тут как раз и возникнет deadlock - взаимоблокировка.

Сомневаюсь, что мьютекс спасёт от такого.

 

А вот уже инверсия приоритетов задач - это уже третье. :laughing:

И не уверен что мьютекс спасёт от неё.

 

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

Другими словами: использовать семафор как средство разделения общего ресурса - это неправильно в разных смыслах.

Уже лет 10 пишу под uCOS-II. Куча разного ПО. И не только я (в группе разработчиков). Почти везде для разделения ресурсов используем семафоры (в некоторых ПО - по несколько десятков семафоров и почти десяток задач), устройств десятки тысяч уже у заказчиков работают - и всё ок. Странно, да? :rolleyes:

 

Кстати, во FreeRTOS для этого есть более быстрый метод - уведомление (notify), он жрет заметно меньше ресурсов.

В uCOS для этого есть mailbox ;)

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


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

Вообще-то - взаимоблокировка - это нечто другое. Взаимоблокировка - это баг в ПО.

Это когда например задача1 владеет неким ресурсом1 и в это время пытается занять ресурс2, занятый задачей2. Она соответственно уходит в ожидание. И в этот время задача2 если попытается занять ресурс1, то вот тут как раз и возникнет deadlock - взаимоблокировка.

Сомневаюсь, что мьютекс спасёт от такого.

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

Я лично не сталкивался с таким, т. к. всегда всячески избегал подобных построений проекта.

Но тем не менее, лишь в мьютекс заложен механизм борьбы с подобными бедами.

 

А вот уже инверсия приоритетов задач - это уже третье. :laughing:

В данном случае первое является лишь причиной, а второе - следствием, но, однако, сути это не меняет ;)

 

Уже лет 10 пишу под uCOS-II. Куча разного ПО. И не только я (в группе разработчиков). Почти везде для разделения ресурсов используем семафоры (в некоторых ПО - по несколько десятков семафоров и почти десяток задач), устройств десятки тысяч уже у заказчиков работают - и всё ок. Странно, да? :rolleyes:

У вас видать были приняты такие непривычные правила, которые со временем переросли в традицию, полагаю, что лет через 20 это превратится уже в некую "религию" ...

Особенно сложно новичкам - они всегда поддаются чужим необычным традициям. Через 10 лет чужая традиция становится как "родная" :biggrin:

 

 

В uCOS для этого есть mailbox ;)

В uCOS-1 и uCOS-2 очередь сообщений глубиной 1 называется Message Mailbox, остальные - Message Queue

В uCOS-3 Message Mailbox, упразднили и вместо нее нужно уже использовать Message Queue с параметром - один.

Однако, любая очередь сообщений - самый "тяжелый" ресурс в любой RTOS. Т. е. в данном случае это неправильное сравнение.

Я же говорю про примитивное уведомление задачи, в этом случае не создаются никакие объекты, для хранения используется лишь 4 байта внутри TCB задачи, которую нужно "уведомить".

Эта фишка появилась во FreeRTOS сравнительно недавно, она реально экономит ресурсы камня (такты, флеш и озу).

В uCOS такого нет.

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


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

наталкивает на мысль, что доступ к софтовой считалке происxодит из разных потоков. Я бы начал поиск граблей с этого места.

Знаете, что такое "софтовая считалка"? Это обычный код, которые исполняется своим чередом и не хранит какие-либо статические данные, привязанные к потоку. Следовательно, ничего подобного там быть не может.

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


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

Знаете, что такое "софтовая считалка"? Это обычный код, которые исполняется своим чередом и не хранит какие-либо статические данные, привязанные к потоку. Следовательно, ничего подобного там быть не может.
Но ни что не мешает саму переменную, где хранится текущее значение контрольно суммы, сделать глобальной ...

Дабы не спорить, ждем код считалки в студию!

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


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

Если приоритеты задач разные, то спасет.

Каким образом? Мьютекс спасёт от программного бага??? :wacko: Вы уверены, что правильно прочитали мой пример?

 

Но тем не менее, лишь в мьютекс заложен механизм борьбы с подобными бедами.

Имхо - у Вас путаница в терминологии. Я знаю что такое инверсия приоритетов. Это есть и в других ОС. Мьютексы от этого не спасают. Спасает другое.

 

Я же говорю про примитивное уведомление задачи, в этом случае не создаются никакие объекты, для хранения используется лишь 4 байта внутри TCB задачи, которую нужно "уведомить".

Эта фишка появилась во FreeRTOS сравнительно недавно, она реально экономит ресурсы камня (такты, флеш и озу).

В uCOS такого нет.

Я сравнивал исходный код FreeRTOS и uCOS-II. Второй - гораздо компактнее. Можете сами убедиться. Так что не надо сказки рассказывать.

И я не знаю как там в uCOS-III, но mailbox-ы в uCOS-II - это совсем не очереди сообщений. Для них совершенно отдельных набор своих функций существует.

И исходя из чисто функционала, mailBox в uCOS-II - это самый лёгкий тип объекта синхронизации. Что там может быть тяжёлого? Одна переменная для указателя. Если в неё пишется !=NULL - объект переходит в сигнальное состояние. При чтении она обнуляется и переходит в несигнальное состояние. Всё.

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


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

Знаете, что такое "софтовая считалка"?

Естественно не знаю, пока не увижу. Так что да,

код считалки в студию!

 

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


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

Каким образом? Мьютекс спасёт от программного бага??? :wacko: Вы уверены, что правильно прочитали мой пример?

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

 

 

Имхо - у Вас путаница в терминологии.
У меня как раз все чотко ;)

Однако, речь о совсем другом - о разнице в применении мьютекса и семафора: одним делают одно, другим - другое.

По крайней мере так было задумано теми, кто их придумал. Иначе они бы были одним и тем же и назывались одинаково.

 

Я сравнивал исходный код FreeRTOS и uCOS-II. Второй - гораздо компактнее. Можете сами убедиться.
Вполне возможно так и есть.

Я могу сравнить время реакции и размер кода для обычного ресурса и уведомления. Разница существенная. Это в пределах чисто FreeRTOS.

У ТС стоит как раз FreeRTOS, ни о какой uCos речь не велось. При чем здесь она?

 

При чтении она обнуляется и переходит в несигнальное состояние. Всё.

Я не поленился и залез в код os_mbox.c (uCos-2 v2.90).

Нужно объявлять объект "ящика" через OSMboxCreate, заранее создав его экземпляр. Т.е. тратим ОЗУ.

В остальном при передачи и ожидании событий для этого ящика, в соотв. функции нужно передавать указатель на него, что мало чем отличается от семафора или мьютекса.

Во FreeRTOS для использования уведомлений не нужно создавать никаких объектов, кроме самой задачи, которая ждет уведомления.

Передавать можно не только сам факт уведомления (бинарный семафор), но и 4-байтное значение (аналог MailBox в uCos).

Цитируя ваши же слова: "не надо сказки рассказывать" :)

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


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

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

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

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

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

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

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

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

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

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