Можно ли разработать планировщик 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);
  }
}
Другие вопросы по тегам