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

 
 
 
Reply to this topicStart new topic
> Теоретический вопрос по scmRTOS, как перепланируются процессы?
Colobox
сообщение Dec 26 2007, 11:49
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901



Допустим, есть два процесса, 1 и 2. Процесс 1 ушел в спячку, например, с помощью Sleep(20), ессно,
второй получил управление, быстренько отработал, и тоже заснул, скажем, Sleep(1000). Итак, в конечном итоге оба процесса должны бы спать (а прога висеть), но фактически этого не происходит.Вопрос- так что же дает управление процессу 1 после спячки? Ведь планировщик вызывается только в момент впадания в спячку!!!
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Dec 26 2007, 11:58
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Что-то помнится, там еще таймер был, по которому шедулер тоже срабатывал...
Go to the top of the page
 
+Quote Post
Colobox
сообщение Dec 26 2007, 12:19
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901



Цитата(Непомнящий Евгений @ Dec 26 2007, 14:58) *
Что-то помнится, там еще таймер был, по которому шедулер тоже срабатывал...

хм... да нет, вроде только системный таймер в наличии, но в его обработчике шедулером и не пахнет ...
Go to the top of the page
 
+Quote Post
dxp
сообщение Dec 26 2007, 12:40
Сообщение #4


Adept
******

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



Цитата(Colobox @ Dec 26 2007, 17:49) *
но фактически этого не происходит.

А что фактически происходит?

Цитата(Colobox @ Dec 26 2007, 17:49) *
Вопрос- так что же дает управление процессу 1 после спячки?

Так в каком процессе висит прога? Должна в IdleProcess.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 26 2007, 12:40
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Процессов всегда на один больше, чем вы объявляете. Именно он и крутится тогда, когда все остальные тоже ничего не делают.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 26 2007, 17:44
Сообщение #6


Гуру
******

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



Цитата(Colobox @ Dec 26 2007, 13:49) *
Вопрос- так что же дает управление процессу 1 после спячки?
...
вроде только системный таймер в наличии
Посмотрите OS::TKernel::SystemTimer(). Именно там вызывается SetProcessReady(), а перепланировка происходит в момент выхода из прерывания в деструкторе TISRW.


--------------------
На любой вопрос даю любой ответ
"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
Colobox
сообщение Dec 26 2007, 19:54
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901



Цитата(dxp @ Dec 26 2007, 15:40) *
А что фактически происходит?
Так в каком процессе висит прога? Должна в IdleProcess.

Cобственно, программка простая, потому как тестовая:

OS_PROCESS void TProc1::Exec()
{
for(;;)
{
Led1=1;// Led1, Led2- выводы портов, на коих сидят светодиоды, 1-горит, 0- тухнет
Led2=0;
Sleep(20);
}

}

OS_PROCESS void TProc2::Exec()
{
for(;;)
{
Led1=0;
Led2=1;
Sleep(1000);
}

}

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



Цитата(Сергей Борщ @ Dec 26 2007, 20:44) *
Посмотрите OS::TKernel::SystemTimer(). Именно там вызывается SetProcessReady(), а перепланировка происходит в момент выхода из прерывания в деструкторе TISRW.

SetProcessReady(), конечно, вызывается, но планировщика там нет! А TISR_Wrapper
тож вроде с планировщиком дело не имеет, -иначе получается, что перепланирование процессов происходит с каждым тиком системотаймера.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Dec 26 2007, 22:05
Сообщение #8


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Как раз ISR Wrapper и вызыввает перепланировщик при выходе из прерывания в основную программу (т.е. при вложенных прерываниях при выходе из вложенных не вызывается, там есть счётчик уровня вложения прерываний).
В конце деструктора ISR WRAPPER-а стоит вызов Kernel.SchedISR();, в зависимости от стиля переключателя или перепланировка производится немедленно, или генерируется программное прерывание, происходит возврат в прерванный поток и тут же прерывание переключения контекстов. И так происходит в каждом "по-осевому" оформленном прерывании, не только в таймерном.
Я в тестовый пример (единственный пока в avr-gcc порте) натолкал ногодрыжества в процессы и в хуки, временно добавил даже в переключатель контекстов и наснимал в комп осциллограм. Сейчас малой скоростью пишу к ним более-менее подробное описание происходящих процессов.
"Скоро будет"

p.s. Перепланирование может и оставить всё "как есть", в случае с теми Sleep() - оставить выполняться IdleProcess.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
dxp
сообщение Dec 27 2007, 06:31
Сообщение #9


Adept
******

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



Цитата(Colobox @ Dec 27 2007, 01:54) *
Полагаю, что перемигивание диодов (де-факто) и свидетельствет о переключении и работе процессов. Хотя теоретически, после Sleep(20); и следующего за этим Sleep(1000);- все должны бы баиньки и прога по крайней мере уже не мигала б.

Так сколько по-вашему времени "все должны быть баиньки"? Sleep(20) - это баиньки на 20 тиков системного таймера. Сколько у вас длительность этого тика? Обычно, это времена порядка 1-10 мс. Т.е. если тик 1 мс, то 20 тиков - 20 мс, а 1000 тиков - 1 с. С каким периодом у вас светодиоды перемигиваются? Вот если бы вы там в обоих случаях сделали просто Sleep(), это это действительно были бы полные баиньки. smile.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Colobox
сообщение Dec 27 2007, 18:45
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901



Цитата(ReAl @ Dec 27 2007, 01:05) *
Как раз ISR Wrapper и вызыввает перепланировщик при выходе из прерывания в основную программу (т.е. при вложенных прерываниях при выходе из вложенных не вызывается, там есть счётчик уровня вложения прерываний).
В конце деструктора ISR WRAPPER-а стоит вызов Kernel.SchedISR();, в зависимости от стиля переключателя или перепланировка производится немедленно, или генерируется программное прерывание, происходит возврат в прерванный поток и тут же прерывание переключения контекстов. И так происходит в каждом "по-осевому" оформленном прерывании, не только в таймерном.

Да, точно! Внимательно перечитал мануал и исходники, - и правда, перепланирование осуществляется с каждым тиком системника...
Цитата(ReAl @ Dec 27 2007, 01:05) *
Я в тестовый пример (единственный пока в avr-gcc порте) натолкал ногодрыжества в процессы и в хуки, временно добавил даже в переключатель контекстов и наснимал в комп осциллограм. Сейчас малой скоростью пишу к ним более-менее подробное описание происходящих процессов.
"Скоро будет"

Кстати, простеньких примеров с осью ,типа обучающих,пока не встречал.


Цитата(dxp @ Dec 27 2007, 09:31) *
Сколько у вас длительность этого тика? Обычно, это времена порядка 1-10 мс. Т.е. если тик 1 мс, то 20 тиков - 20 мс, а 1000 тиков - 1 с. С каким периодом у вас светодиоды перемигиваются? Вот если бы вы там в обоих случаях сделали просто Sleep(), это это действительно были бы полные баиньки. smile.gif

Тик- 1,6мс где-то. Да, и период миганий так и есть 30мс-1,5 сек. А вот если Sleep(20) и Sleep(1000) местами в процессах поменять, то периоды фактически совсем не такие получаются,- один пракически постоянно горит, а другой, скорее всего, совсем коротенько мигает- еле видно. Но это, видимо, эффект разности процессных приоритетов.
Go to the top of the page
 
+Quote Post

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

 


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


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