|
|
  |
Подскажите пожалуйста, про многозадачность. |
|
|
|
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 максимум. Может есть у кого исходник.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|