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

 
 
 
Reply to this topicStart new topic
> Проблемы с приоритетами процессов
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
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
AHTOXA
сообщение Apr 16 2015, 17:12
Сообщение #4


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

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



Цитата(Anatoly74 @ Apr 16 2015, 17:51) *
Содержимое scmRTOS_PRIORITY_ORDER не влияет на порядок переключения.

Я что-то затупил. Конечно не влияет! sm.gif
При любом значении scmRTOS_PRIORITY_ORDER OS::pr0 - это наивысший приоритет, OS::pr1 - следующий, и так далее.
scmRTOS_PRIORITY_ORDER влияет лишь на внутреннее представление значений приоритета.


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





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



Цитата(AHTOXA @ Apr 16 2015, 21:12) *
scmRTOS_PRIORITY_ORDER влияет лишь на внутреннее представление значений приоритета.

Из документации на V4.0 я понял, что scmRTOS_PRIORITY_ORDER задает порядок старшинства приоритетов процессов.
Например, если у нас описан процесс:
typedef OS::process<OS::pr0, 400> TProc1;
Тогда при scmRTOS_PRIORITY_ORDER=0, pr0 - это наивысший приоритет.
А при scmRTOS_PRIORITY_ORDER=1, pr0 - это низший приоритет, т.е. в этом случае TProc1 будет иметь наименьший приоритет.
Я не правильно понял?

Кажется, я разобрался. Приоритет pr0 - это в любом случае всегда самый наивысший приоритет.
А значение scmRTOS_PRIORITY_ORDER задает место pr0 (старший или младший бит) во внутренней карте процессов.
Я не правильно истолковал смысл фразы на стр. 42: " scmRTOS_PRIORITY_ORDER 0/1 - Задаёт порядок старшинства
приоритетов."

Я думаю, чтобы не возникало всяких кривотолков надо заменить на стр. 42 фразу "Задаёт порядок старшинства
приоритетов"
на "задает место pr0 (старший или младший бит) во внутренней карте процессов".

Сообщение отредактировал Anatoly74 - Apr 17 2015, 05:38
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 17 2015, 05:43
Сообщение #6


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

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



Цитата(Anatoly74 @ Apr 17 2015, 10:36) *
Я думаю, чтобы не возникало всяких кривотолков надо заменить на стр. 42 фразу "Задаёт порядок старшинства
приоритетов"
на "задает место pr0 (старший или младший бит) во внутренней карте процессов".

Да, согласен, немного неоднозначно написано.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 17 2015, 08:54
Сообщение #7


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Документация откорректирована по замечанию с целью устранения неоднозначности понимания. Спасибо за сигнал.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:44
Рейтинг@Mail.ru


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