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

 
 
13 страниц V  « < 4 5 6 7 8 > »   
Closed TopicStart new topic
> Real-time и не-real-time - в одном флаконе или раздельно?
mantech
сообщение Nov 3 2017, 17:39
Сообщение #76


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Студент заборстроительного @ Nov 3 2017, 18:21) *
Если поток прерываний слишком большой, он "забьёт" более низкоприоритетные, но все равно реал-таймовые задачи.

Я пошёл по пути гарантированного тайм-слота для задач с приоритетами класса 2


Сразу вижу противоречие. Т.е. если возьмем один и тот же процессор, и если у него не хватает быстродействия для обработки прерываний, и он забьет остальные прерывания, то это означает одно - неправильный выбор быстродействия проца, т.к. в этом случае ваша ОС просто пропустит это событие, находясь в другой задаче или в блоке переключения контекста.
Go to the top of the page
 
+Quote Post
syoma
сообщение Nov 3 2017, 18:17
Сообщение #77


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

Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



Если говорить о многозадачности, то у меня будет Rate-Monotonic Scheduling, который как раз благодаря отсутствию операционки у меня реализуется на ура. Считаю, что тут изобретать нечего - хотя он, возможно, не самый эффективный по загрузке процессора - до 70%, зато гарантирует все то, что мне нужно.
Go to the top of the page
 
+Quote Post
Студент заборстр...
сообщение Nov 4 2017, 08:17
Сообщение #78


Местный
***

Группа: Участник
Сообщений: 317
Регистрация: 16-09-17
Пользователь №: 99 334



Цитата(mantech @ Nov 3 2017, 20:39) *
Сразу вижу противоречие. Т.е. если возьмем один и тот же процессор, и если у него не хватает быстродействия для обработки прерываний, и он забьет остальные прерывания, то это означает одно - неправильный выбор быстродействия проца, т.к. в этом случае ваша ОС просто пропустит это событие, находясь в другой задаче или в блоке переключения контекста.

Поэтому я и пошёл по пути запрета всех прерываний кроме таймерного.
А другие прерывания опрашивал по механизму поллинга.
Я же писал: у меня проц больше 70% времени сидит в обработчике таймерного прерывания, а на "полезную работу" доступно менее 30% процессорного времени.

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

Цитата(syoma @ Nov 3 2017, 21:17) *
хотя он, возможно, не самый эффективный по загрузке процессора - до 70%

Да плевать на загрузку процессора. Он же железный, вот и пусть пашет.
Труд программиста стоит на порядки дороже чем процессорные такты.
Я когда-то болел болезнью: экономить каждый такт CPU, старался писать код так, чтобы экономить такты. А потом понял, что моё время бесценно, а процессорное стоит копейки.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Nov 5 2017, 03:25
Сообщение #79


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Студент заборстроительного @ Nov 4 2017, 12:17) *
Поэтому я и пошёл по пути запрета всех прерываний кроме таймерного.
А другие прерывания опрашивал по механизму поллинга.
Я же писал: у меня проц больше 70% времени сидит в обработчике таймерного прерывания, а на "полезную работу" доступно менее 30% процессорного времени.

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


Да плевать на загрузку процессора. Он же железный, вот и пусть пашет.
Труд программиста стоит на порядки дороже чем процессорные такты.
Я когда-то болел болезнью: экономить каждый такт CPU, старался писать код так, чтобы экономить такты. А потом понял, что моё время бесценно, а процессорное стоит копейки.


Фигасе!. Что за такое таймерное прерывание?
В двух словах как работает preemptive real-time операционная система. Ядро получает возможность переключить задачу при системном вызове и после обработки прерывания.
Прерывания читают из железа (и пишут в железо) и разрешает семафор достаточно высокоприоритетной задаче, которая как бы является продолжением прерывание, поскольку при выходе из прерывания обработка будет переключена на нее если исполнялясь низкоприоритетная задача, но прерывания уже не будет.
Еще раз. Бежала какая-то низкоприоритетная задача, когда возникло условие для прерывания. Скажем приняли пакет данных в регистры приемника. В прерывании эти регистры копируются в буфер, буфер ставится в очередь буферов и отпускается семафор обработчика принятого буфера. Все. Выходим из прерывания. Эта работа достаточно короткая и в прерывании больше продолжать не надо. Отпущеный семафор меняет условия для ядра и из прерывания вы выходите не в ту задачу, что исполнялясь, а в ту, которая ждала семафора, поскольку ей нечего было обрабатывать. Фактически вы продолжаете обрабатывать прием, но уже не в прерывании.
Закон. Прерывания надо предельно минимизировать. Обработчик таймера, который считает время, вообще должен инкрементировать счетчик и выйти. Ну еще пару таких же простых операций если очень нужно. И все.

