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

 
 
> вытясняющая многозадачность, чистый С без ОС
Zelepuk
сообщение Nov 29 2011, 08:56
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Хочется найти хорошо расписанный пример написания программы с вытясняющим планировщиком без применения какой-либо ОС на чистом С. Нашёл отличное описание кооперативного планировщика, но хочется разобраться с вытясняющим.
Подскажите, кто знает.
Go to the top of the page
 
+Quote Post
4 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 45)
dxp
сообщение Nov 29 2011, 12:48
Сообщение #2


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Zelepuk @ Nov 29 2011, 15:56) *
Хочется найти хорошо расписанный пример написания программы с вытясняющим планировщиком без применения какой-либо ОС на чистом С. Нашёл отличное описание кооперативного планировщика, но хочется разобраться с вытясняющим.
Подскажите, кто знает.

А чем, по-вашему, принципиально отличается вытесняющий планировщик от ОС? Точнее, в каком окружении он живёт, и как можно назвать совокупность этого окружения и планировщика?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Nov 29 2011, 13:10
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(dxp @ Nov 29 2011, 16:48) *
А чем, по-вашему, принципиально отличается вытесняющий планировщик от ОС? Точнее, в каком окружении он живёт, и как можно назвать совокупность этого окружения и планировщика?

для меня к примеру тем что наверняка существуют программы (standalone) которые работают по такому принципу*(http://chipenable.ru/index.php/programming-c/110-scheduler.html), и есть ОСи, предоставляющие сервисы и имеющие интерфейсы для приложений.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 29 2011, 13:47
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Автомат на прерываниях с разрешением вложенности.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Nov 29 2011, 13:55
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(MrYuran @ Nov 29 2011, 17:47) *
Автомат на прерываниях с разрешением вложенности.

спасибо, можно немного подробнее?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 29 2011, 14:22
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Zelepuk @ Nov 29 2011, 14:56) *
Хочется найти хорошо расписанный пример написания программы с вытясняющим планировщиком без применения какой-либо ОС на чистом С.

Если без какой-либо ОС, то это будет банальная каруселька. (Статья в англицкой википедии). То есть несколько потоков (задач) будут работать по очереди.
Да и то, для общения задач между собой потребуются некие функции, которые уже можно будет назвать зачатками ОСи. Добавьте ещё механизмы синхронизации, и у вас уже нормальная ОС. Так что, ИМХО, вытесняющий планировщик без ОС - это сферический конь в вакууме.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Nov 29 2011, 15:26
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



У меня работает сферический конь в вакууме.

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

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

Но полностью на си написать такое - врядли.
Сам переключатель задач - на ассемблере - строк 50, думаю.
А вот планировщик - наверное все 100 (Это вместе с утилитами, типа добавить процесс, убить процесс и прочая).



--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Nov 29 2011, 17:40
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



А вообще, когда становится понятно, что нужно городить огород из планировщиков, семафоров, мьютекcов...(вот сколько красивых слов по теме нашёл)?

Возьмём пример:
система должна принимать данные от АЦП, обробатывать их блоками, передавать по UART (по 3-м сразу и независимо), весли лог работы на SD-карту, работать с часами реального времени....
вобщем пример класический)

Всё работает на "суперлупе" по прерываниям и циклическим опросам флагов.
Когда (и какая) может возникнуть ситуация, что нужно будет задуматься о применении вытесняющией многозадачности (без ОС и пусть такая программа сама по себе нечто вроде ОС)?
Можно подумать, что если всё работает и так, то я себе выдумываю проблемы, но эти вопросы мне не дают покоя)

Сообщение отредактировал Zelepuk - Nov 29 2011, 17:58
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 29 2011, 17:55
Сообщение #9


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(DpInRock @ Nov 29 2011, 21:26) *
У меня работает сферический конь в вакууме.
...
У меня работает вот такой планировщик, который строго следит за очередностью А процессы стараются работаь по кооперативному принципу - если делать нечего - отдают остаток кванта следующей задаче.
...
А вот планировщик - наверное все 100 (Это вместе с утилитами, типа добавить процесс, убить процесс и прочая).

Дык, уже не в вакууме, "с утилитами" sm.gif Да и процессы работают не просто так, а "отдают остаток кванта следующей задаче". Если ещё копнуть, то наверняка и средства межпроцессного взаимодействия обнаружатся.

