|
|
  |
Теоретический вопрос по scmRTOS, как перепланируются процессы? |
|
|
|
Dec 26 2007, 11:49
|
Участник

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

|
Допустим, есть два процесса, 1 и 2. Процесс 1 ушел в спячку, например, с помощью Sleep(20), ессно, второй получил управление, быстренько отработал, и тоже заснул, скажем, Sleep(1000). Итак, в конечном итоге оба процесса должны бы спать (а прога висеть), но фактически этого не происходит.Вопрос- так что же дает управление процессу 1 после спячки? Ведь планировщик вызывается только в момент впадания в спячку!!!
|
|
|
|
|
Dec 26 2007, 12:19
|
Участник

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

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

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

|
Цитата(Colobox @ Dec 26 2007, 17:49)  но фактически этого не происходит. А что фактически происходит? Цитата(Colobox @ Dec 26 2007, 17:49)  Вопрос- так что же дает управление процессу 1 после спячки? Так в каком процессе висит прога? Должна в IdleProcess.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Dec 26 2007, 19:54
|
Участник

Группа: Участник
Сообщений: 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 тож вроде с планировщиком дело не имеет, -иначе получается, что перепланирование процессов происходит с каждым тиком системотаймера.
|
|
|
|
|
Dec 26 2007, 22:05
|

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

|
Как раз ISR Wrapper и вызыввает перепланировщик при выходе из прерывания в основную программу (т.е. при вложенных прерываниях при выходе из вложенных не вызывается, там есть счётчик уровня вложения прерываний). В конце деструктора ISR WRAPPER-а стоит вызов Kernel.SchedISR();, в зависимости от стиля переключателя или перепланировка производится немедленно, или генерируется программное прерывание, происходит возврат в прерванный поток и тут же прерывание переключения контекстов. И так происходит в каждом "по-осевому" оформленном прерывании, не только в таймерном. Я в тестовый пример (единственный пока в avr-gcc порте) натолкал ногодрыжества в процессы и в хуки, временно добавил даже в переключатель контекстов и наснимал в комп осциллограм. Сейчас малой скоростью пишу к ним более-менее подробное описание происходящих процессов. "Скоро будет"
p.s. Перепланирование может и оставить всё "как есть", в случае с теми Sleep() - оставить выполняться IdleProcess.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Dec 27 2007, 18:45
|
Участник

Группа: Участник
Сообщений: 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(), это это действительно были бы полные баиньки.  Тик- 1,6мс где-то. Да, и период миганий так и есть 30мс-1,5 сек. А вот если Sleep(20) и Sleep(1000) местами в процессах поменять, то периоды фактически совсем не такие получаются,- один пракически постоянно горит, а другой, скорее всего, совсем коротенько мигает- еле видно. Но это, видимо, эффект разности процессных приоритетов.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|