目录
实时系统介绍
最近准备将之前开发的应用从 TX2 移植到 S32V 上,实验室同学负责 RTLinux 的移植以及 ROS2 到 RTLinux 的移植,我则负责将软件从 ROS1 迁移到 ROS2 上,并针对部分应用开发实时版本。这一方面是为了保证部分应用的执行是确定(determinism)的,另一方面也是为了提高编写的自动驾驶应用的质量,更合理地利用开发板硬件资源。因此,这里就把我最近学习实时应用编程的一些知识整理成文档以便日后查阅以及探讨学习。
本文将从实时计算的定义、实时应用编程的注意事项、ROS2 对实时应用编程的支持进行介绍,最后对本文的主要内容做一个总结。
实时计算的定义
这部分主要会介绍实时系统中的关键术语、理解实时系统时的两个注意事项以及实时系统的分类[1]。
关键术语
首先介绍实时系统中的几个关键术语,对于从概念上直观了解实时系统的特点还是有帮助的。
Determinism
: 给定一个已知输入,一个确定性系统的输出永远都是相同的,而非确定性系统的输出则可能存在随机变化。Deadline
: 一个特定任务必须在 deadline 规定的有限时间窗口内完成Quality of Service
: 描述网络的整体性能,包括:带宽、吞吐量、可用性、抖动率、时延、错误率等
注意事项
这里需要注意的有两点:
- 实时系统经常被拿来与低延时(low-latency)系统相关联,确实很多实施应用同时也是低延时应用,但是实时系统并不是定义为低延时的,而是
确定性调度
:系统必须保证在特定的时间完成特定的任务。因此在编写实时应用时,我们需要对任务的执行延时进行多次测量,然后为任务设置一个合适的最大可允许延时 - 一个实时系统不仅需要底层操作系统是实时的,也需要用户代码的执行也是实时的,两者缺一不可
系统分类
对于实时性的不同要求,可以分为这么几种实时系统:
- 硬实时(hard real-time)系统:硬实时系统有着一系列严格的 deadline,错过一个 deadline 就被认为是系统崩溃。典型例子包括:飞机自动巡航系统、汽车安全气囊系统
- 软实时(soft real-time)系统:软实时系统会
尽力
满足 deadline,但错过一个 deadline 不会导致系统崩溃。典型例子是娱乐直播应用,即使网络延时导致丢帧也不会太大影响