Easyelectronics.ru

Электроника для всех
Текущее время: 20 июн 2018, 10:28

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 24 ] 
Автор Сообщение
 Заголовок сообщения: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 15:59 
Только пришел

Зарегистрирован: 02 апр 2011, 17:37
Сообщения: 18
Здравствуйте уважаемые форумчане. У меня вопрос общего характера. Стоит ли избегать использование глобальных переменных во FreeRTOS? Изучение данной ОС начал недавно.
Дело в том, что я адаптирую готовый код для работы с микросхемой ds2482 под ESP32. Кто не в курсе ds2482 – i2c 1-wire bridge (master). На сайте компании Maxim есть раздел, где в общем виде объясняется как работать с этой микросхемой https://www.maximintegrated.com/en/app-notes/index.mvp/id/3684. В качестве примера приводится реализация функций (на си) для работы с ds2482 и 1-wire устройствами которые висят на шине. Так вот я переписал код из примера (допилил) под esp32. Всю работу с ds2482 я перенёс в отдельные файлы, в header (.h) файл я вынес все #define и прототипы функций, а в source (.c) реализации функций. Кому не лень можете глянуть https://github.com/zip1982b/trmst.
Теперь по вопросу, некоторые функции в максимовской реализации используют глобальные переменные, что мне кажется немного не кошерно. Получается если в задаче (Task) при выполнении записи/чтения глобальных переменных произойдёт переключение задач (контекста), то могут быть ошибки неполной записи/чтения. Скажите мои предположения верны?
Мне видится, что придётся переписать функции использующие глобальные переменные. Скорее всего придётся использовать указатели в аргументах функции. Для того чтобы в задаче объявить переменные (те что были глобальными) с помощью malloc(). И передать указатели на них в функции.
Мня интересует верны ли мои мыли по этому поводу? Просто до этого никогда не использовал указатели в своих проектах.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 16:26 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1822
Без глобальных переменных вы не сможете получить доступ к дескрипторам задач, очередей, семафоров, мьютексов. Поэтому, хотябы в пределах одного модуля (файла file.c), но переменные, являющиеся дескрипторами, должны быть глобальными (с приставкой static). Глобальные переменные видны из любой функции, а значит, вы можете использовать семафоры для управления задачей из прерывания.
Но сказанное относится в полной мере только к дескрипторам - переменным, по которым можно идентифицировать и обратиться к задаче, очереди, семафору.

Тип видимости переменной - глобальная или локальная, не отражается на процессах сохранения или чтения переменной. В один и тот же момент может выполняться только одна операция - ядро и АЛУ то одно единственное. Распараллеливание задач в РТОС следует понимать как поочередное переключение, каждой задаче выделяется тайм-слот на работу с ядром.

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

Использование указателей на переменные при глобальном определении переменных - никак не защищает от неразрывности операций. Потому что указатель - это всего лишь адрес той переменной, на которую он указывает. Данные остаются на месте и не закрыты от доступа из любой задачи, то есть, задачи могут портить не изолированный массив переменных.
Есть возможность разграничить доступ с помощью мьютексов. Работает по простому принципу - "перед тем, как лезть с записью в массив, проверь, свободен ли мьютекс".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 16:57 
Только пришел

Зарегистрирован: 02 апр 2011, 17:37
Сообщения: 18
Насколько мне известно, очереди используются только для передачи данных между задачами и обработчиками прерываний. В моём случае есть обычные функции (описанные в отдельном модуле), которые могут быть использованы кем угодно (любым клиентом) и вот эти функции используют глобальные переменные. Конечно вопрос Глобальные переменные во FreeRTOS, стоит ли использовать? не совсем корректен. Совсем не использовать глобальные переменные не получится. Но в контексте моего случая где глобальные переменные используются для сохранения состояния поиска устройств на шине, стоит ли их тут использовать? Не лучше ли использовать в функциях поиска указатели на переменные которые могут быть в каких угодно задачах. Хотелось бы чтобы функции реализованные в отдельном модуле, были универсальными.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 17:10 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 428
Стоп, несколько задач одновременно хотят (могут) использовать физику? Это даже как-то странно.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 17:23 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2621
Ну, в этом особо ничего страшного нет. Механизмы обращения к ресурсу могут быть разные. К примеру несколько задач могут ломится в один и тот же отладочный УАРТ, но тут помогут банальные мьютексы. Минус в том, что пока мьютекс не отдадут задача будет висеть в ожидании какого-то дебага. Поэтому у себя сделал складирование дебажного сообщения в очередь, причем само сообщение копируется в динамически выделяемый буфер, а задача-обслуга дебажного уарта с низким приоритетом неспешно забирает из очереди данные и выдаёт их в уарт по дма. В глобальных переменных особо ничего страшного нет, главное понимать кто и когда к ним может ломиться и где их стоит защищать от одновременного доступа.
Еще пример одновременного доступа - когда создается несколько экземпляров одной и той же задачи, например сервер входящих TCP/IP-сообщений. Запрос на прямой доступ к какому-нибудь ресурсу, пусть тот же уарт или еще какая периферия.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 17:27 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1822
Очереди вообще используются для изолированной и безопасной передачи данных между любыми задачами вообще. Передав блок данных в очередь, задача может спокойно перезаписать данные внутри себя, без воздействия на переданные в очередь данные. А из очереди данные могут быть забраны уже потом. Очередь на несколько элементов вообще позволяет складировать данные за несколько передач, а потом за один раз получить всё.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 17:30 
Только пришел

