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

 
 
> STM32F407: Ethernet, HAL + Lwip
k000858
сообщение Jan 12 2017, 07:11
Сообщение #1


Местный
***

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



Всем привет.

Кто изучал драйвер Ethernet'а, идущий с HAL библиотеками (вариант для FreeRTOS: ETHERNET прерывание релизит семафору, которая парсится в отдельной realtime задаче ОС)? Что будет при переполнении указанного количества приёмных буферов? Ошибка DMA обработается, но не будет ли DMA записывать данные дальше (портить память) или это исключено т.к. указывается в размер буферов в настройках DMA?

Имею следующую ситуацию: устройство с Ethernet в параллельной задаче (с меньшим приоритетом чем Ethernet) копирует данные (memcpy функцией) с внутренней FLASH контроллера. При шторме устройства Ethernet трафиком, в какой то раз данные копируются неправильно (временно нарушается адресация флэш - откуда копировать, но до конца процесса восстанавливается), в результате часть данных получается битыми.

Пока подозрения на ошибку в Ethernet драйверах либо LwIP стеке (v1.4.1).

То есть многократное срабатывание прерывания Ethernet + работа задачи по сохранению принятого по Ethernet пакету приводит к сбою работы memcpy

Нехватка памяти для RTOS и его задач контролируется соответствующими отладочными функция FreeRTOS

Может у кого то будут умные мысли, как можно сузить круг поиска бага?
Как еще подиагностировать. Повторить ситуацию непросто, получается ни каждый раз.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Jan 13 2017, 18:12
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Насколько вы описали проблему, мне кажется, что проблема не в дровах и не в стеке. Ничего там не переполнится.
Судя по всему, у вас проблемы с синхронизацией между задачами. Либо второй вариант - где-то используется глобальная переменная, доступная на запись из нескольких задач. Туда ройте.
Go to the top of the page
 
+Quote Post
k000858
сообщение Jan 16 2017, 04:44
Сообщение #3


Местный
***

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



Цитата(SasaVitebsk @ Jan 13 2017, 21:12) *
где-то используется глобальная переменная, доступная на запись из нескольких задач. Туда ройте.

такое есть. чем это чревато?
Go to the top of the page
 
+Quote Post
Forger
сообщение Jan 16 2017, 14:24
Сообщение #4


Профессионал
*****

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



Цитата(k000858 @ Jan 16 2017, 07:44) *
такое есть. чем это чревато?

Курим интернеты, думаем, делаем соотв. выводы sm.gif
Лично рекомендую нафик уходить с голого C на C++ и использовать вместо глобальных объектов синглтоны.
Особенно для толстых проектов.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Aner
сообщение Jan 16 2017, 21:51
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 4 869
Регистрация: 28-02-08
Из: СПБ
Пользователь №: 35 463



QUOTE (Forger @ Jan 16 2017, 18:24) *
Курим интернеты, думаем, делаем соотв. выводы sm.gif
Лично рекомендую нафик уходить с голого C на C++ и использовать вместо глобальных объектов синглтоны.
Особенно для толстых проектов.

С++ и его достоинства перед С, ... думаю не для STM c его осами и ограниченностью памяти. C++ даст только увеличение объема кода, подъест ресурсы которые и так ограничены. Хотя если задачка простенькая то пофигу на чем писать под STM хоть на С#.

Правильно pitt пишет в STM HAL в принципе не годится, у меня тоже свой. Все отлажено и работает в серийном изделии. А тот что выложен, у всех глючит и будет глючить по понятным причинам. Он для начинающих и лентяев.

И что ещё за шторм устройства Ethernet трафиком? Дураку, понятно что простых DoS атак STMы никак не потянут, даже старшие.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 17 2017, 06:50
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Aner @ Jan 16 2017, 23:51) *
С++ и его достоинства перед С, ... думаю не для STM c его осами и ограниченностью памяти. C++ даст только увеличение объема кода, подъест ресурсы которые и так ограничены.
Опять двадцать пять. Снова повторение одних и тех же мантр. Вы можете свои слова подтвердить хоть одним примером, когда хоть какое-то действие, алгоритм и т.д. даст "увеличение объема кода, подъест ресурсы" только потому, что написана на плюсах вместо голых сей? Криворукость программиста не рассматриваем, мы знаем, что "настоящие программисты пишут на Паскале на любом языке". Уже много лет как перешел на плюсы не только на STM32 "c его осами и ограниченностью памяти" но и, страшно сказать, на AVR(!) и не вижу описываемых вами ужасов. Вот совсем не вижу. А преимущества плюсов вижу и постоянно использую.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 17 2017, 07:19
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Сергей Борщ @ Jan 17 2017, 09:50) *
А преимущества плюсов вижу и постоянно использую.

