Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
31.01.2010, 02:48
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 583
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
|
scmRTOS
Взялся я изучить scmRTOS
Казалоь все замечательно - простая, небольшая, да и документация на русском. Но вот хоть убейте не могу сделать так, чтоб более приоритетный процесс отдал управление менее приоритетному...
Прошу ткнуть носом Ну а потом камнями можно кидатся...
__________________
Sex, Druggs, Rock&Roll
|
|
|
|
31.01.2010, 03:17
|
|
Частый гость
Регистрация: 03.12.2009
Сообщений: 27
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: scmRTOS
Усыпить приоритетный процесс в ожидании нужного события. Управление прерйдет к следующему по приоритету
|
|
|
|
31.01.2010, 03:31
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 583
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
|
Re: scmRTOS
Пробывал. Заставляю его (более приоритетный) ждать флаг. Просто усыпляю.
Ничего
__________________
Sex, Druggs, Rock&Roll
|
|
|
|
31.01.2010, 03:39
|
|
Частый гость
Регистрация: 03.12.2009
Сообщений: 27
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: scmRTOS
Без исходников больше ничего не скажешь. Попробуйте на основе демо примеров, модифицировав их под себя.
Последний раз редактировалось big.chupakabra; 31.01.2010 в 03:40.
Причина: орфю ошибка
|
|
|
|
31.01.2010, 04:03
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 583
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
|
Re: scmRTOS
Я так, впринципе и сделал...
Код:
|
template‹› void TProc1::Exec()
{
for(;;)
{
PORTC|=(1‹‹0);
ef.Wait();
}
}
template‹› void TProc2::Exec()
{
for(;;)
{
PORTC|=(1‹‹1);
ef.Wait();
}
} |
Весь проект в пакаванке.
__________________
Sex, Druggs, Rock&Roll
|
|
|
|
31.01.2010, 08:17
|
|
Временная регистрация
Регистрация: 15.08.2006
Сообщений: 54
Сказал спасибо: 3
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: scmRTOS
У Вас в прерывании производится возведение флага Timer1_Ovf, а в процессах ожидается событие ef, которого никогда не происходит. Но это еще не все. Даже если в прерывании таймера сигналить событие ef? все равно работать не будет. Это происходит потому, что при возведении флага события управление получает самый приоритетный процесс, в данном случае Proc1, который и сбрасывает флаг события.
В этом проекте паузу лучше сделать функцией Sleep(time); где time - ожидание в системных тиках. Например так
Код:
|
//----------------------------------------------------------
template‹› void TProc1::Exec()
{
for(;;)
{
PORTC|=(1‹‹0);
Sleep(100);
PORTC&=~(1‹‹0);
Sleep(100);
}
} |
В хелпе на avr в протеусе написано, что нет симуляции самопрограммирования и соответственно прерывания SPM ready, поэтому в протеусе не происходит передачи управления другому процессу.
Последний раз редактировалось Gn0me; 31.01.2010 в 08:19.
|
|
|
|
31.01.2010, 16:34
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 583
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
|
Re: scmRTOS
На счет того, что жду одного флага - устанавливаю другой это я знаю.
Но в мануале написано (на счет EventFlag, а точнее ф-ции Wait):
Цитата:
|
ждать. При вызове функции Wait() происходит
следующее: проверяется, установлен ли флаг и,
если установлен, то флаг сбрасывается, и функ-
ция возвращает true, т.е. событие на момент оп-
роса уже произошло. Если флаг не установлен
(т.е. событие еще не произошло), то процесс пе-
реводится в состояние ожидания этого флага
(события) и управление отдается ядру, которое,
перепланировав процессы, запустит следующий.
|
И на счет SPM. Я использую схему с прямой передачей управления (через планировщик) а не через прерывание.
Контроллер ATmega32.
__________________
Sex, Druggs, Rock&Roll
|
|
|
|
31.01.2010, 17:26
|
|
Временная регистрация
Регистрация: 15.08.2006
Сообщений: 54
Сказал спасибо: 3
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: scmRTOS
Почитал мануал. Действительно управление должны получить все процесс, начиная с более приоритетного.
Цитата:
|
«сигналить». Процесс, который желает сообщить
посредством объекта TEventFlag другим процес-
сам о том, что то или иное событие произошло,
должен вызвать функцию Signal(). При этом все
процессы, ожидающие указанное событие, будут
переведены в состояние готовых к выполнению,
а управление получит самый приоритетный из
них (остальные в порядке очередности приорите-
тов);
|
Сообщение от alberio
|
Я использую схему с прямой передачей управления (через планировщик) а не через прерывание.
|
В проекте, который Вы приложили используется как раз передача управления через прерывание. В файле scmRTOS_CONFIG.h есть строка
#define scmRTOS_CONTEXT_SWITCH_SCHEME 1
|
|
|
|
31.01.2010, 18:21
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 583
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
|
Re: scmRTOS
Тысяча извинений! Действительно в этом проекте забыл переопределить "scmRTOS_CONTEXT_SWITCH_SCHEME". Все заработало! Спасибо за помощь!!!
__________________
Sex, Druggs, Rock&Roll
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:03.
|
|