Перейти к содержанию
    

Распределение времени между задачами

Почитал несколько документов для чайников.

Описано о приоритете задач много, но я не нашел зависимости распределения времени между задачами.

Например у меня три задачи независимые задачи с приоритетами 1, 2, 3.

Логично предположить, что время выделяемое на них будт прямо пропорционально приоритету.

Но никак не могу найти прямого указания о рспределении времени.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Перечитайте, пожалуйста, "для чайников" еще раз или несколько раз. А то пока Ваш вопрос напоминает вопрос из анекдота "все понял, кроме как в трактор лошадь запрягать", очень трудно начинать обoщения с такого уровня :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Перечитайте, пожалуйста, "для чайников" еще раз или несколько раз. А то пока Ваш вопрос напоминает вопрос из анекдота "все понял, кроме как в трактор лошадь запрягать", очень трудно начинать обoщения с такого уровня :(

 

Ну вот например такое описание:

Этот тип многозадачности означает, что готовая задача с высоким приоритетом перекрывает, а точнее вытесняет задачу с более низким. Время при вытесняющей многозадачности делится на равные промежутки – кванты, и вызов планировщика происходит по истечению кванта времени. Например, по умолчанию квант времени равен 1 мс, значит, планировщик будет вызываться каждую миллисекунду и передавать управление той или иной задаче (в зависимости от приоритета и готовности задачи). Соответственно, в настройках можно задать другое значение кванта времени. Запоминаем эти основные принципы вытесняющей многозадачности, а нас уже ждет следующий тип – многозадачность кооперативная.

 

Здесь уже планировщик не может вклиниться в выполнение задачи. Каждая задача должна сама передавать ему управление. То есть в конце кода задачи мы должны явно вызвать планировщик при помощи функции taskYIELD().

 

И, наконец, третий тип многозадачности – гибридная. Ну, тут по названию уже понятно, что она объединяет предыдущие два типа ) Планировщик вызывается каждый квант времени (привет от вытесняющей многозадачности), но программист также может вызвать его принудительно, как в кооперативной многозадачности.

 

 

Получается если запустить две задачи с разными приоритетами, то задача с более низким приоритетом не вызовется никогда.

 

Как на меня ОС должна не допускать такой ситуации.

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

После получения управления и останова задачи ее приоритет обратно сбрасывался к исходному уровню.

 

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Получается если запустить две задачи с разными приоритетами, то задача с более низким приоритетом не вызовется никогда.

"Каждая задача должна сама передавать ему управление" относится К ЛЮБОЙ ЗАДАЧЕ, а не только, как написано в неведомой цитате, "кооперативной". Уж слишком конспективную Вы какую-то бумажку взяли :(. Но даже в отцитированном Вами есть понятие "готовность задачи", которое Вы пропустили мимо ушей. Задачи по любому должны добровольно передавать управление ( переходить в "неготовность") и только если есть задача более высокого(равного)уровня или обработчик прерыания, то она прервет текущую.

И, наконец, третий тип многозадачности – гибридная. Ну, тут по названию уже понятно, что она объединяет предыдущие два типа ) Планировщик вызывается каждый квант времени (привет от вытесняющей многозадачности), но программист также может вызвать его принудительно, как в кооперативной многозадачности.

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

http://kit-e.ru/articles/micro/2011_2_96.php

http://microsin.net/programming/arm/index/Page-2.html

 

При чтении, надо обращать внимание, какого типа многозадачность, вытесняющая, кооперативная или гибридная. И ко всем вашим вопросам надо добавить какой режим многозадачности вы пытаетесь понять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почитал несколько документов для чайников.

Описано о приоритете задач много, но я не нашел зависимости распределения времени между задачами.

Например у меня три задачи независимые задачи с приоритетами 1, 2, 3.

Логично предположить, что время выделяемое на них будт прямо пропорционально приоритету.

Но никак не могу найти прямого указания о рспределении времени.

 

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

Для малых и примитивнейших RTOS типа FreeRTOS время выполнения задач должен измерять сам юзер.

После чего решать является ли его состав задач в принципе поддающимся планированию в рамках заданных допустимых задержек.

Для приоритетного планировщика с неизменяемыми длительностями выполнения задач известно правило 70%

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

Поэтому все гораздо сложнее. :crying:

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понятно, шары не будет.

Распределение ресурсов процессора раньше делал самостоятельно.

Думалось, что FreeRTOS на много сущесственнее поможет утрясать задачи.

Прийдется каждой задаче определять событие для останова/запуска.

 

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

Частота вызова - некоторая эмуляция выделения пропорциональности времени.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы предположил даже обратную зависимость времени работы задачи от приоритета. Что-то важное делать быстро, а длительные задачи выполнять по остаточному принципу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Думалось, что FreeRTOS на много сущесственнее поможет утрясать задачи.

Святым духом не иначе? Вы же как-бы ПОМОЩИ хотите, а чуда. Чудес не будет. А помощь ЕСТЬ!

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

Частота вызова - некоторая эмуляция выделения пропорциональности времени.