Сергей, но по сабжу применение синглтонов, явно не то преимущество, согласитесь.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 17 2017, 12:12
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (SasaVitebsk @ Jan 17 2017, 09:19) *
Сергей, но по сабжу применение синглтонов, явно не то преимущество, согласитесь.
Про синглтон как таковой ничего пока сказать не могу, не проникся им пока. Но спорю на ящик пива, что та же функциональность, написанная на голых сях, будет занимать не меньше памяти и "ограниченных ресурсов", а исходный текст при этом выглядеть будет куда более чудовищно. К тому же оставит программисту кучу возможностей натворить ошибок в процессе использования этого готового и безусловно рабочего кода.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Forger
сообщение Jan 17 2017, 14:32
Сообщение #9


Профессионал
*****

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



Цитата(Сергей Борщ @ Jan 17 2017, 15:12) *
Про синглтон как таковой ничего пока сказать не могу, не проникся им пока.

А мне пришлось их использовать, т. к. в противном случае просто нереально контроллировать порядок вызова конструкторов статически создаваемых классов.

Например:
есть класс Hardware, где инициализируется и используется железо МК,
есть класс RTOS, инициализация которой должна пройти сразу после инициализации тактового генератора,
но до всех остальных инциализаций, в т. ч. и до создания задач и других объектов.

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

Конечно, отложенная инициализация - неплохое решение (перенос содержимого конструктора в отдельный метод initialize(), который уже вызывается в определенном месте).
Но все равно возникает проблема видимости статически созданных классов в других файлах.
Можно пойти дальше - объявлять некоторые поля таких классов со словом static.
Но это по-сути выраждается в коряво имитируемый синглтон ))

В итоге все равно приходишь к полноценному готовому шаблону - синглтону ))

К слову, под синглтон идеально ложится класс RTOS, класс железа или чего-то, что в проекте ВСЕГДА будет существовать в единственном экземпляре.
Синглтон позволяет сам контроллировать вызов своей инциализации, причем делать это лишь один раз.
Например, инициализаця класса RTOS должно проводится всего один раз и всегда ДО создания объектов классов задач/потоков, семафоров, мьютексов и др. сервисов RTOS.
Достаточно лишь в конструкторе каждого такого объекта вызывать соотв. метод отложенной инициализации класса RTOS, где уже внутри него проверятся - была проведена инициализация или нет.
Вся эта "тряхомуть" сложена в одном файле, один раз отлажена, собрана в библиотеки под разные виды платформ и забыта до тех пор, пока не потребуется расширить ее функционал или поменять ядро RTOS.

Снаружи любого проекта это выглядить очень просто и лаконично - задачи, сервисы RTOS можно объявлять где угодно:
статически (в начале файле cpp), динамически, размещать их в закрытой секции (private) соотв. класса, да хоть локально в соотв. функции ))
Голова никогда не болит где и в каком поредке они будут созданы, но будут проинициализированы и запущены в строго отведенных местах в заданном порядке (см. код из предыдущего моего поста).

Впрочем, прелесть сигнлтона есть и в другом - он легко позволяет перестать быть синглтоном, а сам код класса при этом почти не меняется.
Т.е. можно при желании создать несколько экзэмпляров RTOS, и переписать порт под многоядерную систему, где будут крутиться более одной оси .... wink.gif
На данный момент это пока что абсурд, но тем не менее!

Цитата(pitt @ Jan 17 2017, 17:18) *
Что там мешает плохому танцору?

Рукастый слесарь со стажем, который работал только стамеской и молотком, может сотворить настоящее чудо.
Когда потребуется сделать что-то подобное, то все по новой - долго, муторно, трудоемко sad.gif
В этот раз чуда может не получится - скажем, отколется часть детали и все по-новой....

Другой же слесарь, который смотрит дальше того, что умеет, поступит иначе:
нарисует 3D модель (придется освоить соотв. инструменты), отдаст ее в деревообрабатывающий цех (придется научится правильно рисовать модели под особенности технологии),
ему на ЧПУ станке по дереву вырежут ему десяток таких чудесных деталей.
Когда ему потребуется еще десяток таких же деталек или подобных, но отличающихся, скажем, лишь положением крепежных отверстий,
его задача - потратить 10 минут на исправление уже созданной им ранее модели, далее процедура знакомая и быстрая.
ЧПУ станок нарежет столько деталей, сколько нужно. В этом время этот слесарь занят следующей моделью.

