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

 
 
> Теоретический вопрос по 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
 
Start new topic
Ответов
dxp
сообщение Dec 26 2007, 12:40
Сообщение #2


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
Colobox
сообщение Dec 26 2007, 19:54
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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



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

 


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


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