|
Подскажите пожалуйста, про многозадачность. |
|
|
|
Oct 18 2006, 07:29
|
Местный
  
Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377

|
Есть несколько задач (программ) которые должны выполнятся с минимальным временем, можно организовать как линейный список функций, которые последовательно вызываются из главной функции main() при условии что время выполнения каждой функции ограничено т.е. внутри функции нет кода который задерживает выполнения (ожидает чего либо). Например одна функция обрабатывает принятый массив с USARTа. другая расшифровывает принятую команду и выполняет ее, подготавливает ответ к отправке (квитирование). Еще пару функций, которые что-то делают (обслуживают клавиатуру, исполнительные устройства). Получается все запутанно, если делать все функции в виде конечных автоматов с минимальным временем работы каждой. Хорошо было бы, если каждая функция выполнялась в виде задачи, ожидает, данные с параллельного потока пускай ждет, получила что хотела, выполняет. Есть задержка в функции скажем, на 20 секунд, пускай ждет, в это время выполняются другие функции. С операционными системами как-то все сложно, может планировщик задач да и все. Какие есть решение не сложные? Механизм взаимодействия функций друг с другом.
|
|
|
|
|
 |
Ответов
(15 - 29)
|
Oct 18 2006, 12:12
|
Участник

Группа: Новичок
Сообщений: 44
Регистрация: 2-05-06
Пользователь №: 16 710

|
Цитата(GinRider @ Oct 18 2006, 15:29)  Программа должна выглядеть так:
do{ ReadKeys(); UpdateDisplay(); }while(true);
Всё остальное - дело флагов, указателей и счётчиков. Главное - в ассемблерном листинге это выглядит точно так же. Программа _может_ так выглядеть, но вовсе не должна. Суперлуп наиболее примитивный вариант реализации многозадачности, что данный код и демонстрирует - 100% ресурсов занято там, где хватило бы долей %. Цитата(defunct @ Oct 18 2006, 15:32)  От флагов такой подход полностью не избавляет, но все-таки минимизирует чуть-чуть, и экономит ПП. Для сравнения этот планировщик отнимает всего ~500 байт ПП и может занимать меньше, ну а кол-во занимаемого RAM'а регулируется взависимости от потребностей проекта. (по 16 задач каждого типа займет 10*16*3 байт ОЗУ). Получается 10*3 байт на задачу, только на "системные" издержки? Как-то многовато. Для невытесняющей оси нужно в 4 - 5 раз меньше.
|
|
|
|
|
Oct 18 2006, 13:09
|

nofb
  
Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218

|
Скромная попытка объяснить необъятное двумя словами : Паралельность задач с максимальной производительностью можно обеспечить только путем применения буферных глобальных переменных. К примеру в начале программы на си объявляются переменные, общие для всех процессов в системе, а потом по прерываниям скажем таймров (если у каждой задачи обределенное время выполнения) или прерываний устройств внутри во вне контроллера осуществляется изменение чтение этих данных, изменения флагов каких то событий итд... Это и есть многозадачность на одноядерном процессоре. Если не хочется ждать окончания какого либо процесса - можно вообще поступить таким образом (в свое время реализовал это на z80 ПК Zx-Spectrum): Через равные промежутки времени происходит прерывание таймера, обработчик прерывания принимает решение в зависимости от приритета процесса, времени которое он должен выполнятся решение о передачи процессорного времени тому или иному процессу. При этом каждый процесс имеет свои отдельные области стека, свои рабочие процессорные регистры. Рабочие регистры процесса и текущее значение стека сохраняются в определенной области памяти, специально выделеной для этого процесса. Таким образом обеспечивается псевдопаралельное выполнение задач. Чем чаще происходит прерывание таймера - тем точнее распределяется время между процессами, но тем больше процессорного времени занимает обработчик прерывания таймера.
Сообщение отредактировал Михаил Горюнов - Oct 18 2006, 13:23
--------------------
Это не то что вы подумали ...
|
|
|
|
|
Oct 18 2006, 19:24
|

Участник

Группа: Новичок
Сообщений: 25
Регистрация: 17-09-06
Из: Kyiv
Пользователь №: 20 469