Конечно, никто не мешает до конца жизни стучать молотком по стамеске biggrin.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 18 2017, 09:18
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Forger @ Jan 17 2017, 16:32) *
Синглтон позволяет сам контроллировать вызов своей инциализации, причем делать это лишь один раз.
Вот на реализации этого и страдает мое чувство прекрасного. Он каждый раз проверяет - создан ли объект, и если не создан - то создает. То есть программа может годами работать после запуска, все инициализации давно прошли, а он продолжает тратить время на ставшие уже ненужными проверки при каждом обращении к каждой сущности. Я понимаю, что это тяжелое наследие моего ассемблерного прошлого, что ресурсов у современных МК завались, но побороть себя пока не могу. Хотя с проблемами порядка инициализации сталкиваюсь постоянно, да. Пока я думаю о запихивании всего в один класс Application - там порядок вызова конструкторов однозначно определен порядком объявления, а уж наличие в программе одного объекта Application я как-нибудь вручную обеспечу.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Forger
сообщение Jan 18 2017, 09:48
Сообщение #11


Профессионал
*****

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



Цитата(Сергей Борщ @ Jan 18 2017, 12:18) *
Вот на реализации этого и страдает мое чувство прекрасного. Он каждый раз проверяет - создан ли объект, и если не создан - то создает. То есть программа может годами работать после запуска, все инициализации давно прошли, а он продолжает тратить время на ставшие уже ненужными проверки при каждом обращении к каждой сущности.

Редкая проверка битового флага отнимает совсем немного времени sm.gif

К тому же далеко не везде и не так уж часто нужно проверять факт существования некоторых сущностей.

Вот пример: синглтон rtos - класс Kernel.
При создании мьютекса в конструкторе вызывается инициализация Kernel.
Т.е. проверка только на этапе запуска системы (я динамически практически никогда не создаю объекты rtos).
По сути в данном случае все эти проверки производятся только при подаче питания.

Код
void Kernel::initialize(void)
{
    if (!isInitialized)
    {
        __disable_irq();
        initializeHardware();
        initializeModules();
        isInitialized = true;
    }
}