Цитата(Zelepuk @ Nov 29 2011, 23:40) *
А вообще, когда становится понятно, что нужно городить огород из планировщиков, семафоров, мьютеков...(вот сколько красивых слов по теме нашёл)?

Это проще попробовать. Желательно не на навороченном проекте, а на небольшом, несложном. Если понравится (почти наверняка), то потом будете применять ОС вне зависимости от задачиsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Nov 29 2011, 17:59
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(AHTOXA @ Nov 29 2011, 21:55) *
Дык, уже не в вакууме, "с утилитами" sm.gif Да и процессы работают не просто так, а "отдают остаток кванта следующей задаче". Если ещё копнуть, то наверняка и средства межпроцессного взаимодействия обнаружатся.


Это проще попробовать. Желательно не на навороченном проекте, а на небольшом, несложном. Если понравится (почти наверняка), то потом будете применять ОС вне зависимости от задачиsm.gif


а если я вижу программу для ОС, и там тоже переключение потоков организовано, получается ОС в ОС?)
Go to the top of the page
 
+Quote Post
toweroff
сообщение Nov 29 2011, 18:18
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Zelepuk @ Nov 29 2011, 21:59) *
а если я вижу программу для ОС, и там тоже переключение потоков организовано, получается ОС в ОС?)

возможно, это неправильное применение ОС? Хотя, я имею ввиду именно простейшие, не Lin
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Nov 29 2011, 18:34
Сообщение #12


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



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

А по поводу отдать квант времени - это всего лишь одна ассемблерная команда SWI. Т.е. переключает контекст вместо (и наравне) с таймером. А уж если таймер вмешивается после SWI, то он просто не переключает на новую задачу. Ибо знает, что за мгновенье до этого это сделано другим способом.

Сам планировщик, который работает в прерывании (Сишный) занимает примерно 4-5 операторов Си.

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

http://martin.hinner.info/ARM-Microcontrol...er-HOWTO-7.html

Вот я с этой статьи начинал. Чутка добавил, чутка убавил.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 29 2011, 18:43
Сообщение #13


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Zelepuk @ Nov 29 2011, 23:59) *
а если я вижу программу для ОС, и там тоже переключение потоков организовано, получается ОС в ОС?)

Переключение потоков-то организовано не само по себе, а средствами ОС, так же? Тогда это нормально, просто программа пользуется предоставленными средствами.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 29 2011, 20:15
Сообщение #14


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Посмотрите AVR учебный курс на http://easyelectronics.ru/
Кажется какой-то простенький планировщик там был(видел краем глаза, деталей не помню).


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 29 2011, 20:23
Сообщение #15


Гуру
******

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



QUOTE (DpInRock @ Nov 29 2011, 18:26) *
У меня работает сферический конь в вакууме.
....
У меня работает вот такой планировщик, который строго следит за очередностью А процессы стараются работаь по кооперативному принципу - если делать нечего - отдают остаток кванта следующей задаче.
И где тут вытесняющая многозадачность?


--------------------
На любой вопрос даю любой ответ
"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
_Pasha
сообщение Nov 29 2011, 22:18
Сообщение #16


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(DpInRock @ Nov 29 2011, 19:26) *
Но полностью на си написать такое - врядли.

А как же setjmp/longjmp ?
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Nov 30 2011, 02:23
Сообщение #17


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Цитата
И где тут вытесняющая многозадачность?

Переключатель задач по таймеру прерывает процесс. Участие в этом действии со стороны процесса - не требуется.
Это определение вытесняющей многозадачности.

Хотя процесс и имеет возможность прервать сам себя... И это не противоречит вытесняющей многозадачности.

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

---
Что такое setjump узнал только сейчас. (Я Си специально не изучал никогда).
Может и можно. Но по-моему быстрее скопипастить два десятка ассемблерных строк переключателя, чем разбираться в том, что именно на самом деле делают упоминаемые функции Си.
--
В том плане, что к примеру для АРМ там надо ж сохранять контекст в режиме работы процесса...Т.е. setjump должен из режима прерывания сохранить контекст другого режима (режима задачи).
Что-то сомневаюсь, что он это делает. Ибо такая функция будучи универсальной должна как-то разбираться в конкретных режима процессора... Что все сильно усложняет...
А меня, лично, сложное всегда сильно пугает.

