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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Как сделать идеологически выдержанно, "в стиле РТОС"
nanorobot
сообщение Dec 9 2016, 11:08
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Дивайс состоит из двух узлов на STM32 связанных по SPI. Программа как для мастера так и для слейва пишется с использованием RTOS: мастер CortexM4/ChibiOS, слейв - CortexM0/nil(облегченный вариант ChibiOS). Слейв, в частности формирует слово состояния - набор битов, которое передается мастеру, а так же используется самой программой слейва. Причем биты могут использоваться в разных тредах(процессах). С точки зрения парадигмы RTOS они являются об'ектами синхронизации процессов. В этом случае они должны иметь тип BinarySemaphore с другой стороны для передачи слова состояния мастеру они(биты) должны быть упакованы в переменную типа uint16_t. Сейчас у меня используется union одно поле которого битовая структура, другое поле uint16_t. Покамест УМВР, но беспокоят возможные проблемы из за отхода от парадигмы RTOS. Напрашивается вариант: любое бращение к битам состояния защищать от коллизий доступа с помощью мютекса, но nil их не имеет, а использовать для слейва полную ChibiOs - тяжеловато будет, там и требования к скорости обработки повыше и процессор послабее. Что посоветуют знатоки?

Сообщение отредактировал nanorobot - Dec 9 2016, 12:07
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Dec 9 2016, 11:33
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



Цитата(nanorobot @ Dec 9 2016, 14:08) *
Напрашивается вариант: любое бращение к битам состояния защищать от коллизий доступа с помощью мютекса, но nil их не имеет

а что он имеет?
Напрашивается вместо битов признаки разнести по разным байтам и иметь доступ к ним без коллизий, если, конечно, между битами нет взаимосвязей.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 9 2016, 11:40
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(nanorobot @ Dec 9 2016, 16:08) *
Напрашивается вариант: любое бращение к битам состояния защищать от коллизий доступа с помощью мютекса, но nil их не имеет

Достаточно обеспечить атомарность доступа. Для этого можно просто запрещать прерывания на время записи переменной.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Dec 9 2016, 11:42
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(novikovfb @ Dec 9 2016, 17:33) *
а что он имеет?
Напрашивается вместо битов признаки разнести по разным байтам и иметь доступ к ним без коллизий, если, конечно, между битами нет взаимосвязей.


Это ничего не даст, пмсм.. Кроме того это никак не снимет необходимости упаковывать "байтовые" биты в uint16_t для отсылки мастеру. С такимже успехом можно опросить полтора десятка бинарных семафоров и собрать из них uint16_t и парадигма не нарушится. Это самый очевидный и громоздкий способ. Кроме того байты здесь 32 битовые wink.gif

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

Сообщение отредактировал nanorobot - Dec 9 2016, 11:50
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Dec 9 2016, 11:56
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



Цитата(nanorobot @ Dec 9 2016, 14:42) *
Это ничего не даст, пмсм..

