为什么RTOS仅在c中编码?

时间:2009-12-18 09:34:24

标签: java c rtos

是否有必要始终使用C语言编写RTOS?为什么不能用java或其他技术编码.. ??这是因为java中没有指针概念吗?

16 个答案:

答案 0 :(得分:16)

垃圾收集是Java成为实时的重要原因。 JIT是另一个,但它可以克服。

一般而言,C是有效的可移植组件,可提供非常可预测的运行时性能,这对于可靠的实时执行至关重要。

答案 1 :(得分:9)

实时系统也可以用其他语言编程。例如,Java有一个Java RTS System

与其他答案相反,实时垃圾收集的工作量合理。但是,这些不会捆绑在您的典型发行版中。

值得关注的是,其他语言通常具有难以实现确定性和可靠性的功能,例如传统的垃圾收集,JIT,运行时优化等。

答案 2 :(得分:8)

首先,RTOS不仅用C编码。它们也可以用其他语言编码。但是,用于RTOS的语言需要提供确定性行为。这意味着特定操作的延迟必须始终在特定的时间内。这排除了例如垃圾收集,在大多数实现中,垃圾收集将在不确定的时间内停止所有线程的执行。

答案 3 :(得分:7)

因为RTOS开发人员很可能不太了解C ++。

C++ in Embedded Systems: Myth and Reality

  

有些人认为C ++有开销   和以某种方式呈现它的成本   不适合嵌入式系统   编程,它缺乏控制   C的简洁,或者它的简洁   可能适合某些利基   应用程序,它永远不会取代C   作为嵌入式的首选语言   系统

     

这些看法是错误的。哪里   编译器和其他工具   足够的,C ++总是比较好   C作为实现语言   嵌入式系统。在做的时候   C所做的一切,它提供   更大的表达机会,   封装,重复使用,甚至它   允许尺寸和速度的改进   这在C中是不切实际的。

     

<强>&GT;那么,为什么要做这些看法呢   坚持?主要原因是什么时候   他们知道,人们形成了自己的观点   关于C比关于C ++更多。   他们读了一些书,写的   一些代码,并有能力使用   C ++的功能,但他们缺乏   了解正在发生的事情   引擎盖,允许的熟悉程度   一个可视化拆卸的同时   输入源甚至是   制定设计。

Guidelines for using C++ as an alternative to C in embedded designs

  

嵌入式软件应用程序最常用C语言编写。多年来,C ++一直使用   被视为自然接班人并且已经获得了更大的接受度,但是增加了   它的使用速度比预期慢得多。

     

这有很多原因。首先,嵌入式开发人员是相当的   保守而且更喜欢使用经证实而非新颖的解决方案“”   没有破产,不要修理它。“

     

还有经验教训。许多开发人员都试图使用C ++   嵌入式应用程序并失败这种失败有时可能归因于   开发工具的缺点,但最常见的是它的使用不当   语言“将台式计算机视为嵌入式系统”应该受到指责。

     

C的限制   虽然C被广泛使用,但它有局限性,因为它不是为嵌入式设计的   应用程序或现在普遍存在的规模项目。主要限制包括:

     

1)C非常强大和灵活,因此可能很危险。(它的水平很低   能力 - 这对嵌入式有用“但也代表了许多陷阱   粗心。)

     

2)程序员需要非常有条理和纪律

     

3)程序员需要了解程序在低级别和高级别(大型)的行为方式   因此很难维护项目)

     

4)程序员需要具备应用程序的专业知识

     

但是,C ++具有强大的面向对象功能,可以显着提高   解决C的限制:

     

1)它将非专家的高度专业知识封装并隐藏在“对象”中。 (一个   测试用例将在后面的第2部分中展示专业知识的封装   系列)。

     

2)非专家可以直观地使用对象来实现概念设计   高级

答案 4 :(得分:6)

  • 针对RTOS通常运行的所有硬件提供高度优化的c编译器。
  • 您可以相对轻松 包括非常低级别的优化 用c-code。
  • 很多c-code的可用性 有用的低级系统工具 因此很容易被纳入。

答案 5 :(得分:6)

不是“必要的”,但更实用

作为一种语言,可以使用Java,并且实际上发生了各种古怪的案例。

但是一些边缘案例和演示实际上更多是“证明规则的例外”

通常,Java是一个用于业务逻辑而非OS内核的精心设计的系统。

如果我们还没有C ,那么Java可能在不同的方向或多个方向上发展。