Сообщение отредактировал DpInRock - Nov 30 2011, 02:54


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Nov 30 2011, 04:27
Сообщение #18


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



система должна принимать данные от АЦП, обробатывать их блоками, передавать по UART (по 3-м сразу и независимо), весли лог работы на SD-карту, работать с часами реального времени....
вобщем пример класический)

Всё работает на "суперлупе" по прерываниям и циклическим опросам флагов.
Когда (и какая) может возникнуть ситуация, что нужно будет задуматься о применении вытесняющией многозадачности (без ОС и пусть такая программа сама по себе нечто вроде ОС)?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 30 2011, 04:42
Сообщение #19


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Zelepuk @ Nov 29 2011, 17:55) *
спасибо, можно немного подробнее?

Каждый обработчик прерывания - независимый процесс, который обрабатывается по некоему событию в соответствии с установленным приоритетом, изменяемым или жестко заданным, в зависимости от аппаратной реализации.
Переключение контекста выполняется автоматически средствами языка си.
Преимущества - минимализм, отсутствие поллингов и ненужных циклов благотворно сказывается на потреблении и ЭМС. Общий стек на все задачи.
Недостатки - жесткая привязка к аппаратной платформе, необходимость тщательного планирования и аккуратной реализации, неочевидность.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Nov 30 2011, 05:25
Сообщение #20


Гуру
******

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



Цитата(MrYuran @ Nov 30 2011, 08:42) *
Преимущества - минимализм, отсутствие поллингов и ненужных циклов благотворно сказывается на потреблении и ЭМС.

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

Вполне тянет на минимум кандидатскую диссертацию. Ваши интересы не затрону?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Nov 30 2011, 07:53
Сообщение #21


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Zelepuk @ Nov 29 2011, 21:40) *
А вообще, когда становится понятно, что нужно городить огород из планировщиков, семафоров, мьютекcов...(вот сколько красивых слов по теме нашёл)?...


буду краток:
ось, планировщики (и т.д.) нафик не нужно в МК. Это Вы ребята подсознательно хотите как у "больших" типа. зачем тягаться в той весовой категории где МК вообще все плюсы сольёт. Чем будет отличаться то? тем что на борту у него есть аппаратная реализация то, что у "больших" на матери? всё?

по мне: единственный плюс разработки с юзаньем оси - командная разработка (типа просче дробить, тестировать, изолировать и т.п.), и скорость в счёт качества(подсобрать всякую тучу кривых библиотек и сапотить энным кол-вом работников). всё.

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

удачи вам
(круглый)
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Nov 30 2011, 08:25
Сообщение #22


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(MrYuran @ Nov 30 2011, 07:42) *
Каждый обработчик прерывания - независимый процесс, который обрабатывается по некоему событию в соответствии с установленным приоритетом, изменяемым или жестко заданным, в зависимости от аппаратной реализации.


похоже это то что я ищу, но пока не понимаю как конкретно в контексте "С" выглядят конструкции:
- установка и обработка приоритета для события,
- сам процесс переключения событий и "прерывание" низкоприоритетных событий высокоприоритетными, при сохранении состояния первых

а вообще вы нечто вроде этого имели ввиду?:

Сообщение отредактировал Zelepuk - Nov 30 2011, 08:48
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 30 2011, 08:52
Сообщение #23


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Zelepuk @ Nov 30 2011, 12:25) *
не понимаю как конкретно в контексте "С" выглядят конструкции:
- установка и обработка приоритета для события,
- сам процесс переключения событий и "прерывание" низкоприоритетных событий высокоприоритетными, при сохранении состояния первых

1. зависит от контроллера прерываний. Например, в MSP430 приоритеты заданы железно и поменять их не удастся.
2. не ваша забота. Компилятор сам все сохранит. Главное, чтобы были разрешены вложенные прерывания (то есть возможность прерывания текущего прерывания более приоритетным)


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Nov 30 2011, 09:01
Сообщение #24


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(MrYuran @ Nov 30 2011, 11:52) *
1. зависит от контроллера прерываний. Например, в MSP430 приоритеты заданы железно и поменять их не удастся.
2. не ваша забота. Компилятор сам все сохранит. Главное, чтобы были разрешены вложенные прерывания (то есть возможность прерывания текущего прерывания более приоритетным)