Что то мне сдается, что Вы пытаетесь что-то через анальое отверстие сочинить :(.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему нельзя сделать планировщик, который просто по кругу перебирает все задачи ?

1 mS одна поработала, потом 1 mS другая и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему нельзя? Можно. Называется карусель.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Логично предположить, что время выделяемое на них будт прямо пропорционально приоритету.

Тогда уж скорее "обратно пропорционально приоритету". Т.е. чем приоритетнее задача, т.е. чем "выше" у неё способность к вытеснению (чем больше задач она может вытеснить в силу своего высокого приоритета), тем, по-хорошему, меньше времени процессора она должна бы занимать - а то остальным меньше достанется.

 

В общем, возлагать на планировщик RTOS распределение времени - плохая идея. И на самом деле всё намного проще, чем вам представляется. Приоритеты задач зависят от их срочности. Например, если какая-то задача связана с аппаратурой - скажем, приходят по UART данные, и аппаратура приёмника не будет ждать, она принимает данные с определённым темпом, поэтому программа должна успевать забирать данные из регистра приёмник. Обычно, это делается в прерывании, но когда накопился пакет, надо его передать основной программе, чтобы буфер приёмника был готов к приёму следующего пакета, а времени "на всё/про всё" - интервал приёма очередного символа, и вот за это время надо успевать отреагировать и передать пакет на обработку. Если процессор будет занят чем-то другим длительное время, то будет потеря данных. Поэтому нужно иметь механизм прервать менее срочные дела и отреагировать на событие, которое во избежание потерь должно быть обработано без проволочек.

 

Приведённый пример с UART'ом в некотором смысле умозрительный - проблему можно обойти, например, используя кольцевой буфер или пул буферов, но принцип не меняется. RTOS с вытесняющим планировщиком позволяет построить систему, работающую на обработках событий (event-driven), и это очень удобно и эффективно с точки зрения как большей детерминированности времени реакции на событие, так и расходования процессорного времени. И никто, кроме разработчика, не знает, как распределить работу. Только разработчик, основываясь своём замысле, может правильно построить программу - классифицировать все события по срочности и ресурсоёмкости их обработки, и в соответствии с этим уже и определить, сколько ему нужно задач и какие у тех должны быть приоритеты. При этом важно, чтобы в конечном итоге процессор успел их все обработать. Если данный процессор этого не обеспечивает, значит данный процессор не годится для данной задачи. Как правило, процессор выбирается с запасом, и современные МК в подавляющем большинстве случаев позволяют обеспечить это без проблем.

 

А почему нельзя сделать планировщик, который просто по кругу перебирает все задачи ?

1 mS одна поработала, потом 1 mS другая и т.д.

Можно (как уже сказали, это чистая "карусель" - round-robin scheduling). Но зачем? Например, одна задача быстро делает свои дела и ей просто нечего больше делать - логично отдать управление ядру RTOS, чтобы оно передало его другой задаче, которой есть чем заняться. Если все задачи в данный момент отработали задания и отдали управление ядру, то ядро может просто перевести процессор в IDLE (один из простых вариантов - ядро передаёт управление системной задаче IDLE, которая вызывает инструкцию процессора, переводящую аппаратуру проца в один из режимов пониженного энергопотребления), таким образом, если процессору нечего делать, то он и энергии потребляет меньше, что может быть актуально в портативных приложениях.

 

Карусельное планирование теоретически может быть полезно для перераспределения процессорного времен между фоновыми (т.е. низкоприоритетными и работающими длительное время - например, какие-то фоновые вычисления) задачами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

http://kit-e.ru/articles/micro/2011_2_96.php

...

 

Цитирую Андрея Курница

http://easyelectronics.ru/img/ARM_kurs/FreeRTOS/Kurniz.pdf

Рассмотрим преимущества, которые получил бы наш гипотетический программист, заложив в основу программного обеспечения своего устройства ОСРВ:

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

Алгоритм работы планировщика в ОС общего назначения заключается в предоставлении каждой задаче

процессорного времени в равной пропорции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Цитирую Андрея Курница

http://easyelectronics.ru/img/ARM_kurs/FreeRTOS/Kurniz.pdf

 

Алгоритм работы планировщика в ОС общего назначения заключается в предоставлении каждой задаче

процессорного времени в равной пропорции.

 

Советую выяснить у Курница что он хотел сказать.

Задача планировщика не дать время как интервал, а задать время начала исполнения как точку на оси времени.

Вы наверно не так поняли термин время у Курница.

А может Курниц сам не понял. :biggrin:

 

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

В теории RTOS все realtime задачи должны быть выполнены между двумя тиками.

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

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

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А может Курниц сам не понял. :biggrin:

Посмотрел статью. Фрагментарно все правильно, а обобщения типа отцитированного - хоть стой, хоть падай.

100% не понимал, что надергал и напереводил :(.

А Автор темы не понял даже того, что сам отцитировал:

Алгоритм работы планировщика в ОС общего назначения заключается в предоставлении каждой задаче

процессорного времени в равной пропорции.

OS общего назначения а-ля виндовс и иже с ним, никакого отношения встраиваемым RTOS не имеют. Читаем еще раз:

Что то мне сдается, что Вы пытаетесь что-то через анальое отверстие сочинить sad.gif.

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

Но даже десктопные системы НЕ ДЕЛЯТ время в "равной пропорции" - тому-же, например, Word, как отдельной задаче, ни нафиг вообще не нужно никакое время, пока кнопку с буквой не нажали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...