|
Попробуй всеж чуток с операционками разобраться, пока не с вытесняющими, кооперирующими, очень простая jacos. Если пишешь только на С, все очень просто, толково описана и примеры есть. Фриварная, с исходниками, автор баги быстро исправляет. Как для меня оказалась проще чем я ожидал, это первая с которой столкнулся, может есть и лучше, не спорю, но реально простая и удобная, ресурсы минимально жрет, только когда на асеме вставки лупишь - лучше в дебагере детально просмотреть АСМ объекта, как всегда для сюхи
|
|
|
|
|
Oct 19 2006, 09:04
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Осень. Пора, как все, лететь к RTOS. Но я пока делаю по старинке. Самые быстродействующие или просто привязанные к времени процессы распихиваю в прерывания по таймеру (причем несколько - от 500 мкс до 1 с). Прочие процессы - в вызовы функций в цикле по индексу состояния процесса. for(;;) { //process 1 event=GetKeyEvent(); if (!event) event=GetTimerEvent(); if (!event) event=GetExternalKeyboardEvent(); process1[status1](); //process 2 event=GetIrdaEvent(); if (!event) event=GetModemEvent(); process2[status2](); } Особенность моих устройств - помехоустойчивость, процессы должны выполняться даже после сброса процессора и такая структура это обеспечивает. Есть RTOS, нет ее, на этапе начала проектирования ресурсы контроллера и частота появления внешних событий должны быть просчитаны. А если все просчитано и понятно, зачем RTOS?
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Oct 19 2006, 09:20
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 5-05-06
Из: Минск
Пользователь №: 16 792

|
Цитата(_Алекс @ Oct 19 2006, 11:06)  Почитал по операционнкам, попроще получается кооперативная с приоритетным планировщиком, но: есть три задачи с приоритетом 1,2,3. Приоритеты присваиваются при создании задачи. Каждая задача сама отдает процессорное время. Планировщик должен запустить следующую задачу готовую к выполнению с наивысшим приоритетом. Тогда задача с 1 приоритетом вообще никогда не получит управление, ведь у ней самый маленький приоритет, когда есть задача 2, 3. Каким образом планировщик с приоритетным планированием запускает задачу с наименьшим приоритетом или вообще до нее очередь никогда не доходит. до нее дохдит очередь, когда задачи с приоритетами 2 и 3 неактивны. А вот случится ли это (если должно) - вопрос к разработчику
|
|
|
|
|
Oct 19 2006, 09:26
|
Местный
  
Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377

|
Цитата(Dog Pawlowa @ Oct 19 2006, 12:04)  Осень. Пора, как все, лететь к RTOS. Но я пока делаю по старинке. Самые быстродействующие или просто привязанные к времени процессы распихиваю в прерывания по таймеру (причем несколько - от 500 мкс до 1 с). Прочие процессы - в вызовы функций в цикле по индексу состояния процесса. for(;;) { //process 1 event=GetKeyEvent(); if (!event) event=GetTimerEvent(); if (!event) event=GetExternalKeyboardEvent(); process1[status1](); //process 2 event=GetIrdaEvent(); if (!event) event=GetModemEvent(); process2[status2](); } Особенность моих устройств - помехоустойчивость, процессы должны выполняться даже после сброса процессора и такая структура это обеспечивает. Есть RTOS, нет ее, на этапе начала проектирования ресурсы контроллера и частота появления внешних событий должны быть просчитаны. А если все просчитано и понятно, зачем RTOS?  Поясните, пожалуйста, У вас функции вызываются из цикла по индексу, можете пояснить механизм. Функция вызвана, как из нее происходит выход, когда выполнится весь код в функции или принудительно, механизм сообщений, если, например одна функция ждет события от другой Цитата(Hz! @ Oct 19 2006, 12:20)  Цитата(_Алекс @ Oct 19 2006, 11:06)  Почитал по операционнкам, попроще получается кооперативная с приоритетным планировщиком, но: есть три задачи с приоритетом 1,2,3. Приоритеты присваиваются при создании задачи. Каждая задача сама отдает процессорное время. Планировщик должен запустить следующую задачу готовую к выполнению с наивысшим приоритетом. Тогда задача с 1 приоритетом вообще никогда не получит управление, ведь у ней самый маленький приоритет, когда есть задача 2, 3. Каким образом планировщик с приоритетным планированием запускает задачу с наименьшим приоритетом или вообще до нее очередь никогда не доходит.
до нее дохдит очередь, когда задачи с приоритетами 2 и 3 неактивны. А вот случится ли это (если должно) - вопрос к разработчику ;) Ясно, а кто задачи с приоритетами 2 и 3 делает активными - планировщик? по событиям? или планировщик, видя что все задачи не октивны, сам запускает с наивысшим приоритетом
|
|
|
|
|
Oct 19 2006, 09:48
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(_Алекс @ Oct 19 2006, 12:26)  Поясните, пожалуйста, У вас функции вызываются из цикла по индексу, можете пояснить механизм. Функция вызвана, как из нее происходит выход, когда выполнится весь код в функции или принудительно, механизм сообщений, если, например одна функция ждет события от другой 1. Вызов по индексу - организуется массив функций и вызывается функция из этого массива. Все просто и наглядно. 2) Раз я говорю, что RTOS не использую, значит функция завершается так же естественно, как пиво в бутылке 3) А механизм передачи сообщений прост. - Каждый процесс имеет status. Это уже достаточно информативно для того, чтобы другие процессы могли узнать, что делается в этом. Например, состояние ошибки. Жду, курю бамбук, жду событий. - Каждый процесс генерирует события при вызове функции GetProcessNEvent(). типа if (beer_level==0) return(evBeerOver); Это событие обрабатывается примитивно просто : switch (event) { case evBeerOver: OpenBottleWithVodka(); case evVodkaOver: GoToShop(); }
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Oct 19 2006, 10:05
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 5-05-06
Из: Минск
Пользователь №: 16 792

