2010-01-18 61 views
0

我已经被赋予了修复用C/C++编写的嵌入式操作系统的任务。当前正在使用的线程调度程序与Round Robin Scheduling非常相似,只是它缺少一个非常重要的功能,即中断线程并返回执行的能力,从而创建可执行时间的“切片”。实时嵌入式操作系统的线程调度程序

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

在附注中,这是航空电子软件,因此它必须是“确定性”。除此之外,没有堆用法,所有内存都必须有界。

目前的系统是“周期性的过程”中的下一个任务必须等待第一个完成。这很简单可怕,如果操作系统的某个部分崩溃了,让我们说ATN堆栈,那么整个操作系统就会陷入困境。 (插入失事飞机在这里......虽然这是B类的软件,这意味着如果系统的飞机将不会崩溃。)

+7

把时间从航空公司拉出来。我想认为编写航空电子软件的人知道这些答案! – 2010-01-18 17:42:18

+1

不幸的是,'导航危害'不是一个有效的密切原因。 – bmargulies 2010-01-18 17:49:37

+5

废话,不要试图自己在(大概)安全关键软件中做到这一点。航空电子不适用于业余爱好者。目前已有数百万种商业实现需求,其中许多已经在飞行认证应用中使用。去买那些。 – Novelocrat 2010-01-18 17:58:36

回答

7

免责声明:请不要使用我的建议。找一个专家,如果人们的幸福取决于一个系统,那么不要把它留给偶然/黑客/ SO建议!

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

你应该能够写入其以公知的时间间隔通过中断进入了新的方法,使用现有的调度功能保存线程状态和改变线程上下文。此外,确保您的锁定原语与新的调度一起工作,并且您不会混淆基于非原子/非指令的锁定或任何其他事物。

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

Modern Operating Systems 3rd Edition包含理论上的一些很好的块,但实现取决于现有代码和最佳实践,以及内核中处理中断,信号等的其他代码。

而且“实时系统设计与分析菲利普。Laplante提供”可以用于适配现有的调度新的要求一个很好的资源。Another interesting bit of text

4

如果这是一个操作系统,一个真正的操作系统,当然它的交谈,硬件。它必须有中断处理才能处理I/O设备。

有时定时器中断将来自CPU本身,但在其它的系统体系结构它将来自IO控制器或一些其它装置。

一个通用的设计替代方案是只在小量子块中提供CPU时间,以便调度程序可以更频繁地重新考虑,但是从这里没有人能够告诉您这个问题是否会让您的问题更好或更糟。

所以这是实在没办法的人是要能够在这里给你一个详细的药方。

除,当然,你的雇主报告给FAA。

+0

我认为你错了。 – rook 2010-01-18 18:09:35

+1

好吧,显然,因为你低估了我。小心解释*为什么*?或者细节*在哪些方面*?我在1982年编程这种事情。 – bmargulies 2010-01-18 18:12:13

+0

很好的答案。 +1 – 2010-01-18 18:17:56

1

如果我正确地阅读了你的问题,我想你想给你的调度器添加线程优先级。调度相同优先级循环的所有线程,但允许更高优先级抢占较低优先级的线程。

您必须已经有设施来保存和恢复线程的上下文才能进行循环时间分片。

+0

不是,它是一个周期性的过程,下一个任务必须等待第一个完成。 – rook 2010-01-18 18:10:08

+2

哇。我很惊讶,我不是从你清晰简明的问题描述中理解的。祝你好运。 – 2010-01-18 18:13:02

+0

对我有+1 ...噶和所有:) – 2010-01-18 18:14:09

相关问题