在大型实时系统中使用Haskell:如何(如果?)?

在大型实时系统中使用Haskell:如何(如果?)?,haskell,embedded,real-time,hard-real-time,Haskell,Embedded,Real Time,Hard Real Time,我一直很想知道是否有可能将Haskell的强大功能应用到嵌入式实时世界中,我在谷歌上找到了这个软件包。我假设在复杂的情况下,代码可能会有所有经典的C错误——崩溃、内存损坏等,然后需要追溯到 造成了他们。因此,这是问题的第一部分:“如果您有使用Atom的经验,您是如何处理在编译的C代码中调试低级错误并在Haskell原始代码中修复它们的任务的?” 我搜索了更多的Atom示例,提到了生成的C代码22KLOC(显然没有代码:),这是一个玩具。引用中有一些更实用的代码,但这就是本文的结尾。我之所以把“s

我一直很想知道是否有可能将Haskell的强大功能应用到嵌入式实时世界中,我在谷歌上找到了这个软件包。我假设在复杂的情况下,代码可能会有所有经典的C错误——崩溃、内存损坏等,然后需要追溯到 造成了他们。因此,这是问题的第一部分:“如果您有使用Atom的经验,您是如何处理在编译的C代码中调试低级错误并在Haskell原始代码中修复它们的任务的?”

我搜索了更多的Atom示例,提到了生成的C代码22KLOC(显然没有代码:),这是一个玩具。引用中有一些更实用的代码,但这就是本文的结尾。我之所以把“sizeable”放在这个主题中,是因为我最感兴趣的是,如果你能分享你在300KLOC+范围内使用生成的C代码的经验

由于我是一名Haskell新手,很明显,由于我未知的未知因素,可能还有其他我没有找到的方法,因此,我非常感谢在这一领域的任何其他自我教育的建议——这是问题的第二部分——“在Haskell中进行实时开发的其他实用方法(如果)是什么?”。如果多核也在图片中,这是一个额外的加号:-)

(关于Haskell本身的用途:从我在中读到的内容来看,Haskell中的垃圾收集和懒惰使得它在调度方面变得相当不确定,但可能在两年后有些变化。关于SO的问题是我能找到的最接近这个主题的问题)


注意:上面的“实时”更接近于“硬实时”-我很好奇是否可以确保主任务未执行时的暂停时间在0.5ms以下。

很长一段时间后,才会出现适合小内存并能保证亚毫秒暂停时间的Haskell系统。Haskell实现者社区似乎对这种目标不感兴趣

人们对使用Haskell或Haskell喜欢编译成非常高效的东西有着浓厚的兴趣;例如,编译为硬件


我认为它不能满足您的需求,但如果您对函数式编程和嵌入式系统感兴趣,您应该了解。

我不认为Haskell或其他垃圾收集语言非常适合硬实时系统,因为GC倾向于将运行时分摊到短暂停中

在Atom中编写并不完全是在Haskell中编程,因为这里的Haskell可以被看作是您正在编写的实际程序的一个纯粹的预处理器

我认为Haskell是一个很棒的预处理器,使用DSEL的Atom可能是创建大型硬实时系统的好方法,但我不知道Atom是否符合要求。如果没有,我非常肯定有可能(并且我鼓励任何有可能的人!)实现一个这样做的DSEL


对于低级语言,有一个非常强大的预处理器,如Haskell,这为通过代码生成实现抽象打开了一个巨大的机会之窗,而代码生成在实现为C代码文本生成器时要复杂得多。

在Galois,我们使用Haskell实现两件事:

  • 软实时(操作系统设备层、网络),其中1-5毫秒的响应时间是合理的。GHC生成快速的代码,并对调整垃圾收集器和调度程序以获得正确的计时提供了大量支持
  • 对于真正的实时系统,EDSL用于为其他语言生成代码,从而提供更强的时间保证。例如加密、原子和副驾驶
因此,要小心区分EDSL(副驾驶或Atom)和宿主语言(Haskell)


一些关键系统的例子,在某些情况下,是实时系统,由Galois编写或由Haskell生成

EDSLs

  • --用于实时航空电子设备监控的DSL
  • --用于关键系统加密组件的DSL
系统

  • --用于嵌入式和移动应用程序的轻量级微内核
  • --跨域(安全级别)网络设备
  • 安德鲁


    是的,通过生成的代码将问题调试回原始源代码可能很棘手。Atom提供的一个功能是探测内部表达式,然后将如何处理这些探测留给用户。对于车辆测试,我们构建了一个发射器(在Atom中),并通过CAN总线将探头输出。然后,我们可以捕获这些数据,将其格式化,然后使用诸如GTKWave之类的工具进行查看,无论是在后处理还是实时。对于软件模拟,探针的处理方式不同。不是从CAN协议获取探测数据,而是对C代码进行挂钩,以直接提升探测值。然后在单元测试框架(与Atom一起分发)中使用探测值来确定测试是否通过,并计算模拟覆盖率

    我一直在和Atom鬼混。这很酷,但我认为它最适合小型系统。是的,它可以在卡车和公共汽车上运行,并实现现实世界中的关键应用程序,但这并不意味着这些应用程序一定是大型或复杂的。它确实适用于硬实时应用程序,并竭尽全力使每个操作花费的时间完全相同。例如,与有条件地执行两个运行时间可能不同的代码分支之一的if/else语句不同,它有一个“mux”语句,在有条件地选择两个计算值之一之前始终执行两个分支(因此无论选择哪个值,总执行时间都相同)。除了通过Atom monad传递的GADT值强制执行的内置类型(与C相当)之外,它没有任何重要的类型系统。作者