спасибо.
говоря о приоритетах прерываний в MSP430 вы скорее всего имели ввиду аппаратные прерывания, но как быть, если мне нужно отреагировать на программное событие (накопился блок данных АЦП например). С "суперлупой" это организуется циклическим опросом флагов.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Nov 30 2011, 09:59
Сообщение #25


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Суперлуп организовывать труднее. Так чтоб он работал как надо. Это громадье автоматов на автомате. Чуть где зависло - привет вишневому саду.
А вот с осью-переключателем - в принципе можно не думать об этом.
Пиши напрямую. Думать конечно все равно надо. Например, писать на SD хотят все процессы, а контроллер-то один, да и карта одна.
Типа, пишешь процесс (к примеру), который собирает задания из очереди и пишет данные в разные файлы. Типа, тетенька в окошке...

Или все отладку хотят выдать через уарт.... Ну и так далее.

Вот мне дяденька добрй дал задание. Сделай, говорит, маленькую радиостанцию, каналы, то, се. (Вроде как задачка для авр...). А заодно, говорит, присобачь для комплекта ФМ-радио, МР3 плеер, фоторамку. И чтоб цветно было и 3D. И вот громоздить суперпупер лупы - даже предположить опасаюсь...


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Warlockwolf
сообщение Nov 30 2011, 10:02
Сообщение #26


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 17-06-08
Пользователь №: 38 358



Цитата(Zelepuk @ Nov 30 2011, 12:25) *
похоже это то что я ищу, но пока не понимаю как конкретно в контексте "С" выглядят конструкции:
- установка и обработка приоритета для события,
- сам процесс переключения событий и "прерывание" низкоприоритетных событий высокоприоритетными, при сохранении состояния первых

а вообще вы нечто вроде этого имели ввиду?:


а я в очередь ставлю через шаг. 1 3 5 7. и у меня 3 приоритета.

0- это реального времени, при возникновении прерывания задача полностью отрабатывается. (ком по пдп набил буфер, и по прерыванию его сразу обработала задача)
1- это быстрое, задача ставится в очередь, в ближайший свободный шаг. если выполняется задача 5, то ставится в очередь на 6 место. (ком по пдп набил буфер, и по прерыванию, поставил задачу на обработку буфера в очередь)
3 - обычные задачи. задача ставится в хвост очереди. на 9 место

Сообщение отредактировал Warlockwolf - Nov 30 2011, 10:07
Go to the top of the page
 
+Quote Post
Rst7
сообщение Nov 30 2011, 10:18
Сообщение #27


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

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



QUOTE
А как же setjmp/longjmp ?


Катит только для архитектур с одним SP. Для ARM7, например, требует внешних костылей для сохранения User SP. Для CM3 - только в режиме с одним стеком.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Nov 30 2011, 13:12
Сообщение #28


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(Warlockwolf @ Nov 30 2011, 14:02) *
а я в очередь ставлю через шаг. 1 3 5 7. и у меня 3 приоритета.

0- это реального времени, при возникновении прерывания задача полностью отрабатывается. (ком по пдп набил буфер, и по прерыванию его сразу обработала задача)
1- это быстрое, задача ставится в очередь, в ближайший свободный шаг. если выполняется задача 5, то ставится в очередь на 6 место. (ком по пдп набил буфер, и по прерыванию, поставил задачу на обработку буфера в очередь)
3 - обычные задачи. задача ставится в хвост очереди. на 9 место


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

Сообщение отредактировал Zelepuk - Nov 30 2011, 13:32
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Nov 30 2011, 15:36
Сообщение #29


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Да вы сначала реализуйте просто по очереди.
Тут все просто как в зоопарке.

Есть одна ячейка памяти А.
По прерыванию от таймера обработчик использует значение содержащееся в этой ячейке, как адрес, куда он будет сохранять текущий контекст. (По завершению обработки прерывания из этой же ячейки будет браться адрес для восстановления контекста).
После чего этот обработчик вызывает сишную. процедуру. Назовите ее планировщиком, если хотите.
Этот планировщик делает что хочет, но одно сделать обязан - подсунуть в эту ячейку А адрес контекста задачи, которую хочет возобновить. Если ничего не поменяет - просто продолжит работу текущая задача.

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

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





--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Warlockwolf
сообщение Nov 30 2011, 17:47
Сообщение #30


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 17-06-08
Пользователь №: 38 358



хидер

Код
typedef  void (*pFunction)(void);
#define DefaultAddress 0x00000000UL