Зарегистрирован: 02 апр 2011, 17:37
Сообщения: 18
Я использую ds2482-100 (один канал) также есть ds2482-800 (восемь каналов 1-wire nets).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 17:37 
Только пришел

Зарегистрирован: 02 апр 2011, 17:37
Сообщения: 18
Меня прежде всего интересует не то что несколько задач будут использовать одну и туже глобальную переменную. А то что в момент переключения контекста задачи, которая будет использовать функции поиска в глобальную переменную запишется неверное (не полное) значение (проблема атомарности). Конечно можно использовать критические секции, но нафига городить трудности когда можно в функциях поиска в аргументах передать указатели. И не иметь дел с глобальными переменными.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 17:44 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2621
а указатель на что будет указывать? На всё ту же глобальную переменную. Если есть проблема атомарности - вводитет мьютексы, копируйте переменную на время доступа, ну и т.д.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 18:02 
Только пришел

Зарегистрирован: 02 апр 2011, 17:37
Сообщения: 18
Создаётся задача, в ней в области объявления переменных (не в цикле) вызывается функция поиска OWSearch() устройств на 1-wire. В момент выполнения поиска, OWSearch() необходимо сохранить промежуточные результаты в глобальные переменные (это связано с алгоритмом поиска устройств на 1-wire, разработанной компанией макисм). В момент сохранения результатов, может быть переключение на другую задачу и данные не верно будут записаны. Чтобы это исключить, я предполагаю, что необходимо объявить переменные в самой задаче (те что были глобальными) и передать указатели на них в OWSearch() которая реализована в отдельном модуле. Тем самым мы избавимся от глобальных переменных и от их объявления в том модуле где реализуется OWSearch(). Как то так..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 18:03 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1822
Блин, ну чукча - не читатель, чукча - пиздец какой писатель, ёпт.
Два раза повторил, за каким хуем созданы очереди и как избежать "неатомарности", а ТС опять задает тот же самый вопрос. ...У меня есть дядька (в возрасте уже), так тот тоже так же - задает вопрос, как отсканировать и сохранить отсканенный докум, но не слушая, сначала полностью опишет че и как он делает, и минут через пять, когда закончит свою речь, он тогда лишь будет доступен "на слушание"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 18:08 
Только пришел

Зарегистрирован: 02 апр 2011, 17:37
Сообщения: 18
BusMaster вообще нормальный? Очереди использовать предлагает... Я же не передаю данные между задачами. Есть скажем так модуль в котором реализованы функции для ds2482 эти функции я вызываю из задачи. Между кем мне в этом случае использовать очереди?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 18:11 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1822
Чувак, иди ты в жопу со своей нормальностью. Тебе четко сказали, как и чо работает, а ты еблище воротишь. Кароче, ёпт, иди учи, студент. Сначала разберись в своей писанине, а потом других сравнивай со своей нормальностью.

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


Последний раз редактировалось BusMaster 28 апр 2018, 18:16, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 18:13 
Только пришел

Зарегистрирован: 02 апр 2011, 17:37
Сообщения: 18
Я одного не пойму к чему эти выпады? Не хочешь не отвечай. Меня твоё мнение не интересует.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 18:14 
Только пришел

Зарегистрирован: 02 апр 2011, 17:37
Сообщения: 18
Еблище BusMaster у тебя быдло.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 18:17 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1822
Так ты сначала научись читать, а писать свои мнения ты будешь уже потом. Твои заблуждения вообще никого не интересуют.