但我们确实拥有C,这对于操作系统内核来说几乎是完美的,对业务逻辑来说也是一个挑战。

对于内核,Java与C一样好的论点与C对应用程序的Java一样好。经验,减去一些边缘的例子,绝对证明了每种语言的好处。

答案 6 :(得分:5)

根据定义,RTOS必须支持确定性调度和执行。通常,低中断延迟和直接硬件访问也是一个理想的因素。 Java中使用的技术,如垃圾收集,JIT编译和字节码执行,使这些目标难以实现。

Java可以在实时系统中使用,但通常它在 RTOS上运行而不是在其实现中使用。

总而言之,建议RTOS始终用C实现同样是不正确的。任何系统级语言都适用,包括汇编程序。在大多数情况下,至少内核的某些部分在任何情况下都是汇编程序。 C ++是一种合适的语言(很明显,因为它本质上是一个C超集),许多商业RTOS在任何情况下都有C ++包装器;我习惯为RTOS开发C ++抽象层以支持可移植性。

通常使用C的另一个原因是因为C(通常是C / C ++)编译器通常是新架构中可用的第一种且通常是唯一的语言(除汇编程序外)(现在通常是以GNU编译器实现)。因此,如果您希望能够将RTOS移植到最广泛的平台,那么使用最普遍的语言是有意义的。

答案 7 :(得分:3)

我认为java用于此目的的最大问题是自动垃圾收集。这是关于在java中创建实时系统的link

答案 8 :(得分:3)

因为基于C的RTOS众所周知并且已经使用了数十年。他们的行为对于许多特定情况都是可预测的,你可以找到很多专家来开发这些系统。

我知道没有基于Java的RTOS达到一定程度,以至于制作安全关键实时应用程序的公司会采用它。

从技术上讲,没有针对基于Java的RTOS的争论,但关于该主题的研究,工程和产品尚未成熟。

答案 9 :(得分:2)

Java中有实时,但它需要操作系统的支持。 请参阅:http://java.sun.com/javase/technologies/realtime/index.jsp

答案 10 :(得分:2)

  

是否有必要使用C语言编写RTOS?

没有。您也可以在汇编程序,Ada和其他一些代码中编写RTOS代码。

  

为什么不能用java或其他技术编码.. ??这是因为java中没有指针概念吗?

没有。不可预测的代码执行时间。

答案 11 :(得分:1)

C是为编写操作系统而设计的,因此使用了常用的“便携式汇编程序”,因此可以预期它会用于此目的。

如果您想拥有实时Java,Sun可以提供商业服务。

答案 12 :(得分:1)

如果有的话,那是因为指针。在Java中,除了基本数据类型之外的所有内容都在堆上分配,任何不像int的变量都是指针。这不是编写操作系统的好方法,因为它在大多数操作中强加了一层间接,而在操作系统编写中,该层可能会杀死你。

操作系统内核是您需要优化和高性能的地方,因为您不知道将在其上运行什么。对于实时操作系统尤其如此,其中半毫秒延迟可能至关重要。这需要在CPU和其他硬件上变得非常亲密,并且能够编写高度微优化的代码,以便以可预测的方式执行特定的事情。

出于这个原因,C是构建RTOS内核的非常好的工具,Java不是。这并不意味着你不能用Java做到这一点,但它会更难,也可能不那么成功。

我很好奇为什么你问这个问题。如果您正在使用RTOS,那么它的写入并不重要。如果您想要破解它,那么它的内容确实很重要,但操作系统的概念和实现本身就足够了学习一门新语言是很容易学习的。 (此外,如果您研究操作系统的设计和实现,您几乎肯定会发现您使用的资源将使用C作为教学语言。)

答案 13 :(得分:1)

RTOS并不总是用C语言编写。通常是这样,但在ThreadX中我认为它们使用汇编。

答案 14 :(得分:-2)

像Java这样的垃圾收集语言高度不适合用于实时编程。原因应该是显而易见的。

答案 15 :(得分:-3)

  

是否有必要使用C语言编写RTOS?

没有。例如,有用Lisp或Smalltalk编写的RTOS。

  

为什么不能用java或其他技术编码.. ??

是什么让你觉得它不能?

  

这是因为java中没有指针概念吗?

不,这是因为有一个神话,操作系统只能用C语写。一个可以被轻易证明是错误的神话,但仍然拒绝死亡。

这个神话是如此普遍,以至于那些想要编写新操作系统的人太害怕尝试除C以外的其他任何东西。