Поллинг самое нехорошее решение для реал тайма.
Если писать правильно, то все будет эффективно и с маленькими затратами. Я пару лет назад пытался описать принципы написания програм реального времени, но отчего-то публика начала возмущаться моей нескромностью и топик в котором я начал описывать технику написания програм реального времени перенесли в тему общение. Как мне объяснили, что раз меня не спрашивают, то и нефиг соваться. Так что если вам интересно -- создайте тему. Скажем "Как писать программы реального времени?", а люди будут вам отвечать. Вот тогда у вас будет пища для принятия решений.
Go to the top of the page
 
+Quote Post
Студент заборстр...
сообщение Nov 5 2017, 07:44
Сообщение #80


Местный
***

Группа: Участник
Сообщений: 317
Регистрация: 16-09-17
Пользователь №: 99 334



Цитата(Tarbal @ Nov 5 2017, 06:25) *
В двух словах как работает preemptive real-time операционная система.
...

Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Nov 5 2017, 08:43
Сообщение #81


Ally
******

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



Цитата(Tarbal @ Nov 5 2017, 05:25) *
Еще раз. Бежала какая-то низкоприоритетная задача, когда возникло условие для прерывания. Скажем приняли пакет данных в регистры приемника. В прерывании эти регистры копируются в буфер, буфер ставится в очередь буферов и отпускается семафор обработчика принятого буфера. Все. Выходим из прерывания. Эта работа достаточно короткая и в прерывании больше продолжать не надо. Отпущеный семафор меняет условия для ядра и из прерывания вы выходите не в ту задачу, что исполнялясь, а в ту, которая ждала семафора, поскольку ей нечего было обрабатывать. Фактически вы продолжаете обрабатывать прием, но уже не в прерывании.

Так обработчики прерываний надо рассматривать как фрагменты задач если придерживаться концепции Rate-Monotonic Scheduling ?
Я вот это не понял.
Если смотреть на них, как на фрагменты задач, то тогда ваш подход прямо нарушает принцип монолитности.
Если же прерывания не фрагменты задач, а нечто другое, то какой принцип планирования применить к обработчикам прерываний.
И не будет ли он конфликтовать с Rate-Monotonic Scheduling?
Исходим из того что обработчики прерываний в высоконагруженной встраиваемой системе исчисляются десятками и занимают больше половины процессорного времени.
Go to the top of the page
 
+Quote Post
syoma
сообщение Nov 5 2017, 09:05
Сообщение #82


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

Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



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

Интересный вопрос. Вот, допустим, у меня есть два CAN интерфейса, по которым в любой момент могут быть приняты данные, которые нужны одной или нескольким задачам, выполняющимся по RMS. То есть есть новые данные или их нету, задача все равно выполнится в нужное время. Таким образом задача обработчика прерывания приемника CAN - это всего лишь вытащить данные из приемного буфера и обновить нужные переменные, которые используются в задачах.
Тут есть несколько подводных камней. Если чтение из буфера и обновление переменных сделать высокоприоритетной задачей или сразу в прерывании от CAN, то может случиться так, что это произойдет во время выполнения задачи, которая использует эти переменные. У меня это решено так, что каждая задача читает свои входные переменные только один раз вначале цикла и дальше работает только с внутренними переменными. Тогда обновление входных переменных во время исполнения этой задачи не приведет к непредсказуемым результатам.
Либо как бы второй вариант - делаем обработчик буфера самым низкоприоритетным процессом, тогда он не сможет прервать выпоняющуюся задачу и испортить ей данные. Но тогда, если оставшегося времени не хватит, чтобы обработать весь входной буфер, получим ой.
Go to the top of the page
 
+Quote Post
mantech
сообщение Nov 5 2017, 09:17
Сообщение #83


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Студент заборстроительного @ Nov 4 2017, 11:17) *
Да плевать на загрузку процессора. Он же железный, вот и пусть пашет.
Труд программиста стоит на порядки дороже чем процессорные такты.
Я когда-то болел болезнью: экономить каждый такт CPU, старался писать код так, чтобы экономить такты. А потом понял, что моё время бесценно, а процессорное стоит копейки.