|
Цитата Ясно, а кто задачи с приоритетами 2 и 3 делает активными - планировщик? по событиям? или планировщик, видя что все задачи не октивны, сам запускает с наивысшим приоритетом Может и событие и приложение. Это происходит при помощи различных сервисов, таких как семафоры сообщения и т.д. Найдите мануал на какую-ть ось (я с JjacOS разбирался), там все подробно должно быть расписано.
|
|
|
|
|
Oct 19 2006, 14:09
|

Частый гость
 
Группа: Свой
Сообщений: 175
Регистрация: 26-01-06
Из: Sevastopol
Пользователь №: 13 664

|
Цитата(Alexander Storm @ Oct 18 2006, 22:24)  Попробуй всеж чуток с операционками разобраться, пока не с вытесняющими, кооперирующими, очень простая jacos. Если пишешь только на С, все очень просто, толково описана и примеры есть. Фриварная, с исходниками, автор баги быстро исправляет. Jacos пробовал - реально полезная вещь. Сейчас экспериментирую с scmRTOS - тоже нравится, но это уже с вытесняющей многозадачностью. А что, исходники jacos уже появились? До сих пор, насколько я знаю, было множество библиотек под разные процессоры и варианты компиляции? Да и насчет ответов автора - да, год-два назад так и было, подтверждаю. Но сейчас человек, который тоже использовал jacos, сообщил, что автор на его письма отвечать перестал. И разработки переехали под scmRTOS, которая реально имеет открытый исходный текст, в т.ч. для коммерческого использования.
|
|
|
|
|
Oct 19 2006, 16:38
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(osnwt @ Oct 19 2006, 18:09)  Цитата(Alexander Storm @ Oct 18 2006, 22:24)  Попробуй всеж чуток с операционками разобраться, пока не с вытесняющими, кооперирующими, очень простая jacos. Если пишешь только на С, все очень просто, толково описана и примеры есть. Фриварная, с исходниками, автор баги быстро исправляет.
А что, исходники jacos уже появились? До сих пор, насколько я знаю, было множество библиотек под разные процессоры и варианты компиляции? +1 Посмотрел на сайте автора, так там нет никаких исходников... Можно ссылочку? ЗЫ Страшно нравится jacos, вот только что известно на счет багов?
--------------------
|
|
|
|
|
Oct 20 2006, 05:52
|
Местный
  
Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377

|
Посмотрел ОС scmRTOS, jacOS, Salvo. многозадачность нужна в AVR а все операционки со своей поддержкой много МК самых разных, поддержка разных компиляторов, условная компиляция, комментарии в исходнике не поймешь, да и исходник сам не найти, компоновка в среде, закрытые подключаемые библиотеки… Можно конечно по примерам, по рекомендациям интеграции в определенную среду разработки но так до конца не поняв внутреннею работу ОС, разбираться, что где не работает, почему когда работает когда нет. Понравилась Salvo но где исходник! В моем проекте задач 6. Причем некоторые требуют жесткой временной привязки и активно используют таймеры, порты ввода вывода, ШИМ, SPI, USART. Остальные задачи, включить выключить, считать дискретный вход. Мне кажется, нужен хороший кооперативный приоритетный планировщик как, например в Salvo (вот бы его исходник) ни какой глобализации объять не объятное, только то что нужно. Осталось написать кооперативный планировщик, скажем задач 10 максимум. Может есть у кого исходник.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|