Можно ли разработать планировщик Arinc653 с помощью Azure-RTOS?
Я хочу разработать планировщик, работающий в стиле Arinc653 , только для экспериментальных задач. Можно ли таким образом управлять планировщиком?
Для краткости; Планировщик Arinc653 определяет постоянный главный кадр, в котором каждый «поток» имеет определенное количество времени выполнения и повторяет основной кадр бесконечно.
2 ответа
Вы можете использовать квантование времени, чтобы ограничить время выполнения каждого потока: https://docs.microsoft.com/en-us/azure/rtos/threadx/chapter4#tx_thread_create
Я понимаю, что характерной чертой планировщика Arinc653, которую вы хотите эмулировать, является временное разделение. Политика расписания ThreadX основана на приоритете, пороге прерывания и временном интервале.
Вы можете эмулировать временное разделение с помощью ThreadX. Для этого вы можете использовать таймер, где вы можете приостанавливать / возобновлять потоки для каждого кадра. Таймеры выполняются в другом контексте, чем потоки, они легковесны и не зависят от приоритетов. По умолчанию ThreadX использует поток таймера с наивысшим приоритетом для выполнения потоков; но для повышения производительности вы можете скомпилировать ThreadX для запуска таймеров внутри IRQ (определите параметр TX_TIMER_PROCESS_IN_ISR).
Пример:
- Потоки thd1,thd2,thd3 принадлежат кадру A
- Потоки thd4,thd5,thd6 принадлежат кадру B
- Таймер tm1 срабатывает при каждой смене кадра
Псевдокод для tm1:
tm1()
{
static int i = 0;
if (i = ~i)
{
tx_thread_suspend(thd1);
tx_thread_suspend(thd2);
tx_thread_suspend(thd3);
tx_thread_resume(thd4);
tx_thread_resume(thd5);
tx_thread_resume(thd6);
}
else
{
tx_thread_suspend(thd4);
tx_thread_suspend(thd5);
tx_thread_suspend(thd6);
tx_thread_resume(thd1);
tx_thread_resume(thd2);
tx_thread_resume(thd3);
}
}