В таком режиме о энергосбережении можно забыть навсегда. В АВРках или простеньких АРМ, на частоте до 100МГц - это наверно и нафиг не нужно, но на частотах 500+ это очень заметно получается.
На счет труда программиста - для себя не вижу никакой трудности использовать прерывания, нежели изврат с поллингом, но тут дело вкуса, конечно...
Go to the top of the page
 
+Quote Post
Студент заборстр...
сообщение Nov 5 2017, 09:24
Сообщение #84


Местный
***

Группа: Участник
Сообщений: 317
Регистрация: 16-09-17
Пользователь №: 99 334



Цитата(mantech @ Nov 5 2017, 12:17) *
для себя не вижу никакой трудности использовать прерывания

Какие Ваши годы. У Вас ещё всё впереди.
"О сколько нам открытий чудных..." rolleyes.gif
Трудностей нет пока задачи относительно простенькие и проц мощный. И устройство не "mission critical"
Только потом не говорите, что я Вас не предупреждал beer.gif

Сообщение отредактировал Студент заборстроительного - Nov 5 2017, 09:28
Go to the top of the page
 
+Quote Post
mantech
сообщение Nov 5 2017, 11:29
Сообщение #85


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Студент заборстроительного @ Nov 5 2017, 12:24) *
Какие Ваши годы. У Вас ещё всё впереди.
Трудностей нет пока задачи относительно простенькие и проц мощный. И устройство не "mission critical"


Своя ОС, проц мощный, работа в режиме 24\7, полет нормальный... laughing.gif

Спасибо, предупрежден rolleyes.gif
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Nov 5 2017, 13:39
Сообщение #86


Ally
******

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



Цитата(syoma @ Nov 5 2017, 11:05) *
Тут есть несколько подводных камней. Если чтение из буфера и обновление переменных сделать высокоприоритетной задачей или сразу в прерывании от CAN, то может случиться так, что это произойдет во время выполнения задачи, которая использует эти переменные.

Тут вы сделали себе логичекую ловушку.
Если вы утверждаете, что обработчик пакетов CAN работает у вас в реальном времени, то вам не надо ничего читать в прерывании. В прерывании только взводите флаг наличия пакета.
Читаете пакет и выполняет действия связанные с ним в единой задаче активизирующейся по флагу. Нет необходимости в промежуточной буферизации.
Буферизация, а лучше ковееризация - верный признак отсутствия реального времени.
Обработчик CAN следовательно не работает у вас в реальном времени.
Итого имеем ситуацию - есть ISR который не задача, и есть задача которая не realtime.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Nov 6 2017, 09:23
Сообщение #87


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Moderator: Уважаемые, настоятельно призываю вернуть дискуссию в конструктивное русло. Иначе буду наказывать.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
syoma
сообщение Nov 6 2017, 09:48
Сообщение #88


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

Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



Цитата
Тут вы сделали себе логичекую ловушку.
Если вы утверждаете, что обработчик пакетов CAN работает у вас в реальном времени, то вам не надо ничего читать в прерывании. В прерывании только взводите флаг наличия пакета.
Читаете пакет и выполняет действия связанные с ним в единой задаче активизирующейся по флагу. Нет необходимости в промежуточной буферизации.

Не очень понял, перефразируйте? Обработчик пакетов CAN читает пакет из приемного буфера(или почтового ящика, если так более понятно) приемника CAN, как только тот оказывается там. Других буферов нет.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Nov 6 2017, 10:47
Сообщение #89


Ally
******

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



Цитата(syoma @ Nov 6 2017, 11:48) *
Не очень понял, перефразируйте? Обработчик пакетов CAN читает пакет из приемного буфера(или почтового ящика, если так более понятно) приемника CAN, как только тот оказывается там. Других буферов нет.

Вы допустили возможность прихода нового пакета пока не обработан предыдцщий. А это и есть нарушение реального времени.
Т.е. вы на самом деле не работаете в реальном времени. У вас нет жестко специфицированного дедтайма.
Go to the top of the page
 
+Quote Post
one_eight_seven
сообщение Nov 6 2017, 11:35
Сообщение #90


Знающий
****

Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664



Цитата
допустили возможность прихода нового пакета пока не обработан предыдцщий. А это и есть нарушение реального времени.

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

Так и здесь - шина CAN способна передавать данные быстрее, чем устройство успевает их обрабатывать. И это нормально: шина не является бутылочным горлышком. А вот ваша уверенность в том, что нельзя при этом принимать/передавать пакет данных, а необходимо пользоваться исключительно одиночными транзакциями - это очень странное и даже вредное убеждение.
Go to the top of the page
 
+Quote Post

13 страниц V  « < 4 5 6 7 8 > » 
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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