соурсе

Код
vu8         DNA_head=0;
vu8         DNA_teil=0;
pFunction   DNAQeue[0x100];


void Ribosoma()
{  pFunction  Application;
   pFunction*  DNAQeue_teil=&DNAQeue[0x0];
  while(1){  
            if((*DNAQeue_teil)!=DefaultAddress){Application=*DNAQeue_teil;  *DNAQeue_teil=DefaultAddress; DNAQeue_teil=&DNAQeue[++DNA_teil]; Application();};
          };
    
}

void DNA_Next() //spec pustishka
{
  return;
}

void InDNA(pFunction Thread)
{
    DNAQeue[DNA_head++]= Thread;
    DNAQeue[DNA_head++]=(pFunction)DNA_Next;      
}

void InDNA_rapid(pFunction Thread)
{ u16 vtem;
  u16 DNA_i;
  for(DNA_i=0;DNA_i!=16;DNA_i++){vtem=(DNA_teil+DNA_i);
                                 if(DNAQeue[vtem]==(pFunction)DNA_Next){ DNAQeue[vtem]=Thread;goto meett;};
                                 if(DNAQeue[vtem]==DefaultAddress){ InDNA(Thread);goto meett;}
                                };  
meett:
{};
};



Коментарии я почти не пишу. так что разбирайтесь как есть.
InDNA()- в очередь в конец.
InDNA_rapid()-в очередь в пустое место, если 16 ближайших заняты, тогда в конец.

Код
int main(void)
{
  InDNA(&initARM); //-- первая задача
  Ribosoma();  
}


Сообщение отредактировал Warlockwolf - Nov 30 2011, 17:48
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Nov 30 2011, 19:23
Сообщение #31


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(Warlockwolf @ Nov 30 2011, 21:47) *
хидер

Код
typedef  void (*pFunction)(void);
#define DefaultAddress 0x00000000UL


соурсе

Код
vu8         DNA_head=0;
vu8         DNA_teil=0;
pFunction   DNAQeue[0x100];


void Ribosoma()
{  pFunction  Application;
   pFunction*  DNAQeue_teil=&DNAQeue[0x0];
  while(1){  
            if((*DNAQeue_teil)!=DefaultAddress){Application=*DNAQeue_teil;  *DNAQeue_teil=DefaultAddress; DNAQeue_teil=&DNAQeue[++DNA_teil]; Application();};
          };
    
}

void DNA_Next() //spec pustishka
{
  return;
}

void InDNA(pFunction Thread)
{
    DNAQeue[DNA_head++]= Thread;
    DNAQeue[DNA_head++]=(pFunction)DNA_Next;      
}

void InDNA_rapid(pFunction Thread)
{ u16 vtem;
  u16 DNA_i;
  for(DNA_i=0;DNA_i!=16;DNA_i++){vtem=(DNA_teil+DNA_i);
                                 if(DNAQeue[vtem]==(pFunction)DNA_Next){ DNAQeue[vtem]=Thread;goto meett;};
                                 if(DNAQeue[vtem]==DefaultAddress){ InDNA(Thread);goto meett;}
                                };  
meett:
{};
};



Коментарии я почти не пишу. так что разбирайтесь как есть.
InDNA()- в очередь в конец.
InDNA_rapid()-в очередь в пустое место, если 16 ближайших заняты, тогда в конец.

Код
int main(void)
{
  InDNA(&initARM); //-- первая задача
  Ribosoma();  
}


спасибо большущее, как я и думал, здесь кольцевая очеред, но не совсем понятно где задаётся приоритет и как читается?
Go to the top of the page
 
+Quote Post
Warlockwolf
сообщение Nov 30 2011, 20:08
Сообщение #32


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 17-06-08
Пользователь №: 38 358



приоритет задается постановкой в очередь. либо в конец очереди, либо в середину. в любом случае задачи выполняются по очереди. в сформированной очереди задачи не меняются.
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Dec 1 2011, 05:38
Сообщение #33


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(Warlockwolf @ Dec 1 2011, 00:08) *
приоритет задается постановкой в очередь. либо в конец очереди, либо в середину. в любом случае задачи выполняются по очереди. в сформированной очереди задачи не меняются.


Таким образом, если возникает событие, требующее обработки немедленно (реалтайм), то оно в любом случае ждёт своей очереди, не прерывая обрабатываемое в данный момент событие.
Это вытеснение?
Go to the top of the page
 
