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

 
 
5 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Подскажите пожалуйста, про многозадачность.
Сергей Борщ
сообщение Oct 18 2006, 11:56
Сообщение #16


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(_Алекс @ Oct 18 2006, 14:18) *
Есть функции, есть планировщик задач. Функции зациклены. Выход из функции невозможен. Функция сама передает процессорное время по команде планировщику, планировщик отдает процессорное время другой функции по приоритету. Возникает вопрос как (для AVR IAR) вернутся в прерванную функцию по адресу где функция отдала управление и как в IAR сохранить рабочие регистры и какие нужно сохранять.
www.scmRTOS.narod.ru - очень подробное описание как это все делать.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
µµC
сообщение Oct 18 2006, 12:12
Сообщение #17


Участник
*

Группа: Новичок
Сообщений: 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 раз меньше.
Go to the top of the page
 
+Quote Post
gormih
сообщение Oct 18 2006, 13:09
Сообщение #18


nofb
***

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



Скромная попытка объяснить необъятное двумя словами :
biggrin.gif
Паралельность задач с максимальной производительностью можно обеспечить только путем применения буферных глобальных переменных.
К примеру в начале программы на си объявляются переменные, общие для всех процессов в системе, а потом по прерываниям скажем таймров (если у каждой задачи обределенное время выполнения) или прерываний устройств внутри во вне контроллера осуществляется изменение чтение этих данных, изменения флагов каких то событий итд...
Это и есть многозадачность на одноядерном процессоре.

Если не хочется ждать окончания какого либо процесса - можно вообще поступить таким образом (в свое время реализовал это на z80 ПК Zx-Spectrum):

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

Сообщение отредактировал Михаил Горюнов - Oct 18 2006, 13:23


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
defunct
сообщение Oct 18 2006, 13:48
Сообщение #19


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(µµC @ Oct 18 2006, 15:12) *
Получается 10*3 байт на задачу, только на "системные" издержки? Как-то многовато. Для невытесняющей оси нужно в 4 - 5 раз меньше.


10 байт на задачу, 3 разных очереди. Вот такая вот структурка:

Код
typedef struct _TTask
{
  U32  ExecuteWithin;  // время в тиках ядра
  U32  ReloadInterval; // интервал перезапуска
  _task_function *Task;
} TTask, *PTask;
Go to the top of the page
 
+Quote Post
Alexander Storm
сообщение Oct 18 2006, 19:24
Сообщение #20


Участник
*

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



Попробуй всеж чуток с операционками разобраться, пока не с вытесняющими, кооперирующими, очень простая jacos. Если пишешь только на С, все очень просто, толково описана и примеры есть. Фриварная, с исходниками, автор баги быстро исправляет.
Как для меня оказалась проще чем я ожидал, это первая с которой столкнулся, может есть и лучше, не спорю, но реально простая и удобная, ресурсы минимально жрет, только когда на асеме вставки лупишь - лучше в дебагере детально просмотреть АСМ объекта, как всегда для сюхи smile.gif
Go to the top of the page
 
+Quote Post
_Алекс
сообщение Oct 19 2006, 08:06
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377



Почитал по операционнкам, попроще получается кооперативная с приоритетным планировщиком, но: есть три задачи с приоритетом 1,2,3. Приоритеты присваиваются при создании задачи. Каждая задача сама отдает процессорное время. Планировщик должен запустить следующую задачу готовую к выполнению с наивысшим приоритетом. Тогда задача с 1 приоритетом вообще никогда не получит управление, ведь у ней самый маленький приоритет, когда есть задача 2, 3. Каким образом планировщик с приоритетным планированием запускает задачу с наименьшим приоритетом или вообще до нее очередь никогда не доходит.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 19 2006, 09:04
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Осень. Пора, как все, лететь к RTOS. smile.gif

Но я пока делаю по старинке.

Самые быстродействующие или просто привязанные к времени процессы распихиваю в прерывания по таймеру (причем несколько - от 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? smile.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Hz!
сообщение Oct 19 2006, 09:20
Сообщение #23


Участник
*

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



Цитата(_Алекс @ Oct 19 2006, 11:06) *
Почитал по операционнкам, попроще получается кооперативная с приоритетным планировщиком, но: есть три задачи с приоритетом 1,2,3. Приоритеты присваиваются при создании задачи. Каждая задача сама отдает процессорное время. Планировщик должен запустить следующую задачу готовую к выполнению с наивысшим приоритетом. Тогда задача с 1 приоритетом вообще никогда не получит управление, ведь у ней самый маленький приоритет, когда есть задача 2, 3. Каким образом планировщик с приоритетным планированием запускает задачу с наименьшим приоритетом или вообще до нее очередь никогда не доходит.

до нее дохдит очередь, когда задачи с приоритетами 2 и 3 неактивны.
А вот случится ли это (если должно) - вопрос к разработчику wink.gif
Go to the top of the page
 
+Quote Post
_Алекс
сообщение Oct 19 2006, 09:26
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377



Цитата(Dog Pawlowa @ Oct 19 2006, 12:04) *
Осень. Пора, как все, лететь к RTOS. smile.gif

Но я пока делаю по старинке.

Самые быстродействующие или просто привязанные к времени процессы распихиваю в прерывания по таймеру (причем несколько - от 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? smile.gif


Поясните, пожалуйста,
У вас функции вызываются из цикла по индексу, можете пояснить механизм. Функция вызвана, как из нее происходит выход, когда выполнится весь код в функции или принудительно, механизм сообщений, если, например одна функция ждет события от другой



Цитата(Hz! @ Oct 19 2006, 12:20) *
Цитата(_Алекс @ Oct 19 2006, 11:06) *

Почитал по операционнкам, попроще получается кооперативная с приоритетным планировщиком, но: есть три задачи с приоритетом 1,2,3. Приоритеты присваиваются при создании задачи. Каждая задача сама отдает процессорное время. Планировщик должен запустить следующую задачу готовую к выполнению с наивысшим приоритетом. Тогда задача с 1 приоритетом вообще никогда не получит управление, ведь у ней самый маленький приоритет, когда есть задача 2, 3. Каким образом планировщик с приоритетным планированием запускает задачу с наименьшим приоритетом или вообще до нее очередь никогда не доходит.

до нее дохдит очередь, когда задачи с приоритетами 2 и 3 неактивны.
А вот случится ли это (если должно) - вопрос к разработчику ;)


Ясно, а кто задачи с приоритетами 2 и 3 делает активными - планировщик? по событиям? или планировщик, видя что все задачи не октивны, сам запускает с наивысшим приоритетом
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 19 2006, 09:48
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(_Алекс @ Oct 19 2006, 12:26) *
Поясните, пожалуйста,
У вас функции вызываются из цикла по индексу, можете пояснить механизм. Функция вызвана, как из нее происходит выход, когда выполнится весь код в функции или принудительно, механизм сообщений, если, например одна функция ждет события от другой

1. Вызов по индексу - организуется массив функций и вызывается функция из этого массива. Все просто и наглядно.

2) Раз я говорю, что RTOS не использую, значит функция завершается так же естественно, как пиво в бутылке smile.gif

