【问题标题】:Is it possible to design Arinc653 scheduler with Azure-RTOS?是否可以使用 Azure-RTOS 设计 Arinc653 调度程序?
【发布时间】:2021-12-18 10:25:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: threadx azure-rtos arinc


    【解决方案1】:

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

    【讨论】:

    • 啊,是的,我已经看到并尝试了一些没有运气的东西。我应该在问题中提到这一点。谢谢。
    【解决方案2】:

    我了解您要模拟的 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);
      }
    }
    

    【讨论】:

    • 这可能值得一试,但似乎并不直观。我猜threadx有一种优雅的方式来做到这一点。无论如何,如果我们被允许,其他选项包括修改调度程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 2012-01-15
    • 2015-05-05
    • 1970-01-01
    相关资源
    最近更新 更多