Игрался с китом 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();
}