3) А механизм передачи сообщений прост.
- Каждый процесс имеет status. Это уже достаточно информативно для того, чтобы другие процессы могли узнать, что делается в этом. Например, состояние ошибки. Жду, курю бамбук, жду событий.
- Каждый процесс генерирует события при вызове функции GetProcessNEvent().
типа if (beer_level==0) return(evBeerOver);

Это событие обрабатывается примитивно просто :
switch (event)
{ case evBeerOver: OpenBottleWithVodka();
case evVodkaOver: GoToShop();
}


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Hz!
сообщение Oct 19 2006, 10:05
Сообщение #26


Участник
*

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



Цитата
Ясно, а кто задачи с приоритетами 2 и 3 делает активными - планировщик? по событиям? или планировщик, видя что все задачи не октивны, сам запускает с наивысшим приоритетом

Может и событие и приложение.
Это происходит при помощи различных сервисов, таких как семафоры сообщения и т.д.
Найдите мануал на какую-ть ось (я с JjacOS разбирался), там все подробно должно быть расписано.
Go to the top of the page
 
+Quote Post
osnwt
сообщение Oct 19 2006, 14:09
Сообщение #27


Частый гость
**

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



Цитата(Alexander Storm @ Oct 18 2006, 22:24) *
Попробуй всеж чуток с операционками разобраться, пока не с вытесняющими, кооперирующими, очень простая jacos. Если пишешь только на С, все очень просто, толково описана и примеры есть. Фриварная, с исходниками, автор баги быстро исправляет.

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

А что, исходники jacos уже появились? До сих пор, насколько я знаю, было множество библиотек под разные процессоры и варианты компиляции?

Да и насчет ответов автора - да, год-два назад так и было, подтверждаю. Но сейчас человек, который тоже использовал jacos, сообщил, что автор на его письма отвечать перестал. И разработки переехали под scmRTOS, которая реально имеет открытый исходный текст, в т.ч. для коммерческого использования.
Go to the top of the page
 
+Quote Post
AVR
сообщение Oct 19 2006, 16:38
Сообщение #28


фанат 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, вот только что известно на счет багов?


--------------------
Go to the top of the page
 
+Quote Post
Alex B._
сообщение Oct 19 2006, 17:50
Сообщение #29


Знающий
****

Группа: Свой
Сообщений: 943
Регистрация: 6-07-04
Из: Санкт-Петербург
Пользователь №: 274



Автор jacOS высылает исходники по запросу, напишите ему письмо, должен ответить.
Go to the top of the page
 
+Quote Post
_Алекс
сообщение Oct 20 2006, 05:52
Сообщение #30


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377



Посмотрел ОС scmRTOS, jacOS, Salvo. многозадачность нужна в AVR а все операционки со своей поддержкой много МК самых разных, поддержка разных компиляторов, условная компиляция, комментарии в исходнике не поймешь, да и исходник сам не найти, компоновка в среде, закрытые подключаемые библиотеки… Можно конечно по примерам, по рекомендациям интеграции в определенную среду разработки но так до конца не поняв внутреннею работу ОС, разбираться, что где не работает, почему когда работает когда нет. Понравилась Salvo но где исходник! В моем проекте задач 6. Причем некоторые требуют жесткой временной привязки и активно используют таймеры, порты ввода вывода, ШИМ, SPI, USART. Остальные задачи, включить выключить, считать дискретный вход. Мне кажется, нужен хороший кооперативный приоритетный планировщик как, например в Salvo (вот бы его исходник) ни какой глобализации объять не объятное, только то что нужно. Осталось написать кооперативный планировщик, скажем задач 10 максимум. Может есть у кого исходник.
Прикрепленные файлы
Прикрепленный файл  salvo_user_manual_ch4_russian.pdf ( 329.63 килобайт ) Кол-во скачиваний: 177
 
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 07:39
Рейтинг@Mail.ru


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