代码之家  ›  专栏  ›  技术社区  ›  rook

实时嵌入式操作系统的线程调度程序

  •  0
  • rook  · 技术社区  · 15 年前

    我的任务是修复一个用C/C++编写的嵌入式操作系统。当前使用的线程调度程序与 Round Robin Scheduling 除了它缺少一个非常重要的特性外,它还能够中断线程,然后返回执行,从而创建可靠的执行时间“切片”。

    我的问题是,如何中断运行代码,执行另一个任务,然后优雅地返回执行?我相信这种行为需要特定于体系结构的汇编程序。这是操作系统运行的芯片: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MPC860

    另一方面,这是航空电子软件,所以它必须是“确定性的”。除此之外,没有堆的使用,所有内存都必须是有界的。

    当前系统是一个“周期性过程”,其中下一个任务必须等待第一个任务完成。这很简单,很可怕,如果操作系统的一个部分崩溃,比如ATN堆栈,那么整个操作系统都会瘫痪。(在此处插入坠毁的飞机…虽然这是B级软件,这意味着如果系统发生故障,飞机不会坠毁。)

    3 回复  |  直到 15 年前
        1
  •  7
  •   Aiden Bell    15 年前

    免责声明:不要使用我的建议。找一个专家,如果人们的幸福依赖于一个系统,那么不要把它留给机会/黑客/所以建议!

    Plane oops http://xs.to/thumb-AF83_4B54A285.jpg

    您应该能够编写一个新的过程,该过程通过中断以已知的时间间隔输入,使用现有的调度函数保存线程状态,并更改线程上下文。另外,请确保您的锁定原语与新的调度一起工作,并且您不会将非原子/非指令的T&S锁定或其他任何内容聚集在一起。

    This website 提供关于线程切换、状态保存等的良好信息。最终,中断是特定于您的CPU/硬件的。保存线程状态的方式还取决于系统的约束和所使用的线程结构。

    Modern Operating Systems 3rd Edition 包含一些理论上的好代码块,但是实现依赖于现有的代码和您所使用的硬件的最佳实践,以及内核中处理中断、信号等的其他代码。

    另外,“Phillip A.Laplante的实时系统设计和分析”可能是一个很好的资源,可以使您现有的调度程序适应新的需求。 Another interesting bit of text

        2
  •  4
  •   bmargulies    15 年前

    如果这是一个操作系统,实际上是一个操作系统,当然它是在和硬件对话。它必须有中断处理才能处理I/O设备。

    有时,计时器中断将来自CPU本身,但在其他系统架构中,它将来自IO控制器或其他设备。

    一个通用的设计方案是只在小的量子中分配CPU时间,这样调度程序就可以更频繁地重新考虑,但是没有人能从这里分辨出这是否会使您的特定问题变得更好或更糟。

    所以这里真的没有人能给你开详细的处方。

    当然,除了向联邦航空局报告你的雇主。

        3
  •  1
  •   Richard Pennington    15 年前

    如果我正确地阅读了您的问题,我认为您希望向调度程序添加线程优先级。调度同一优先级循环的所有线程,但允许更高优先级抢占较低优先级的线程。

    您必须已经具有将线程上下文保存和还原为循环时间切片的功能。