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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> scmRTOS: если в одном из процессов "быстрый цикл", то все остальные процессы загибаются
haker_fox
сообщение Dec 13 2006, 07:33
Сообщение #1


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Здравствуйте!
Такая вот проблема. Использую ОС scmRTOS на ATmega16. Создано два процесса. Первый: работа с USART, второй - с ЖКИ. Проблема: если во втором процессе применить цикл вида
Код
while(PINB & (1 << KEY0));
, то первый процесс не работает. Если цикл исправить на такой
Код
            while(PINB & (1 << KEY0))
                Sleep(50/OS_SWITCH_TASK);

то все ок. В этом цикле мы ждем нажатия некой кнопки и в это время первый процесс не работает. При нажатии на кнопку (т.е. когда происходит выход из цикла), первый процесс начинает абсолютно нормально работать.
Сложилось впечатление, что если в задаче (процессе) применен бесконечный цикл, то все остальные процессы "падают" до тех пор, пока это цикл не прекратится. Доку перечитал. Не нашел никаких комментариев на эту тему. Сам сообразить, в чем дело, не могу. Прошу помощи у бывалых. Заранее спасибо!
Детали:
МК ATmega16, кварц 16MHz
Время тика ОС 4.096 мс (TCCR0 = 0x04;)
Версия ОС 1.10
Компилятор WinAVR 20060421

На всякий случай прикладываю некоторые файлы своего проекта.
Прикрепленные файлы
Прикрепленный файл  WAKE_RTOS.rar ( 45.6 килобайт ) Кол-во скачиваний: 92
 


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 13 2006, 09:28
Сообщение #2


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

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



Ну тут все очень просто. Чтобы могли крутиться другие процессы, надо чтобы "скоростной" процесс дал им такую возможность - грубо говоря "приспнул" (пардон за жаргон) на некоторое время. Именно это и делает функция Sleep. Без нее процесс никому управление и не отдаст.
Go to the top of the page
 
+Quote Post
Terminator
сообщение Dec 13 2006, 09:36
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382



Цитата(sergeeff @ Dec 13 2006, 12:28) *
Ну тут все очень просто. Чтобы могли крутиться другие процессы, надо чтобы "скоростной" процесс дал им такую возможность - грубо говоря "приспнул" (пардон за жаргон) на некоторое время. Именно это и делает функция Sleep. Без нее процесс никому управление и не отдаст.

Я почему-то считал, что в scmRTOS вытесняющая многозадачность ... Невнимательно читал мануал?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 13 2006, 09:40
Сообщение #4


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

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



Вытесняющая. Но надо же дать возможность другим процессам вытеснить текущий.
Go to the top of the page
 
+Quote Post
spf
сообщение Dec 13 2006, 09:48
Сообщение #5


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Цитата(Terminator @ Dec 13 2006, 11:36) *
Я почему-то считал, что в scmRTOS вытесняющая многозадачность ... Невнимательно читал мануал?

Вытесняющая, но вытесняет тот процесс, у кого приоритет выше.
Если процесс с наивысшим приоритетом будет крутиться бесконечно, то все остальные будут курить бамбук...


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Dec 13 2006, 10:25
Сообщение #6


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(spf @ Dec 13 2006, 14:48) *
Цитата(Terminator @ Dec 13 2006, 11:36) *
Я почему-то считал, что в scmRTOS вытесняющая многозадачность ... Невнимательно читал мануал?

Вытесняющая, но вытесняет тот процесс, у кого приоритет выше.
Если процесс с наивысшим приоритетом будет крутиться бесконечно, то все остальные будут курить бамбук...

Так чтоже получается, любой процесс может угробить всю ОС простым зацикливанием. И как быть? Оооочень внимательно программировать? И как опеределить, сколько может такой цикл крутиться? Чутье мне подсказывает, что не более, чем один тик ОС. В моем случае 4 мс. Так ли это?


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
spf
сообщение Dec 13 2006, 10:35
Сообщение #7


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Цитата(haker_fox @ Dec 13 2006, 12:25) *
Цитата(spf @ Dec 13 2006, 14:48) *
Вытесняющая, но вытесняет тот процесс, у кого приоритет выше.
Если процесс с наивысшим приоритетом будет крутиться бесконечно, то все остальные будут курить бамбук...
Так чтоже получается, любой процесс может угробить всю ОС простым зацикливанием. И как быть? Оооочень внимательно программировать? И как опеределить, сколько может такой цикл крутиться? Чутье мне подсказывает, что не более, чем один тик ОС. В моем случае 4 мс. Так ли это?

Не совсем так.
Программирование под OS несколько отличается от "обычного" программирования.
1. Работа должна выполняться на основе "событий". Никаких зацикливаний быть не должно.
2. Когда процессу делать нечего он должен отдать управление, управление будет передано тому, которому есть что делать.

Чутье не то чует, тик OS нужен только для таймера OS.


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Dec 13 2006, 10:41
Сообщение #8


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(spf @ Dec 13 2006, 15:35) *
Цитата(haker_fox @ Dec 13 2006, 12:25) *
Цитата(spf @ Dec 13 2006, 14:48) *
Вытесняющая, но вытесняет тот процесс, у кого приоритет выше.
Если процесс с наивысшим приоритетом будет крутиться бесконечно, то все остальные будут курить бамбук...
Так чтоже получается, любой процесс может угробить всю ОС простым зацикливанием. И как быть? Оооочень внимательно программировать? И как опеределить, сколько может такой цикл крутиться? Чутье мне подсказывает, что не более, чем один тик ОС. В моем случае 4 мс. Так ли это?

Не совсем так.
Программирование под OS несколько отличается от "обычного" программирования.
1. Работа должна выполняться на основе "событий". Никаких зацикливаний быть не должно.
2. Когда процессу делать нечего он должен отдать управление, управление будет передано тому, которому есть что делать.

Чутье не то чует, тик OS нужен только для таймера OS.

А если в моем процессе будет такого рода цикл?
Код
for(i = 0; i < 1024; i++)
  Array[i] = log(c);

Пример привел чисто для примера...
Тоже получается зацикливание...


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
amusin
сообщение Dec 13 2006, 11:29
Сообщение #9


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

Группа: Участник
Сообщений: 120
Регистрация: 2-09-05
Из: Екатеринбург
Пользователь №: 8 165



Цитата(haker_fox @ Dec 13 2006, 12:41) *
Кстати, сменил приоритет процесса с зацикливанием на более низкий, все работает... Теперь буду знать это...


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

Конкретно по вашему случаю.
Если ваша задача должна выполнить что-то по внешнему событию, то можно поступить 2 путями:
1. Если отработать нужно срочно (похоже, что у вас так), то сажаете его на прерывание. В ISR шлете семафор задаче.
2. Еще один подход - "поллить" сигнал с таймаутом (что вы и сделали, когда вставили sleep()).

Приоритеты задач - это не та штука, которой вертят, "потому что работает".
Не обижайтесь, но у вас есть непонимание работы ОСРВ.
Документация на scmRTOS хорошая, но, возможно, для новичка (в ОС) стоит прочитать книгу Лябруса, хотя бы первые главы, в которых написано об общих принципах работы ОС: как должен быть организован код задачи, о приоритетах. Где-то в сети был перевод на русский нескольких глав.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Dec 13 2006, 11:33
Сообщение #10


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(amusin @ Dec 13 2006, 16:29) *
Цитата(haker_fox @ Dec 13 2006, 12:41) *

Кстати, сменил приоритет процесса с зацикливанием на более низкий, все работает... Теперь буду знать это...


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

Конкретно по вашему случаю.
Если ваша задача должна выполнить что-то по внешнему событию, то можно поступить 2 путями:
1. Если отработать нужно срочно (похоже, что у вас так), то сажаете его на прерывание. В ISR шлете семафор задаче.
2. Еще один подход - "поллить" сигнал с таймаутом (что вы и сделали, когда вставили sleep()).

Приоритеты задач - это не та штука, которой вертят, "потому что работает".
Не обижайтесь, но у вас есть непонимание работы ОСРВ.
Документация на scmRTOS хорошая, но, возможно, для новичка (в ОС) стоит прочитать книгу Лябруса, хотя бы первые главы, в которых написано об общих принципах работы ОС: как должен быть организован код задачи, о приоритетах. Где-то в сети был перевод на русский нескольких глав.


Что Вы... я нисколько не обижаюсь, ибо пока действительно не очень пониаю ОСРВ... но хочу научиться... Ну хорошо, с кнопкой ясно. Но как быть с приведенным ниже примером, ведь там тоже зацикливание?
Кстати, последнюю строку своего сообщения (вы ее в цитату взяли) я убрал, потому что спустя минут 10 после запуска все накрылось.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
IEC
сообщение Dec 13 2006, 11:45
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598



А в вашем привере цикл можно разбать на несколько подциклов с небольшой длительностью выполнения и периодически передавать управление (Sleep). Все зависит от срочности выполнения цикла.
Go to the top of the page
 
+Quote Post
spf
сообщение Dec 13 2006, 12:17
Сообщение #12


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Цитата(haker_fox @ Dec 13 2006, 13:33) *
Ну хорошо, с кнопкой ясно. Но как быть с приведенным ниже примером, ведь там тоже зацикливание?

В примере не зацикливание (бесконечный цикл, цикл ожидания медленноного процесса и т.п.), а рабочий, нужный цикл. Он выполняется вполне определенное время, в это время процессор не "толчет воду в ступе", а занимается необходимым делом.

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


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
Wild007
сообщение Dec 13 2006, 12:19
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672



ИМХО в основном цикле "влет" проверять состояние "кнопки" и переходить куда надо smile.gif


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 13 2006, 12:39
Сообщение #14


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



haker_fox, Вы писали, что у Вас два процесса: UART и индикатор.
Не вижу никаких проблем в том, чтобы применять цикл в процессе индикатора если он менее приоритетный, чем UART.
Если же процесс UART большую часть времени находится в ожидании событий от его же прерываний (в этом случае они должны обрабатываться ОС, чтобы влечь за собой переключение контекста), то он проснётся сразу же как только возникнет такое событие, обработает его и снова уснёт передав управление процессу индикатора.
В Вашем случае процесс индикатора является как бы фоновым и будет тут же вытеснен процессом UART как только наступят соответствующие события. Этим как раз и отличается вытесняющая ОС от кооперативной. Вам не нужно делать принудительного слипа в цикле (если конечно не хотите сэкономить электроэнергию, в этом случае большую часть времени система будет находиться в процессе Idle). И уж тем более не нужно изощряться с машинами состояний.
Go to the top of the page
 
+Quote Post
amusin
сообщение Dec 13 2006, 14:24
Сообщение #15


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

Группа: Участник
Сообщений: 120
Регистрация: 2-09-05
Из: Екатеринбург
Пользователь №: 8 165



"cпустя минут 10 после запуска все накрылось."

Посмотрел ваш код, вложенный в первое сообщение.
В задаче TUserLoop после выхода из цикла while счетчик команд попадет в новый цикл - for (;;) и из него уже не выйдет. Причем, т.к. вы установили приоритет этой задачи выше, чем у задачи обработки пакета по uart, то последняя не получит управление, если внутри методов класса Lcd нет вызовов системных методов.

В scmRTOS вызовом sleep (wait etc) вы позволяете ("разрешаете") менее приоритетным _задачам_ сделать их работу. Планировщик, если надо, отберет у задачи управление и без ее "разрешения".
В кооперативных ОС вызовом sleep (wait etc) вы отдаете управление _планировщику_, без этого перепланирование невозможно.

PS. Заметил, что вы шлете каждый принятый символ в задачу. Этот подход вполне "законен", но не лучший. На каждый принятый символ производится вызов шедулера, время работы которого измеряется десятками микросекунд. При высоких скоростях обмена по uart процессор только и будет заниматься тем, что "щелкать" контекстом. Поэтому, для уменьшения расходов времени на перепланирование, следует принимать пакет в буфер в ОЗУ, а по окончании приема - семафорить в задачу или посылать ей указатель на принятое сообщение (если есть очередь сообщений). Разгребать пакет в задаче.
Насколько я понял, у вас протокол wake. Так вот, протокол уровня serial line (байт-стаффинг, фрейминг) разумно перенести в ISR приема по uart, а разбор команды (если она принята корректно) вести в задаче.

Сообщение отредактировал amusin - Dec 13 2006, 14:38
Go to the top of the page
 
+Quote Post

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

 


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


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