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

 
 
> STM32F4 Ethernet + Dallas: перетягивание каната
k000858
сообщение Aug 27 2015, 04:15
Сообщение #1


Местный
***

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



Всем привет.
Есть девайс : stm + 1-wire шина (реализованная аппаратным UART'ом) + ethernet (обслуживается стеком Lwip), управляется FreeRTOS.

Есть 2 задачи (есть и другие, но они на работу не влияют):
1) Обслуживание Ethernet (приоритет realtime (highest))
2) Обслуживание шины 1 wire. (задача выполняется раз в секунду с osDelay(1000)wink.gif Этапы:
- поиск устройств на шине
- запись инициализирующих данных (для каждого по серийнику из найденных)
- конвертация температуры (для всех)
- osDelay(100);
- конвертация напряжения/тока (для всех СКИП РОМ)
- osDelay(5);
- чтение памяти каждого датчика (по серийнику)

Если приоритет 2й задачи нормал или хай (ниже езернетного таска), езернет работает отлично (пинг без потерь, время ответа 1 мс), однако датчики Даллас работают с перебоем - видимо нарушаются задержки в протоколе общения (задержки аппаратные, т.к. 1-wire шина эмулируется ЮАРТом).
Если приоритет 2й задачи = приоритету езернета, езернет работает неситабильно, регулярно время ответа увеличивается до 10-100мс (при 3 датчика Даллас на шине 1-wire) (в этот момент видимо проц занят работой 2й задачи, по обслуживанию шины 1-wire).

Посоветуйте, плиз, как оптимизировать работу этих 2х задач, что бы задача 1 работала стабильно (с текущим приоритетом), задача 2 так же работала стабильно, выполняясь раз в секунду.



Второй вопрос по тему: FreeRTOS к девайсу прикрутил совсем недавно. Разбираюсь с распределением памяти. На данный момент определяюсь, сколько памяти отдать каждой задачи. Вроде как нужно определить функцию диагностики стэка ОС, которой определять, у какой задачи переполняется стек, увеличивать стек каждой задачи пока не прекратится переполнение. Верно? Как определить такую диагностическую функцию? не могу найти ее в исходниках. Как посчитать (хотя бы ориентировочно), сколько кучи выделить в целом ОС (configTOTAL_HEAP_SIZE) ? И влияет ли размер памяти, выделяемой для Ос на настройки стека/кучи всего Си проекта?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
scifi
сообщение Aug 27 2015, 06:23
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(k000858 @ Aug 27 2015, 07:15) *
Если приоритет 2й задачи нормал или хай (ниже езернетного таска), езернет работает отлично (пинг без потерь, время ответа 1 мс), однако датчики Даллас работают с перебоем - видимо нарушаются задержки в протоколе общения (задержки аппаратные, т.к. 1-wire шина эмулируется ЮАРТом).

Дурдом. Можно подумать, настройкой приоритетов можно решить все задачи. Так и программу писать не надо, просто приоритеты расставил - и всё готово.
А не пробовали для начала разобраться, почему 1-wire сбоит? А не гадать но кофейной гуще.
Go to the top of the page
 
+Quote Post
k000858
сообщение Aug 27 2015, 06:53
Сообщение #3


Местный
***

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



Цитата(scifi @ Aug 27 2015, 09:23) *
Дурдом. Можно подумать, настройкой приоритетов можно решить все задачи. Так и программу писать не надо, просто приоритеты расставил - и всё готово.
А не пробовали для начала разобраться, почему 1-wire сбоит? А не гадать но кофейной гуще.

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


ранее (в стэндэлон варианте) езернет при работе 1-wire так же притормаживал (без него все ок).

может есть предположения, почему может сбоить 1-wire?

Цитата(SasaVitebsk @ Aug 27 2015, 08:57) *
Это как раз говорит о том, что вы неверно спроектировали задачу.
Высокий приоритет должна иметь задача, которая по сути ничего не делает а только ждёт семафора, например. Типовой вариант - обслуживание UART. Задача имеет высокий приоритет, но по сути постоянно находится в ожидании. Приходит прерывание, прерывание принимает байт (к примеру, или пакет) и включает семафор. При выходе из прерывания планировщик разблокирует задачу, она отрабатывает обработку и захватывает семафор (то есть опять блокируется).

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


Цитата(SasaVitebsk @ Aug 27 2015, 08:57) *
Наоборот. osDelay блокирует задачу, которая вызывает данную функцию на указанное время. Остальные задачи обслуживаются согласно приоритету.

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


Цитата(SasaVitebsk @ Aug 27 2015, 08:57) *
Если у вас включен контроль стека, и произойдёт его переполнение то будет вызван системный обработчик vApplicationStackOverflowHook. По умолчанию там зацикливание. Но Вы можете обработать это своим способом.
Но я вам предлагал выставить 2, задать заведомо больший размер стека,

здесь имеется ввиду стека определенной задачи? потому что пока знаю только как сделать это. общего стека ОС не нашел, только настройку кучи ОС

к слову, в проекте используется Lwip стек, который так же юзает кучу + ни мало приложений так же юзающих lwIP а значит кучу.


Цитата(SasaVitebsk @ Aug 27 2015, 08:57) *
Стек не выделяется из кучи. Стек распределяется статически. Я про FreeRTOS. Другое дело, что это не имеет отношения к инициализации стека компилятором. Каждой задаче FreeRTOS выделяет свой кусок памяти, где хранится стек. Глобальные переменные распределяются компилятором. Куча общая и из неё берутся динамические переменные, вне зависимости из какой задачи пришёл запрос на выделение памяти. Единственное отличие, что у FreeRTOS свой аллокатор памяти. Их там 5 уже в последней версии. Вы должны к проекту подключить тот, который вам больше подходит. У меня, к примеру heap_4.с подключен. Вы можете почитать отличия. Можете написать свой и подключить. На самом деле ничего там суперсложного нет. Всё очень понятно.

то есть фриРТОС берет об общей памяти данных мк, размещает в ней стек (= сумму стеков всех задач + накладные расходы) ?

Сообщение отредактировал k000858 - Aug 27 2015, 06:37
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Aug 27 2015, 07:39
Сообщение #4


Гуру
******

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



Цитата(k000858 @ Aug 27 2015, 09:53) *
пока по быстрому сделал так: создал задачу с осДилэй(1000) (что б раз в секунду выполнялась) и в нее запихнул вызов функции, которая выполнялась в стэндэлон варианте (не судите строго, нужен был быстрый запуск РТОС с имеющейся программой. оптимизация и проработка - следующий этап)

Если честно - нифига не понял. Рассматривайте каждую задачу как самостоятельное приложение. Лучше всего если каждая задача не зависела от другой. В Оси найболее сложным является грамотное построение связи между задачами. А вы, похоже, наоборот рассматриваете приложение в целом.
Цитата
то есть, если запустить задачу, и навтыкать в ней осДилэй, во время работы этих самых осДилей будут выполняться другие задачи (менее приоритетные либо с этим же приоритетом) ?

Да. Но так не надо делать. Я сопровождаю сейчас одну прогу, написанную другим программистом, так он вообще в явную прямо по ходу выполнения задачи передаёт управление другой задаче. Это как раз показывает неправильность построения. Такие возможности используются крайне редко и в особых случаях. А не повсеместно.
Ещё раз чтобы у вас отложилось в голове.
В нормальной системе у вас все задачи выполняются с равным приоритетом. Планировщик сам распределит время м/у задачами. Стороннему наблюдателю кажется что задачи выполняются одновременно. Лучше на мешать планировщику. В оптимале, каждая задача работает независимо, обмен данными м/у ними осуществляются путём передачи сообщений. Высокий приоритет у тех задач, которые являются продолжением прерываний. То есть те которые обычно ждут прихода события. Далее они быстро обрабатывают данное событие и ждут следующего.
Цитата
здесь имеется ввиду стека определенной задачи? потому что пока знаю только как сделать это. общего стека ОС не нашел, только настройку кучи ОС

Общий стек вам не нужен. )) Считайте что его нет.
Есть стек в каждой задаче. Рассматривайте его как статический массив данных в глобальной памяти.
Планировщик именно этим и занимается. Переключение контекста = это он берёт сохраняет указатель стека текущей задачи, переходит к следующей задаче и загружает указатель стека этой задачи. потом переходит на инструкцию на которой произошла предыдущая остановка...
Цитата
к слову, в проекте используется Lwip стек, который так же юзает кучу + ни мало приложений так же юзающих lwIP а значит кучу.