+Quote Post
Warlockwolf
сообщение Dec 1 2011, 08:03
Сообщение #34


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 17-06-08
Пользователь №: 38 358



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

Сообщение отредактировал Warlockwolf - Dec 1 2011, 08:03
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Dec 1 2011, 08:26
Сообщение #35


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



понятно, вобщем кольцевая очередь низкоприоритетных задач + прерывания.
Просто вы писали обозначая приоритеты цифрами (0,1,2...) вот я и подумал что это както задаётся программно.
Теперь ясно.
Получается что необходимо разрешать прервания в прерываниях.
но например для MSP430 :
Микроконтроллеры семейства MSP430 имеют особенность – когда вложенные прерывания разрешены, любое прерывание, возникающее во время выполнения одной подпрограммы обработки прерывания, вызовет выполнение своей подпрограммы, несмотря на приоритеты прерываний.

Получается для MSP430 такое провернуть не удастся.

Сообщение отредактировал Zelepuk - Dec 1 2011, 09:20
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Jan 10 2012, 17:56
Сообщение #36


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Цитата(kolobok0 @ Nov 30 2011, 10:53) *
буду краток:
ось, планировщики (и т.д.) нафик не нужно в МК. Это Вы ребята подсознательно хотите как у "больших" типа. зачем тягаться в той весовой категории где МК вообще все плюсы сольёт. Чем будет отличаться то? тем что на борту у него есть аппаратная реализация то, что у "больших" на матери? всё?

по мне: единственный плюс разработки с юзаньем оси - командная разработка (типа просче дробить, тестировать, изолировать и т.п.), и скорость в счёт качества(подсобрать всякую тучу кривых библиотек и сапотить энным кол-вом работников). всё.

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

удачи вам
(круглый)


Спасибо за пожелание удачи, но простите, немного непонятно - вы против ОС или планировщиков? Планировщик был "изобретен" мной 2 месяца назад в силу незнания что они уже изобретены, когда потребовалось условно говоря, варить борщ, смотреть телек, укладывать ребенка, играть одновременно 10 партий в шахматы на 10 досках и иметь возможность впустить гостя, позвонившего в дверь внезапно и потом ещё уделять ему время - и все это асинхронно и без потери реального времени! Я был очень доволен, когда придумал как это осуществить. Без ОС, без вытеснения, без почтовых ящиков, просто по крестьянски, но с реальным временем. А тут ваше такое мнение....

Сообщение отредактировал _Ivana - Jan 10 2012, 17:57
Go to the top of the page
 
+Quote Post
SyncLair
сообщение Jan 10 2012, 18:57
Сообщение #37


Местный
***

Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197



Цитата(Zelepuk @ Nov 29 2011, 12:56) *
Хочется найти хорошо расписанный пример написания программы с вытясняющим планировщиком без применения какой-либо ОС на чистом С. Нашёл отличное описание кооперативного планировщика, но хочется разобраться с вытясняющим.
Подскажите, кто знает.

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

Во-вторых: оно Вам зачем надо? чтобы параллельно несколько потоков выполнялось? А наверно вы хотите чтоб одни потоки работали бесконечно а другие их вытесняли время от времени? Тогда вам и приоритет поди понадобиться? Дак почему бы не взять простейшую ОС? что сложного то -- несколько доп файлов в проект и всё.

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

Цитата(kolobok0 @ Nov 30 2011, 11:53) *
по мне: единственный плюс разработки с юзаньем оси - командная разработка (типа просче дробить, тестировать, изолировать и т.п.), и скорость в счёт качества(подсобрать всякую тучу кривых библиотек и сапотить энным кол-вом работников). всё.

Очень такой большой плюс. :-)


--------------------
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Jan 11 2012, 05:03
Сообщение #38


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(_Ivana @ Jan 10 2012, 20:56) *
Спасибо за пожелание удачи, но простите, немного непонятно - вы против ОС или планировщиков? Планировщик был "изобретен" мной 2 месяца назад в силу незнания что они уже изобретены, когда потребовалось условно говоря, варить борщ, смотреть телек, укладывать ребенка, играть одновременно 10 партий в шахматы на 10 досках и иметь возможность впустить гостя, позвонившего в дверь внезапно и потом ещё уделять ему время - и все это асинхронно и без потери реального времени! Я был очень доволен, когда придумал как это осуществить. Без ОС, без вытеснения, без почтовых ящиков, просто по крестьянски, но с реальным временем. А тут ваше такое мнение....

