|
Зависает низкоприритетный процесс |
|
|
|
May 13 2010, 13:42
|
Группа: Участник
Сообщений: 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 -заданное значение. Когда движок доезжает до заданного места (совпадает значение энкодера и заданное), происходит перезапуск по ватчдогу.
|
|
|
|
|
 |
Ответов
|
May 19 2010, 11:23
|
Группа: Участник
Сообщений: 11
Регистрация: 13-05-10
Пользователь №: 57 239

|
Цитата(AHTOXA @ May 19 2010, 11:18)  В void process() засуньте весь код из первого поста. Новые цели обновляются сами по себе, из другого процесса (который UART). +1:) Но можно им сказать, что UART самый приоритетный, зачем расстраивать людей?  А что, можно одну функцию класса использовать другую функцию? В самом простом случае мой процесс будеть выглядеть просто process(){ if ( where()!= target) {go(target); } } а в сетевом (uart) использовать where() для ответ на запрос текущего угла?
|
|
|
|
|
May 19 2010, 12:58
|

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

|
Цитата(Nikkola @ May 19 2010, 17:23)  А что, можно одну функцию класса использовать другую функцию? Конечно! (если она public ) Цитата В самом простом случае мой процесс будеть выглядеть просто
process(){ if ( where()!= target) {go(target); } } а в сетевом (uart) использовать where() для ответ на запрос текущего угла? Да. ЗЫ. Здесь есть маленький подвох - если go() будет длиться долго, то до её завершения нельзя будет снова изменить target, вернее, изменение не подействует. Поэтому желательно сделать go() достаточно короткой. Но это уже детали.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
May 24 2010, 12:11
|
Группа: Участник
Сообщений: 11
Регистрация: 13-05-10
Пользователь №: 57 239

|
Получилось, что неправильно распределены ресурсы Мк. Есть ли инструкция как расчитывать RSTACK CSTACK? Дебаггер пишет, что указатели стэков OUT of range. Что именно значат настройки проекта в GENERAL->System? Какая там арифметика в ИАР АВР? Заранее благодарен.
|
|
|
|
|
May 24 2010, 19:38
|
Группа: Участник
Сообщений: 11
Регистрация: 13-05-10
Пользователь №: 57 239

|
Цитата(Сергей Борщ @ May 24 2010, 18:48)  Придется с этим смириться. Он не имеет понятния об ОС и о нескольких стеках. Или покупать у IAR sdk и писать свой плугин для c-spy. Вы понаблюдайте за данными в начале массивов стеков для каждого процесса - если там нули, значит стека еще хватает. Как же быть? Сколько выделить в SYSTEM под CSTACK RSTACK? Сколько выделить в IDLE и в пользовательских процессах, чтоб все работало, а так две мои глобальные переменные типа word забиваются единицами. Есть ли общие рекомендации, какие - нибудь итерации к расчету оптимальных стеков, методы научного тыка и т.п. А диагностические сообщения я и прежде на рабочих проектах видел, а вот теперь попал.
|
|
|
|
Сообщений в этой теме
Nikkola Зависает низкоприритетный процесс May 13 2010, 13:42 AHTOXA В приведённом коде виснуть нечему. Видимо меняются... May 13 2010, 15:10 Nikkola Цитата(AHTOXA @ May 13 2010, 19:10) В при... May 18 2010, 07:24  AHTOXA Суть не в том, что это были глобальные переменные,... May 18 2010, 07:52   Nikkola Цитата(AHTOXA @ May 18 2010, 11:52) Суть ... May 18 2010, 12:31    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 18 2010, 18:31) Спас... May 18 2010, 14:04
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|