Если беспокоит то, что после переключения контекста, в задаче может что-то потеряться, то такого не произойдет. Всё, что делала задача, сохраняется в ее стеке при переключении контекста. И пофик, глобальные переменные или локальные. У задачи есть свой стек для хранения текущей работы. Просто глобальные переменные (равно как и локальные static) помещаются физически в области памяти, распределенной для глобальных переменных (вне стека задачи), а локальные переменные задачи помещаются в стеке. Но независимо от места хранения переменных, последние действия задачи - "запоминаются".

Вот это ты вначале прочти три раза, а уж потом будешь писать свои измышления, если что не понятно будет.


Последний раз редактировалось BusMaster 28 апр 2018, 18:29, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 18:29 
Только пришел

Зарегистрирован: 02 апр 2011, 17:37
Сообщения: 18
да успокойся ты уже! остынь академик :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 18:58 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 1795
Использовать конечно!
Но для потокобезопасности защитить семафорами.

А если одна задача будет работать с переменными - чего тогда паритесь?
Хоть все переменными глобальными делайте.

Разница в том, что глобальные переменные не используют память (стек), отведённую для RTOS.
Если объявляете в задаче - то будет использоватся стек RTOS, и если память в этом стеке кончится - будут разнообразные непредсказуемые глюки, типа не запускающихся задач.
Так что большие массивы настоятельно рекомендую объявлять как глобальные переменные.
Легче контролировать расход памяти.

P.S. Академик прав...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 21:01 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 428
Hold писал(а):
Ну, в этом особо ничего страшного нет. Механизмы обращения к ресурсу могут быть разные. К примеру несколько задач могут ломится в один и тот же отладочный УАРТ, но тут помогут банальные мьютексы.

Цель с которой они будут туда ломиться - отпечатать сообщение, и не более. А тут, насколько я верно понял - нужно переключать алгоритм драйвера физики. То-есть два драйвера на одну физику. А если там ответа дождаться нужно?....

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 21:24 
Только пришел

Зарегистрирован: 02 апр 2011, 17:37
Сообщения: 18
Цитата:
То-есть два драйвера на одну физику
На самом деле один драйвер одна физика. В программе будет несколько различных задач не связанных с ds2482. Меня просто смущает, что в момент когда задача используя драйвер (поиск устройств на шине 1-wire) захочет сохранить промежуточные вычисления в глобальные переменные, и в этот момент произойдёт переключение на другую задачу (не связанную с этой) то данные исказятся или запишутся не полностью (баг).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 21:35 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1822
Еще спустя 20-30 сообщений топикстартер всё же может прочтет и осознает, что при переключении задач текущее состояние работавшей задачи сохраняется в её стеке, включая регистры ядра МК. Иначе просто не было бы смысла вообще в РТОС и переключениях задач.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 22:07 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 428
zip1982b писал(а):
На самом деле один драйвер одна физика.

Уровень физики - запись чтение периферийных регистров i2c интерфейса. По алгоритму который есть драйвер. Уровень приложения - приём отправка команд и данных в этот самый драйвер через список или захват. Поиск устройств - это команда!!! и должна выполняться в драйвере. Потому как не может шинковаться с другими режимами драйвера, и должна выполняться в полном объёме в режиме конечного автомата на уровне драйвера.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 22:22 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 99
zip1982b писал(а):
Меня просто смущает, что в момент когда задача используя драйвер (поиск устройств на шине 1-wire) захочет сохранить промежуточные вычисления в глобальные переменные, и в этот момент произойдёт переключение на другую задачу (не связанную с этой) то данные исказятся или запишутся не полностью (баг).

Ничо, получит свой квант времени и контекст исполнения - допишет. Задача сидит в отдельном С-модуле. Все глобальные переменные этого модуля - static, все функции этого модуля - static, кроме тех, что а) запускают задачу, б) останавливают задачу и ц-я) посылают задаче события. Посылка события - суть заталкивание его объекта в очередь - и никакого доступа к другим ресурсам модуля. Задача читает объект из очереди и отрабатывает событие. Если нужен доступ к глобальному ресурсу - функции-аксессоры Read/Write с получением бинарного семафора внутри них - оформленные так чтобы обойти их было невозможно. И никаких extern переменных - ибо "дорогие коллеги это по определению ленивая с-чь, плюющая на проблемы собратьев по несчастью". Даже после того, как им удалось доказать вам обратное. :-D


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальные переменные во FreeRTOS, стоит ли использовать?
СообщениеДобавлено: 28 апр 2018, 23:39 
Только пришел

Зарегистрирован: 02 апр 2011, 17:37
Сообщения: 18
ок. Понял.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB