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

 
 
> 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
 
Start new topic
Ответов
amusin
сообщение Dec 13 2006, 14:24
Сообщение #2


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

Группа: Участник
Сообщений: 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
IgorKossak
сообщение Dec 13 2006, 14:55
Сообщение #3


Шаман
******

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



Цитата(amusin @ Dec 13 2006, 13:24) *
... На каждый принятый символ производится вызов шедулера, время работы которого измеряется десятками микросекунд. ...

При частоте кварца 8МГц - примерно 14мкс.
Не так уж и много.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- haker_fox   scmRTOS: если в одном из процессов "быстрый цикл", то все остальные процессы загибаются   Dec 13 2006, 07:33
- - sergeeff   Ну тут все очень просто. Чтобы могли крутиться дру...   Dec 13 2006, 09:28
|- - Terminator   Цитата(sergeeff @ Dec 13 2006, 12:28) Ну ...   Dec 13 2006, 09:36
|- - spf   Цитата(Terminator @ Dec 13 2006, 11:36) Я...   Dec 13 2006, 09:48
|- - haker_fox   Цитата(spf @ Dec 13 2006, 14:48) Цитата(T...   Dec 13 2006, 10:25
|- - spf   Цитата(haker_fox @ Dec 13 2006, 12:25) Ци...   Dec 13 2006, 10:35
|- - haker_fox   Цитата(spf @ Dec 13 2006, 15:35) Цитата(h...   Dec 13 2006, 10:41
|- - amusin   Цитата(haker_fox @ Dec 13 2006, 12:41) Кс...   Dec 13 2006, 11:29
|- - haker_fox   Цитата(amusin @ Dec 13 2006, 16:29) Цитат...   Dec 13 2006, 11:33
|- - spf   Цитата(haker_fox @ Dec 13 2006, 13:33) Ну...   Dec 13 2006, 12:17
- - sergeeff   Вытесняющая. Но надо же дать возможность другим пр...   Dec 13 2006, 09:40
- - IEC   А в вашем привере цикл можно разбать на несколько ...   Dec 13 2006, 11:45
- - Wild007   ИМХО в основном цикле "влет" проверять с...   Dec 13 2006, 12:19
- - IgorKossak   haker_fox, Вы писали, что у Вас два процесса: UART...   Dec 13 2006, 12:39
|- - haker_fox   Цитата(amusin @ Dec 13 2006, 19:24) Наско...   Dec 14 2006, 04:09
- - amusin   Я не буду спорить ни по ЦитатаПри частоте кварца 8...   Dec 13 2006, 15:18


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

 


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


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