Это позволит изменять разные признаки в разных тредах не боясь при попытке одновременной модификации двух признаков (первый начал менять, прерывание, второй начал и закончил, вернулся в первый закончил и записал в ячейку только свой результат, стерев результат второго треда.
Цитата(nanorobot @ Dec 9 2016, 14:42) *
Кроме того это никак не снимет необходимости упаковывать "байтовые" биты в uint16_t для отсылки мастеру.

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

Насколько я понимаю, запись байта - атомарная операция в микропроцессоре, а модификация бита во многих реализациях идет через временное значение в регистре (и Cortex M0 - в их числе).
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Dec 9 2016, 12:18
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(novikovfb @ Dec 9 2016, 17:56) *
Это позволит изменять разные признаки в разных тредах не боясь при попытке одновременной модификации двух признаков (первый начал менять, прерывание, второй начал и закончил, вернулся в первый закончил и записал в ячейку только свой результат, стерев результат второго треда.

ну здраво в общем. Но наверное использовать массив бинарных семафоров будет более корректно...
И да интересно, еслипроцессор имеет bit-banding для SRAM - компилятор будет его использовать для изменения отдельных битов в структуре? не думаю...

Цитата(AHTOXA @ Dec 9 2016, 17:40) *
Достаточно обеспечить атомарность доступа. Для этого можно просто запрещать прерывания на время записи переменной.



почему то напрягает лишний раз прерывания запрещать. Такой вот предрассудок...


Сообщение отредактировал nanorobot - Dec 9 2016, 12:17
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 9 2016, 13:27
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(AHTOXA @ Dec 9 2016, 13:40) *
Достаточно обеспечить атомарность доступа. Для этого можно просто запрещать прерывания на время записи переменной.

Именно так, но это если в лоб. А вообще на Corteх кроме заперта прерываний, есть еще два механизма обеспечения атомарного доступа. Не считая комбинированных.
То что тут начали нести про семафоры и иже с ними, есть офигительный бред в стиле через анус, а не в "стиле RTOS".

Цитата(nanorobot @ Dec 9 2016, 14:18) *
почему то напрягает лишний раз прерывания запрещать. Такой вот предрассудок...

Невежество sad.gif. Вы думаете, что в вызовах всяких семафоров с мютексами нет критических секций sm.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Dec 9 2016, 15:14
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(zltigo @ Dec 9 2016, 19:27) *
Именно так, но это если в лоб. А вообще на Corteх кроме заперта прерываний, есть еще два механизма обеспечения атомарного доступа. Не считая комбинированных.
То что тут начали нести про семафоры и иже с ними, есть офигительный бред в стиле через анус, а не в "стиле RTOS".


Невежество sad.gif. Вы думаете, что в вызовах всяких семафоров с мютексами нет критических секций sm.gif


Если Вы имели в виду BitBanding и команды LDREX/STREX то выше указано, что речь идет про cortex M0.
Я в курсе про наличие критических секций в обработке мютексов и семафоров, мой "предрассудок" имеет отношение чисто к "ручному" запрету прерываний,
отдавая предпочтение готовым сервисам, то есть в "стиле RTOS" . Кроме того в этом утверждении была некотороя доля (само)иронии.

Касательно бреда про семафоры: С небольшой поправкой, что упаковку значений бинарных семафоров в uint_16_t выполнять в процессе с максимальным приоритетом
это решение перестает быть "бредом".

Спасибо, что уделили внимание моей персоне.

Сообщение отредактировал nanorobot - Dec 9 2016, 15:26
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Dec 9 2016, 15:55
Сообщение #9


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(nanorobot @ Dec 9 2016, 13:08) *
Напрашивается вариант: любое бращение к битам состояния защищать от коллизий доступа с помощью мютекса, но nil их не имеет, а использовать для слейва полную ChibiOs - тяжеловато будет, там и требования к скорости обработки повыше и процессор послабее. Что посоветуют знатоки?


Вообще не понял проблемы. Что такое здесь 'парадигма'?
У меня на M0 вполне себе MQX крутится. Может вам на MQX перейти? biggrin.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 9 2016, 16:00
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(nanorobot @ Dec 9 2016, 17:14) *
Если Вы имели в виду BitBanding и команды LDREX/STREX то выше указано, что речь идет про cortex M0.

Вообще-то не только о нем. Для предельно кастрированных платформ, где даже допотопного SWP нет, остается запрет прерывания.
Цитата
Я в курсе про наличие критических секций в обработке мютексов и семафоров, мой "предрассудок" имеет отношение чисто к "ручному" запрету прерываний,
отдавая предпочтение готовым сервисам, то есть в "стиле RTOS" . Кроме того в этом утверждении была некотороя доля (само)иронии.

Мне, значит, не дано не понять sm.gif почему вызов вызов десятков-сотен команд содержащих запреты прерывания вместо просто запрета прерывания назван Вами "без предрасудков". О критических секциях - если если в некой операционке нет оформления критических секций, то это надо дописать, либо выкинуть такую "RTOS" нафиг.
Цитата
Касательно бреда про семафоры: С небольшой поправкой, что упаковку значений бинарных семафоров в uint_16_t выполнять в процессе с максимальным приоритетом
это решение перестает быть "бредом".

Процесс это НЕ семафор. Использование возможностей высокоприоритетного процесса, это нормально.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Dec 9 2016, 16:07
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(AlexandrY @ Dec 9 2016, 21:55) *
Вообще не понял проблемы. Что такое здесь 'парадигма'?
У меня на M0 вполне себе MQX крутится. Может вам на MQX перейти? biggrin.gif


м.б. сформулировал неудачно, но тема себя исчерпала.


Цитата(zltigo @ Dec 9 2016, 22:00) *
Вообще-то не только о нем. Для предельно кастрированных платформ, где даже допотопного SWP нет, остается запрет прерывания.

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

Процесс это НЕ семафор. Использование возможностей высокоприоритетного процесса, это нормально.



указано что слейв-M0, далее все про слейв
возможно стоит отказаться от всех сервисов РТОС, для синронизации использовать обычные переменные, запрещая , где требуется, прерывания wink.gif

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

Сообщение отредактировал nanorobot - Dec 9 2016, 16:13
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 9 2016, 17:24
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(nanorobot @ Dec 9 2016, 18:07) *
не удалось найти места, где бы я утверждал что процесс это семафор.

Но тем не менее свалили их в одну кучу:
Цитата
Касательно бреда про семафоры: С небольшой поправкой, что упаковку значений бинарных семафоров в uint_16_t выполнять в процессе с максимальным приоритетом

Цитата(nanorobot @ Dec 9 2016, 18:07) *
возможно стоит отказаться от всех сервисов РТОС, для синронизации использовать обычные переменные, запрещая , где требуется, прерывания wink.gif

Перестаньте противопоставлять средства предоставляемой какой то кастрированой RTOS всему спектру приемов программирования.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Dec 9 2016, 17:25
Сообщение #13


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(nanorobot @ Dec 9 2016, 18:07) *
м.б. сформулировал неудачно, но тема себя исчерпала.


Не думаю, тема эта долгая и еще плохо раскрытая.

Я например в связке M4-M0 по SPI делаю мастером M0.
Так легче релизовать риалтайм без блокировок обмена.




Go to the top of the page
 
+Quote Post
nanorobot
сообщение Dec 9 2016, 17:58
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(zltigo @ Dec 9 2016, 23:24) *
Но тем не менее свалили их в одну кучу:


Что не так? Есть набор бинарных семафоров, значения которых требуется "упаковать" в переменную типа uint16_t. Эту самую упаковку я собираюсь выполнять в процессе(треде, задаче) обладающем наивысшим приоритетом. Ни логических, ни грамматических ошибок не допущено. Ну, возможно, запятую пропустил. Ну так я на Пулитцеровскую премию не претендую. biggrin.gif Будьте доброжелательнее, не упоминайте анусы всуе laughing.gif Всего доброго.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Dec 9 2016, 18:07
Сообщение #15


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(nanorobot @ Dec 9 2016, 19:58) *
Что не так? Есть набор бинарных семафоров, значения которых требуется "упаковать" в переменную типа uint16_t.


Так это же нарушение 'парадигмы' если я ее правильно понимаю.
Основной принцип RTOS - независимость задач, для того чтобы была возможность оценить их планируемость.
Вы же целую кучу задач связываете между собой неким общим маршалингом.
Это не RTOS, планируемости нет.


Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th April 2024 - 17:24
Рейтинг@Mail.ru


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