0

我想设计一个以Arinc653方式工作的调度程序,仅用于实验问题。有可能以这种方式操纵调度程序吗?

我知道 threadX 中有时间切片,但我遇到的所有示例都使用 TX_NO_TIME_SLICE (而且我的镜头也不起作用。)。此外,我不确定时间片是否让线程等到它的截止日期到来或让它进入睡眠状态以便其他线程开始运行。

简称;Arinc653 调度程序定义了一个恒定的主帧,每个“线程”都有其确定的运行时间,并无休止地重复主帧。如果一个线程在主帧内分配了 ie 3ms 并且它在 1ms 内完成了它的工作;内核仍然等待 2ms 来切换下一个“线程”。

4

2 回答 2

0

我了解您要模拟的 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);
  }
}
于 2021-11-05T14:06:46.947 回答
0

您可以使用时间切片来限制每个线程运行的时间量:https ://docs.microsoft.com/en-us/azure/rtos/threadx/chapter4#tx_thread_create

于 2021-11-05T06:21:34.507 回答