раскройте секрет реализации подробнее. Очень интересно.

Цитата(SyncLair @ Jan 10 2012, 21:57) *
В-третьих: на чистом Си вы ничего не получите так как чистый Си предполагает классическую однопоточную модель выполнения программ ибо создавалось это в те времена когда о реалтайме и куче периферийных устройств особо не думали. Без кусочка асма тут ну никак не обойтись


а как же ChibiOS? там "чистый" С
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Jan 11 2012, 09:08
Сообщение #39


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(_Ivana @ Jan 10 2012, 21:56) *
... без потери реального времени! ...без вытеснения...А тут ваше такое мнение....


sm.gif)) возможно я, что то не понимаю в данной терминологии но имхо - несовместимо.

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

т.е. в осадке имеем только
1) я сделал и жалко выкидывать, тем более модняво
2) теперь я могу абстрагироваться от других мелких под задачек...ура!!! ура!!! ура!!! но надо не забыть что шина разделяема, что юсарт разделяем, что..ой чёрт дай ка я заведу мьютексы, семафорчики и критические секции на всяк случай...ура!!! ура!!! ура!!! а вот мне нужно чётко нарезать по 1 микросекунде, ой блин тут надо приоритеты явно заводить...ну или там блокировку или не вытеснять... ура..ура..ура...


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


Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 11 2012, 10:15
Сообщение #40


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Да простит меня MrYuran, который забадался уже читать мои наблюдения по поводу прототредов sm.gif
Если дополнить прототредовский контекст 1 байтом, содержащим информацию, например, о подписке треда на некоторое событие, то из обработчика этого события можно вызывать только те треды, которые его ожидают. Итого, вся вытеснялка у нас базируется на физических источниках событий-прерываниях. Реалтаймовые костыли налицо.
Go to the top of the page
 
+Quote Post
SyncLair
сообщение Jan 11 2012, 20:10
Сообщение #41


Местный
***

Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197



Цитата(Zelepuk @ Jan 11 2012, 09:03) *
а как же ChibiOS? там "чистый" С

А как же папочка os/ports там и ассемблерные файлы имеются.


--------------------
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Jan 12 2012, 05:15
Сообщение #42


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(SyncLair @ Jan 11 2012, 23:10) *
А как же папочка os/ports там и ассемблерные файлы имеются.


всё же вы говорили о неприменимости C.
Go to the top of the page
 
+Quote Post
SpyBot
сообщение Jan 12 2012, 06:25
Сообщение #43


Местный
***

Группа: Свой
Сообщений: 285
Регистрация: 5-11-05
Пользователь №: 10 491



Цитата(SyncLair @ Jan 10 2012, 22:57) *
В-третьих: на чистом Си вы ничего не получите так как чистый Си предполагает классическую однопоточную модель выполнения программ ибо создавалось это в те времена когда о реалтайме и куче периферийных устройств особо не думали. Без кусочка асма тут ну никак не обойтись

Сорри, но почему не получится?
Грубо говоря, нам необходимо в прерывании манипулировать значением program counter.
Это, мне кажется, можно сделать и на си...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 12 2012, 06:49
Сообщение #44


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(SpyBot @ Jan 12 2012, 09:25) *
Сорри, но почему не получится? Грубо говоря, нам необходимо в прерывании манипулировать значением program counter.
А как вы push-pop регистрового контекста из си реализуете?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
SpyBot
сообщение Jan 12 2012, 07:10
Сообщение #45


Местный
***

Группа: Свой
Сообщений: 285
Регистрация: 5-11-05
Пользователь №: 10 491



Цитата(demiurg_spb @ Jan 12 2012, 10:49) *
А как вы push-pop регистрового контекста из си реализуете?

Например, IAR AVR использует раздельные стеки возвратов и данных.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 12 2012, 07:39
Сообщение #46


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(SpyBot @ Jan 12 2012, 10:10) *
Например, IAR AVR использует раздельные стеки возвратов и данных.
А в другом компиляторе общий стек.
Вопрос не в организации стека.
Как вы будете читать и писать регистры СОЗУ, которые, кстати говоря, могут и не мапиться в ОЗУ.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 12:43
Рейтинг@Mail.ru


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