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

 
 
> Зависает низкоприритетный процесс
Nikkola
сообщение May 13 2010, 13:42
Сообщение #1





Группа: Участник
Сообщений: 11
Регистрация: 13-05-10
Пользователь №: 57 239



Контроллер МЕГА16, IAR EWAVR 4.20, scmRTOS v 3.00-beta

фрагмент кода

OS_PROCESS void TProcess::Exec()
{

while(true)
{

__watchdog_reset();
Sleep(100);

PORTA &= ~(1<<PA5);
PORTA &= ~(1<<PA7);//вниз 0

__delay_cycles(10); //t1 > 0.45 мкс

word hGray, vGray; //код грея от энкодера

__watchdog_reset();
for(int i = 0; i < 10; i++)
{
hGray <<= 1;
vGray <<= 1;

PORTA |= (1<<5)|(1<<7);//вверх 1
__delay_cycles(10);

if(PINA&0x40) hGray |=(1<<0);
if(PINA&0x10) vGray |=(1<<0);

PORTA &= ~(1<<PA5);
PORTA &= ~(1<<PA7);//вниз 0
__delay_cycles(10);
}

__delay_cycles(30);

PORTA |= (1<<5)|(1<<7);//вверх 1
__watchdog_reset();

hGray &= 0x3FF;
vGray &= 0x3FF;
__watchdog_reset();


*phA = GrayToBin(hGray);
*pvA = GrayToBin(vGray);


byte dir=0;
__watchdog_reset();
byte vvA = HIGHBYTE(vAngle<<6);
byte hhA = HIGHBYTE(hAngle<<6);
byte TvA = HIGHBYTE(vTargetAngle<<6);
byte ThA = HIGHBYTE(hTargetAngle<<6);

if ((vvA>TvA)&&enable_move) dir |=(1<<3);

if ((vvA<TvA)&&enable_move) dir |=(1<<2);

if (vvA == TvA) dir &= ~((1<<2)|(1<<3));


if ((hhA>ThA)&&enable_move) dir |=(1<<1);

if ((hhA<ThA)&&enable_move) dir |=(1<<0);

if (hhA == ThA) dir &= ~((1<<0)|(1<<1));


if ((vvA == TvA)&&(hhA == ThA))
{

enable_move = 0; //EFlag.Clear();


}

PORTA = 0xF0|dir;

//move = 0xFF;

//задание направления движения
//__watchdog_reset();




__watchdog_reset();
}
}


Виснет в момент совпадения (== по if) . Испол зую глобальные переменные, здесь vAngle - текущее значение угла, vTarget -заданное значение. Когда движок доезжает до заданного места (совпадает значение энкодера и заданное), происходит перезапуск по ватчдогу.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение May 13 2010, 15:10
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Nikkola
сообщение May 18 2010, 07:24
Сообщение #3





Группа: Участник
Сообщений: 11
Регистрация: 13-05-10
Пользователь №: 57 239



Цитата(AHTOXA @ May 13 2010, 19:10) *
В приведённом коде виснуть нечему. Видимо меняются глобальные переменные, которые вызывают активность более приоритетного процесса, и он надолго захватывает управление. Вот собака и сбрасывает проц.


Заменил глобальные переменные на закрытые члены класса. Не помогло. Может дело в размере стеков, как их настраивать в ИАР и в csmRTOS?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 18 2010, 07:52
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Суть не в том, что это были глобальные переменные, суть в том, что их изменение в низкоприоритетном процессе запускало какую-то деятельность в более приоритетном процессе. Ведь запускало же? Например, флаг enable_move - он зачем? А scmRTOS устроена так, что пока более приоритетный процесс не отдаст управление (при помощи Sleep() или, скажем, TEventFlag::Wait() ), менее приоритетный процесс не имеет шансов на выполнение. Оттого и сбрасывается собака.

Стеки задач задаются в специализации шаблона процесса:
Код
typedef OS::process<OS::pr1, 200> TProc1;

здесь 200 - размер стека процесса TProc1.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Nikkola
сообщение May 18 2010, 12:31
Сообщение #5





Группа: Участник
Сообщений: 11
Регистрация: 13-05-10
Пользователь №: 57 239



