如何将软件修改为实时?[关闭]


9

首先,我想提到我是实时系统编程的新手,这就是为什么我不确定我的问题是否正确的原因。抱歉,我需要一些帮助

简而言之,问题是: 如何实施硬实时软件以确保其在硬期限内完成?是否有必要使用某些QNX功能?还是足以为Linux编写它,移植到QNX并默认为实时?

完整问题: 我们已经针对Linux,Windows,Android和QNX实现了一些具有进程间通信的复杂跨平台多进程软件。编程语言是C ++,我们使用Boost和其他库的planty。我们的软件可以很好且快速地完成工作,但它仍是原型。出于生产目的,我们需要实时进行操作,因为某些功能非常重要,因此某些功能必须实时且非常可靠,并且使用我们软件的人员的安全性可能取决于这些功能。它们的工作速度非常快-高达数百毫秒。但是由于这个事实,我不确定我们的系统是否是实时的(我对吗?)。

因此,存在一个主要问题:如何将我们的软件修改为实时的?我已经用谷歌搜索了很多,但是我仍然不知道该怎么做。

有关平台的一些其他信息:Linux和Windows,我们目前仅用于测试目的。Android-我们仍未决定是否需要它。QNX-是我们生产的目标操作系统。我想我的下一个问题的答案是“否” :)但是,是否有可能实施跨平台的实时软件(用于实时OS(RTOS)以及用于通用OS(GPOS))?

可能我们需要努力只为QNX实施所有实时功能吗?但是我还是不知道该怎么做。有人可以阐明这个问题吗?


55
如果您的项目对安全至关重要,那么您确实需要了解工资单上实时系统的人员。
Blrfl

18
实时系统是指代码在执行时间方面的精确程度,而不是速度的快慢。
Pagotti'1

22
我的感觉是,您不会修改现有软件以使其成为实时软件,而是在考虑到明确的实时约束的情况下从头设计编写新软件。您的问题太广泛了:您的软件到底在做什么?在哪种精确的实时系统上,对于哪种具体的嵌入式系统(目的:商用飞机的机载信息娱乐与核反应堆控制不同)?您需要编辑您的问题,使其更加具体,精确并激发它。
巴西尔·斯塔林凯维奇

24
重读@Blrfl的评论。然后一次又一次地重新阅读它,直到您雇用了具有适当经验的人。或确保您的责任保险已付清。因为如果您正在创建具有实时需求的安全关键软件,并且没有该经验,那么您将被刑事疏忽。
kdgregory

4
您问:“ 完全有可能实现跨平台的实时软件(用于实时OS(RTOS)以及用于通用OS(GPOS))吗? ”我的猜测是,否则,RTOS不会存在。“跨平台”与“圣杯”非常相似。

Answers:


38

快速并不意味着实时,实时并不意味着快速。

实时意味着交付结果的日期与其价值一样重要。换句话说,如果结果具有正确的值,但交付时间太早或太晚,则总体结果是错误的。

例如,考虑一个视频播放器。如果无法以正确的速率显示视频帧,将不会令用户满意。如果图像和声音不同步,更糟。

此示例显示了一些实时应用程序可以在当前的通用OS上实现。

但是就截止期限的后果而言,硬实时和软实时之间是有区别的:在软实时系统中,这只是一个烦人或降级的服务(请考虑在几秒钟内冻结图像)。视频播放器示例),而这是硬实时系统(例如核电厂)中的(潜在灾难性)故障。


mouviciel先生,感谢您回答我的问题。我们需要一些功能可以实现硬实时,而另一个功能可以是软实时。您能否阐明这个问题?
user172825

7
@ user172825-该问题的答案涵盖了图书馆的书架。出发点可能是谷歌搜索“实时编程”,相关的维基百科文章或诸如QNX或RTEMS之类的RTOS教程。
mouviciel

这对我来说是最复杂的问题。我发现了很多有关此主题的大书。但我希望可以用几句话来解释它。:)
user172825

5
计算机科学中只有两件难事:缓存无效和命名。 ”-Phil Karlton OK,实时。在那里,只有一个句子解释了为什么不能用两个句子来解释。现在,我们返回到您定期安排的节目。

1
我发现称“硬实时”“确定性时间”通常有助于将重点传达给人们。
whatsisname

15

正如@mouviciel所说,实时和快速实际上是两个独立的属性,即使许多实时截止时间暗示需要相对快速的响应。

在编写实时软件时,正确响应旁边最重要的属性是您可以准确预测响应速度。对于硬实时功能,您甚至必须能够保证在完全断电之前的所有可能条件下都可以满足截止日期。

不可预测性的典型来源可以在

  • 动态内存分配和垃圾回收
  • (更高优先级)中断
  • 操作系统中的调度程序
  • 动态创建和销毁对象
  • 大量有条件执行的代码

我并不是说您必须避开这些区域(您很可能无法避免),但是您必须知道它们会如何影响您可以轻松地预测自己将满足相关功能的实时期限的难易程度。


4
在有条件执行的代码中,请小心摊销算法,在大多数情况下,该操作便宜,但有时可能变成更昂贵的操作,例如,当需要重新分配向量时,向量会增加。
棘手怪胎

2
在某些情况下,您可能需要进行WCET分析,以预测毫秒级的执行时间
Basile Starynkevitch

3
@ user172825:概要分析可以提供帮助,但是其中的大部分内容取决于经验和对语言和库的了解。
Bart van Ingen Schenau

3
如果您有严格的实时要求,则分析可能不够好。如果运行时间不是完全确定的,则对其进行性能分析可能会给您留下印象,即它将始终在截止日期之前完成,而实际上它仅满足截止时间100的99倍。如果您对实时性有严格的要求,需要满足它的100倍出100
James_pic

2
@ user172825实时是用于软件的,而脑外科则是用于医学的-您需要大量的经验和技能才能正确实现它,并且您必须非常非常确定自己在做什么。这些项目最好在该地区熟练的专业人员的监督下进行。他们不是您可以扔给常规开发人员的东西,而是说“使它成为实时系统”。
T. Sar

8

我认为实时的两句解释是,实时系统旨在理解和控制从输入更改到输出更改的最坏情况响应时间。

这就需要对整个系统进行分析。假设您有一个琐碎的系统,其中包含一个USB键盘和一个制动伺服器。使用该系统可以实现什么响应?您可能需要考虑:

  • 输入轮询频率,这需要多长时间
  • 输入中断延迟
  • 发生输入事件后,操作系统上下文切换时间
  • 操作系统的任务优先级
  • 避免在程序中使用动态分配或虚拟内存,以避免不可预期的响应延迟或OOM事件
  • 避免使用垃圾收集
  • 避免使用O(n)或N较高或不可预测的较差算法(将很大的播放列表加载到汽车的娱乐系统中会减慢其制动响应吗?)
  • 考虑磁盘或网络延迟(例如在汽车中使用CAN总线)
  • 输出控制延迟

在这种环境下,通常还需要特别考虑可靠性,例如MISRA C标准。


实时性是否还包括在某些情况下是否要确定操作,是否可能递归甚至是可计算的考虑,这是否正确?

是的,所有这些都是“无限的”。如果递归算法的堆栈使用量具有上限,则可以允许使用递归算法。
pjc50

5
avoiding use of garbage collection-应该是avoiding use of non-deterministic memory management。垃圾收集可以实时进行,而手动内存管理不一定是确定性的(请参阅mallocC 的典型实现)。
8bittree'1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.