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

 
 
> Проблемы с приоритетами процессов
Anatoly74
сообщение Apr 16 2015, 09:59
Сообщение #1





Группа: Участник
Сообщений: 10
Регистрация: 28-10-10
Пользователь №: 60 480



Игрался с китом Discovery STM32F401. Состряпал для порта М4 простейший пример из 3-х процессов. Все они ждут одного события Flag.signal и зажигают один из 3-х светодиодов. Событие Flag.signal формируется каждые 0.5 сек по системному таймеру. Если scmRTOS_PRIORITY_ORDER = 1 все работает нормально и процессы переключаются в порядке их приоритетов: pr0 -> pr1 -> pr2.
Устанавливаю scmRTOS_PRIORITY_ORDER = 0 и вижу, что порядок переключения остался тем же: pr0 -> pr1 -> pr2. Он не изменяется.
Тогда я взял порт для М3 и прогнал тест на нем. Все то же самое.
Объясните дураку, что я делаю не так.
Вот тексты:

Код
//---------------------------------------------------------------------------
//      Process types
//
typedef OS::process<OS::pr0, 400> TProc1;
typedef OS::process<OS::pr1, 400> TProc2;
typedef OS::process<OS::pr2, 400> TProc3;

TProc1 Proc1;
TProc2 Proc2;
TProc3 Proc3;

OS::TEventFlag Flag;
//---------------------------------------------------------------------------

template<> OS_PROCESS void TProc1::exec()
{
    for(;;)
    {    
               Flag.wait();
        clear_all_VD();
        SetPORT(GPIOD, VD_ORANGE);
    }
}
//---------------------------------------------------------------------------
template<> OS_PROCESS void TProc2::exec()
{
    for(;;)
    {    Flag.wait();
        
        clear_all_VD();
        SetPORT(GPIOD, VD_RED);
     }
}
//---------------------------------------------------------------------------
template<> OS_PROCESS void TProc3::exec()
{
    for(;;)
    {    Flag.wait();
        
        clear_all_VD();
        SetPORT(GPIOD, VD_BLUE);
     }
}
//===================================================

void OS::system_timer_user_hook()
{
    static int16U Tics=0, Cnt=0;
    
    if (++Tics < 250)    return;
    
    Tics = 0;                        // 0.5 сек
    if (++Cnt >= 4)        Cnt = 0;

        Flag.signal_isr();
}

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Apr 16 2015, 10:58
Сообщение #2


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

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



А что делает clear_all_VD()? Гасит все светодиоды? Если так, то первые два светодиода будут гореть совсем короткое время, порядка 2 мкс. Вы смотрите осциллографом? Для наглядности я бы сделал иначе: гасил бы диоды в OS::system_timer_user_hook(), перед взводом флага. И в каждой задаче после зажигания диода вставил бы задержку глухим циклом тысяч на 100. Вот тогда будет видно.
(Замечу, что scmRTOS_PRIORITY_ORDER = 0 в кортексах работает гораздо медленнее, чем scmRTOS_PRIORITY_ORDER = 1. Так что смысла в scmRTOS_PRIORITY_ORDER = 0 нет, разве что в познавательных целях).

ЗЫ. В OS::system_timer_user_hook() Cnt у вас ни на что не влияет (не хватает скобочек).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Anatoly74
сообщение Apr 16 2015, 12:51
Сообщение #3





Группа: Участник
Сообщений: 10
Регистрация: 28-10-10
Пользователь №: 60 480



Цитата(AHTOXA @ Apr 16 2015, 14:58) *
А что делает clear_all_VD()? Гасит все светодиоды? Если так, то первые два светодиода будут гореть совсем короткое время, порядка 2 мкс. Вы смотрите осциллографом? Для наглядности я бы сделал иначе: гасил бы диоды в OS::system_timer_user_hook(), перед взводом флага. И в каждой задаче после зажигания диода вставил бы задержку глухим циклом тысяч на 100. Вот тогда будет видно.
(Замечу, что scmRTOS_PRIORITY_ORDER = 0 в кортексах работает гораздо медленнее, чем scmRTOS_PRIORITY_ORDER = 1. Так что смысла в scmRTOS_PRIORITY_ORDER = 0 нет, разве что в познавательных целях).

ЗЫ. В OS::system_timer_user_hook() Cnt у вас ни на что не влияет (не хватает скобочек).

Да, clear_all_VD() гасит все светодиоды. Порядок переключение задач я смотрел по точкам останова с помощью внутрисхемного эмулятора.
Осциллографом было бы менее наглядно.
Поставил задержки, как вы советовали. Да, стало визуально видно, но проблема осталась.
Содержимое scmRTOS_PRIORITY_ORDER не влияет на порядок переключения.
Go to the top of the page
 
+Quote Post



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

 


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


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