我的任务是修复一个用C/C++编写的嵌入式操作系统。当前使用的线程调度器与Round Robin Scheduling非常相似,除了它缺少一个非常重要的特性,即中断线程然后返回执行的能力,从而创建一个可靠的执行时间“切片”。
我的问题是,如何中断正在运行的代码,执行另一个任务,然后优雅地返回执行?我相信这种行为需要特定于架构的汇编器。这就是操作系统将要运行的芯片:http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MPC860
顺便说一句,这是航空电子软件,所以它必须是“确定性”的。除此之外,没有堆使用,所有内存都必须是有界的。
当前的系统是一个“周期性过程”,在这个过程中,下一个任务必须等待第一个任务完成。这很简单,很可怕,如果操作系统的一部分崩溃了,比如说ATN栈,那么整个操作系统就会瘫痪。(在此处插入坠毁的飞机...虽然这是B级软件,这意味着即使系统崩溃,飞机也不会坠毁。)
发布于 2010-01-19 01:52:34
免责声明:不要使用我的建议。找一个专家,如果人们的幸福依赖于一个系统,那么不要把它留给机会/黑客/所以建议!
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
发布于 2010-01-19 01:48:42
如果这是一个操作系统,实际上是一个操作系统,它当然是在和硬件对话。它必须进行中断处理才能处理I/O设备。
有时定时器中断将来自CPU本身,但在其他系统架构中,它将来自IO控制器或其他设备。
一种通用的设计替代方案是只分配较小的CPU时间,以便调度器可以更频繁地重新考虑,但没有人能从这里判断这是否会使您的特定问题变得更好或更糟。
所以真的没有人能够在这里给你一个详细的处方。
当然,除了向联邦航空局报告你的雇主。
发布于 2010-01-19 01:54:58
如果我没看错你的问题,我认为你想给你的调度器增加线程优先级。调度具有相同优先级轮询的所有线程,但允许较高优先级抢占较低优先级线程。
您必须已经具备了将线程的上下文保存和恢复到循环时间切片的工具。
https://stackoverflow.com/questions/2087989
复制相似问题