Он юзает кучу путём вызыва функций получения/ освобождения памяти. Эти функции ему подсовываются из файла heap_x.c FreeRTOS.
Куча общая. К стекам, задачам, и прочему отношения не имеет. Не совсем понимаю, что вас смущает?
Цитата
то есть фриРТОС берет об общей памяти данных мк, размещает в ней стек (= сумму стеков всех задач + накладные расходы) ?

Точнее делает это компилятор по "указке" FreeRTOS.
В IAR, например вы можете запустить плагин и посмотреть адреса в которых располагается стек той либо иной задачи.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- k000858   STM32F4 Ethernet + Dallas: перетягивание каната   Aug 27 2015, 04:15
- - SasaVitebsk   Есть понятие системного тика. Это время переключен...   Aug 27 2015, 04:59
|- - k000858   Цитата(SasaVitebsk @ Aug 27 2015, 07:59) ...   Aug 27 2015, 05:09
|- - SasaVitebsk   Цитата(k000858 @ Aug 27 2015, 08:09) При ...   Aug 27 2015, 05:57
- - mantech   Цитата(k000858 @ Aug 27 2015, 07:15) Есть...   Aug 27 2015, 06:17
|- - Сергей Борщ   Цитата(mantech @ Aug 27 2015, 09:17) Личн...   Aug 27 2015, 07:42
|- - jcxz   Цитата(mantech @ Aug 27 2015, 12:17) Личн...   Aug 27 2015, 08:03
- - SasaVitebsk   Как формируются задержки при работе с ОСью. Моё ви...   Aug 27 2015, 06:18
|- - scifi   Цитата(k000858 @ Aug 27 2015, 09:53) може...   Aug 27 2015, 07:17
- - bugdesigner   Проблема с нестабильностью 1-wire скорее всего свя...   Aug 27 2015, 07:07
|- - k000858   Цитата(bugdesigner @ Aug 27 2015, 10:07) ...   Aug 27 2015, 07:21
|- - jcxz   Цитата(k000858 @ Aug 27 2015, 13:21) в ка...   Aug 27 2015, 07:49
- - Сергей Борщ   Цитата(k000858 @ Aug 27 2015, 07:15) одна...   Aug 27 2015, 07:36
- - Сергей Борщ   Добавлено: так у вас там еще и ПДП. Тогда вообще н...   Aug 27 2015, 07:50
- - SasaVitebsk   Вот кидаю вам картинку, где виден плагин FreeRTOS,...   Aug 27 2015, 08:29
|- - k000858   Цитата(SasaVitebsk @ Aug 27 2015, 11:29) ...   Aug 27 2015, 08:33
|- - SasaVitebsk   Цитата(k000858 @ Aug 27 2015, 11:33) вот ...   Aug 27 2015, 08:46
|- - jcxz   Цитата(k000858 @ Aug 27 2015, 14:33) вот ...   Aug 27 2015, 08:53
- - k000858   а теперь вопрос на миллион!!! 1) задач...   Aug 27 2015, 09:02
|- - scifi   Цитата(k000858 @ Aug 27 2015, 12:02) при ...   Aug 27 2015, 09:32
|- - jcxz   Цитата(k000858 @ Aug 27 2015, 15:02) при ...   Aug 27 2015, 09:34
|- - k000858   Цитата(jcxz @ Aug 27 2015, 12:34) Ну если...   Aug 27 2015, 10:41
- - SasaVitebsk   Я бы никаких критических секций не делал. И даже н...   Aug 27 2015, 11:27
|- - k000858   Цитата(SasaVitebsk @ Aug 27 2015, 14:27) ...   Aug 28 2015, 02:47
|- - jcxz   Цитата(SasaVitebsk @ Aug 27 2015, 17:27) ...   Aug 28 2015, 16:23
- - k000858   Что бы не создавать вторую тему, задам вопрос в эт...   Aug 28 2015, 05:47
|- - scifi   Цитата(k000858 @ Aug 28 2015, 08:47) Подо...   Aug 28 2015, 06:37
|- - k000858   Цитата(scifi @ Aug 28 2015, 09:37) Сомнев...   Aug 28 2015, 06:50
|- - scifi   Цитата(k000858 @ Aug 28 2015, 09:50) в пр...   Aug 28 2015, 10:05
|- - kolobok0   Цитата(k000858 @ Aug 28 2015, 09:50) ...в...   Aug 28 2015, 16:31
- - k000858   появился еще вопрос от относительно ФрииРТОС: есть...   Sep 1 2015, 10:54
|- - kolobok0   Цитата(k000858 @ Sep 1 2015, 13:54) ... е...   Sep 1 2015, 11:20
- - SasaVitebsk   Переменные передаваемые при создании задачи служат...   Sep 1 2015, 18:37
- - k000858   весьма информативно. благодарю. исследование работ...   Sep 2 2015, 03:03
- - k000858   в процессе доработки столкнулся с зависанием некот...   Sep 2 2015, 06:50
|- - Сергей Борщ   Цитата(k000858 @ Sep 2 2015, 09:50) задач...   Sep 2 2015, 06:54
|- - jcxz   Цитата(k000858 @ Sep 2 2015, 12:50) Есть ...   Sep 2 2015, 06:59
- - k000858   да это понятное дело, что я могу сам сваять некий ...   Sep 2 2015, 07:02
|- - jcxz   Цитата(k000858 @ Sep 2 2015, 13:02) да эт...   Sep 3 2015, 03:45
- - k000858   Если мне необходимо выполнять некую задачу (наприм...   Sep 3 2015, 07:15
- - SasaVitebsk   Ну я так понимаю, что вам же не надо точно 1 сек? ...   Sep 4 2015, 05:22
|- - k000858   Цитата(SasaVitebsk @ Sep 4 2015, 08:22) Н...   Sep 4 2015, 08:07
- - SasaVitebsk   1. Я не совсем понял ф-ции osSemaphoreRelease/ osS...   Sep 7 2015, 06:01


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

 


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


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