Цитата(AHTOXA @ May 18 2010, 11:52) *
Суть не в том, что это были глобальные переменные, суть в том, что их изменение в низкоприоритетном процессе запускало какую-то деятельность в более приоритетном процессе. Ведь запускало же? Например, флаг enable_move - он зачем? А scmRTOS устроена так, что пока более приоритетный процесс не отдаст управление (при помощи Sleep() или, скажем, TEventFlag::Wait() ), менее приоритетный процесс не имеет шансов на выполнение. Оттого и сбрасывается собака.

Стеки задач задаются в специализации шаблона процесса:
Код
typedef OS::process<OS::pr1, 200> TProc1;

здесь 200 - размер стека процесса TProc1.


Значит , я не могу выставить флаг в высокоприоритетном процессе (у меня это enable_move в Usart-овском процессе при получении команды движения в заданный сектор), а сбросить в низкоприоритетном (когда текущее значение энкодера совпало с заданным сектором). Именно при совпадении происходит завис. Тогда можно вопрос? Какой тогда механизм задействовать для обмена данными между процессами? EVENT_Flag ксожалению сразу сбрасывает значение. Как бы вы , например, разбили по процессам и сервисам , скажем терморегулятор, опрашиваемый по УСАРту, причем значение задаваемой температуры должно изменяться по команде с УСАРта в любой момент, а инерционность системы малая. Получается есть заданная температура, кот надо обеспечить (пусть там нагреть-охладить ) текущая- по измерению, с кажем с термопары. И еще надо давать ответ на запрос с УСАРТа о текущей температуре?

Спасибо большое за участие!
Вот теперь флагом управляю в самом приоритетном процессе. Выставляю при получении команды с УСАРТа, а сбрасываю при помощи EVENT FLAG WAIT(10). А в менее приоритетном делаю Signal(). Вроде правильно должно отрабатывать?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 18 2010, 14:04
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Nikkola @ May 18 2010, 18:31) *
Спасибо большое за участие!

Пожалуйстаsmile.gif

Цитата
Вот теперь флагом управляю в самом приоритетном процессе. Выставляю при получении команды с УСАРТа, а сбрасываю при помощи EVENT FLAG WAIT(10). А в менее приоритетном делаю Signal(). Вроде правильно должно отрабатывать?


Не, немного не так. Event flag -- это одностороннее средство коммуникации. Один процесс устанавливает флаг, другой - ждёт. Нельзя пользоваться им как шариком для пинг-понга, для передачи управления между процессами. Для этого придётся завести два флага. Более приоритетный процесс делает так:
Код
    StartLowPriorityProcessFlag.Signal(); // даём отмашку менее приоритетному процессу
    LowPriorityWorkDone.Wait();   // ждём когда отработает низкоприоритетный процесс.

А низкоприоритетный делает соответственно так:
Код
    StartLowPriorityProcessFlag.Wait(); // ждём команды от высокоприритетного процесса
    Work(); // делаем работу
    LowPriorityWorkDone.Signal(); // сигнализируем об окончании работы.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Nikkola   Зависает низкоприритетный процесс   May 13 2010, 13:42
|- - AHTOXA   Основная идея такая - чем больше требования к врем...   May 18 2010, 12:36
||- - Nikkola   Цитата(AHTOXA @ May 18 2010, 16:36) Основ...   May 18 2010, 14:10
||- - AHTOXA   Цитата(Nikkola @ May 18 2010, 20:10) Спас...   May 18 2010, 17:33
|||- - Nikkola   Цитата(AHTOXA @ May 18 2010, 20:33) Нет Ч...   May 19 2010, 06:51
||- - Сергей Борщ   Цитата(Nikkola @ May 18 2010, 17:10) Самы...   May 19 2010, 07:19
- - AHTOXA   Цитата(Nikkola @ May 19 2010, 12:51) Еще ...   May 19 2010, 08:18
- - Nikkola   Цитата(AHTOXA @ May 19 2010, 11:18) В voi...   May 19 2010, 11:23
- - AHTOXA   Цитата(Nikkola @ May 19 2010, 17:23) А чт...   May 19 2010, 12:58
- - Nikkola   Получилось, что неправильно распределены ресурсы М...   May 24 2010, 12:11
- - Сергей Борщ   Цитата(Nikkola @ May 24 2010, 15:11) Деба...   May 24 2010, 14:48
- - Nikkola   Цитата(Сергей Борщ @ May 24 2010, 18:48) ...   May 24 2010, 19:38


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

 


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


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