Код
class Mutex
{
public:
    Mutex(void)
    {
        Kernel::getInstance().initialize();
        handle = xSemaphoreCreateMutexStatic(&controlBlock);
    }
....



Цитата(Сергей Борщ @ Jan 18 2017, 12:18) *
Пока я думаю о запихивании всего в один класс Application - там порядок вызова конструкторов однозначно определен порядком объявления, а уж наличие в программе одного объекта Application я как-нибудь вручную обеспечу.
В начале так делал, но еще на этапе проектирования возникли проблемы с областями видимости одних модулей с другими - ведь они ничего друг о друге не знают.
Костыли с дополнительными методами решали проблему (передача в модули ссылок на другие объекты), но такие костыли лучше сразу выкинуть, ибо они еще хуже, чем все это ваять на голом С.
Синглтоны, имхо, тут оказались самым уместным решением.
И обязательно - возможность отложенной инициализации, у меня каждый модуль имеет метод initialize(), пусть пустой, но он должен быть.
(в будущем это даст возможность запихать их в container и инициализировать все скопом через foreach).






Цитата(SasaVitebsk @ Jan 18 2017, 11:32) *
Самые тяжёлые - ошибки в проектировании, так как они обнаруживаются на поздних этапах разработки и влекут за собой значительную переработку проекта...

Ну, "не так страшен черт, как его малюют" sm.gif

Цитата(SasaVitebsk @ Jan 18 2017, 11:32) *
Ну или костыли,которых не любят все.
Никто не любит костыли, просто, многие ленятся отказаться от них wink.gif

Цитата(SasaVitebsk @ Jan 18 2017, 11:32) *
На счёт того, что плюсы дают преимущество в проектировании - возможно. Так как более высокоуровневый язык, проще позволяет описать именно верхний уровень. Но это справедливо будет только при хорошем владении инструментом.
Хорошее владение инструментом возникает только в процессе пользования инструментом, по щелчку пальца такие навыки не приходят.
Не стоит бояться новых инструментов, уверяю вас - привыкание приходит быстро sm.gif

Цитата(SasaVitebsk @ Jan 18 2017, 11:32) *
Иными словами - вот человек неверно спроектировал проект. И что? При переходе на С++ ошибки исчезнут? Думаю их добавится.

Разумеется! Тупой переход с C на C++ в лоб ничего полезного не даст, а даже наоборот.
Потребность в новом инструменте возникает тогда, когда накопленный опыт + старый инструмент уже не дают нужного результата.
Но, чтобы опыт рос, нужно развивать соотв. навыки, самое простое - делать много разных проектов.
Но делать с таким расчетом, что накопленные навыки (библиотеки) могут пригодится в других проектах.

Цитата(SasaVitebsk @ Jan 18 2017, 11:32) *
На плюсах даже подход меняется..
Именно! Думать начинаешь иначе, поэтому ошибок проектирования возникает в разы меньше (разумеется, нужно почитывать книжки умных дядек).


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- k000858   STM32F407: Ethernet, HAL + Lwip   Jan 12 2017, 07:11
- - pitt   Цитата(k000858 @ Jan 12 2017, 02:11) Пока...   Jan 12 2017, 15:38
- - Мур   Сам долго мучился с HAL, пока не скачал книгу Mas...   Jan 12 2017, 15:51
- - k000858   спасибо за советы. определенный смысл в них конечн...   Jan 13 2017, 03:43
|- - pitt   Цитата(k000858 @ Jan 12 2017, 22:43) спас...   Jan 13 2017, 13:13
||- - SasaVitebsk   Цитата(Forger @ Jan 16 2017, 17:24) Лично...   Jan 16 2017, 21:16
|||- - Forger   Синглтон я указал как самый популярный способ избе...   Jan 17 2017, 08:29
|||- - SasaVitebsk   Цитата(Forger @ Jan 17 2017, 17:32) Конеч...   Jan 17 2017, 15:42
||||- - Forger   Цитата(SasaVitebsk @ Jan 17 2017, 18:42) ...   Jan 17 2017, 15:58
||- - pitt   Цитата(Сергей Борщ @ Jan 17 2017, 01:50) ...   Jan 17 2017, 14:18
|- - pitt   Цитата(k000858 @ Jan 15 2017, 23:44) тако...   Jan 16 2017, 16:03
- - SasaVitebsk   В зависимости от текста... Как правило непредсказу...   Jan 16 2017, 14:22
- - SasaVitebsk   Стиль написания, конструирование программы и язык ...   Jan 17 2017, 22:21
|- - Forger   Цитата(SasaVitebsk @ Jan 18 2017, 01:21) ...   Jan 17 2017, 23:00
|- - SasaVitebsk   Цитата(Forger @ Jan 18 2017, 02:00) По ст...   Jan 19 2017, 12:47
|- - scifi   Цитата(SasaVitebsk @ Jan 19 2017, 15:47) ...   Jan 19 2017, 12:59
|- - Forger   Цитата(SasaVitebsk @ Jan 19 2017, 15:47) ...   Jan 19 2017, 13:04
- - SasaVitebsk   Посмотрите с чего начиналась тема. Начали гнать на...   Jan 17 2017, 23:48
|- - Forger   Цитата(SasaVitebsk @ Jan 18 2017, 02:48) ...   Jan 18 2017, 00:13
|- - pitt   Цитата(Forger @ Jan 17 2017, 19:13) На С+...   Jan 18 2017, 13:43
|- - Forger   Цитата(pitt @ Jan 18 2017, 16:43) Вообще,...   Jan 18 2017, 19:31
|- - pitt   Цитата(Forger @ Jan 18 2017, 14:31) На са...   Jan 19 2017, 04:35
|- - Forger   Цитата(pitt @ Jan 19 2017, 07:35) Блажен,...   Jan 19 2017, 06:52
|- - pitt   Цитата(Forger @ Jan 19 2017, 01:52) А дру...   Jan 19 2017, 13:28
|- - Forger   Классика жанра: вопрос -> холивар -> срач -...   Jan 19 2017, 13:34
- - SasaVitebsk   На счёт грамотного проектирования - ктож с вами сп...   Jan 18 2017, 08:32
- - k000858   не соглашусь темы подобного рода создаю в части с...   Jan 19 2017, 16:31
|- - Forger   Цитата(k000858 @ Jan 19 2017, 19:24) не с...   Jan 19 2017, 16:34
|- - SasaVitebsk   Цитата(k000858 @ Jan 19 2017, 19:31) проб...   Jan 19 2017, 20:19
|- - k000858   Цитата(SasaVitebsk @ Jan 19 2017, 23:19) ...   Jan 20 2017, 05:54
|- - Forger   Цитата(k000858 @ Jan 20 2017, 08:54) В пр...   Jan 20 2017, 06:00
- - SasaVitebsk   Ну в принципе, здесь возможны 4 ошибки. 1. класси...   Jan 20 2017, 08:08
|- - Forger   Если проектировать код похожим образом (на C++ без...   Jan 20 2017, 08:20
- - SasaVitebsk   Уважаемый Forger. Мы вас уже поняли. Надо проект о...   Jan 20 2017, 12:22
|- - pitt   Цитата(SasaVitebsk @ Jan 20 2017, 07:22) ...   Jan 20 2017, 13:22
|- - Forger   Навеяло (ничего личного) ...   Jan 20 2017, 17:38
|- - pitt   Цитата(Forger @ Jan 20 2017, 12:38) Навея...   Jan 20 2017, 22:11
|- - Forger   Цитата(pitt @ Jan 21 2017, 01:11) По-види...   Jan 20 2017, 22:19
|- - pitt   Цитата(Forger @ Jan 20 2017, 17:19) Не ст...   Jan 21 2017, 04:19
- - k000858   все оказалось проще: в одной задаче действительно ...   Jan 23 2017, 07:09


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st September 2025 - 00:39
Рейтинг@Mail.ru


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