教程
ros2实时编程:
什么是实时性(延时)
实时性是指调度的时候,任务响应时间。
也就是任务从产生到被执行的时间。
实时性任务
就是需要在特定时间内完成和响应的任务。
实时性需求--linux系统实时性
preempt-rt实时内核是什么
所谓的内核就是操作系统的核心部分,不完全等于操作系统。
PREEMPT-RT 实时内核是 Linux 内核的一个衍生版本,它被设计用于提供更好的实时性能和可预测性。
PREEMPT-RT 内核通过实时调度程序和内核抢占,实现了更快的响应时间,更好的实时性能和更好的可预测性。它可以在不影响系统常规操作的情况下,捕获和处理实时响应事件。与标准 Linux 内核不同,在 PREEMPT-RT 中,内核可以在任何时间停止执行一个任务并切换到另一个任务,以确保实时任务获得优先级。
PREEMPT-RT 内核的特点包括:
-
低延迟和更好的实时性能,可以在实时系统中实现更好的精度和控制
-
通过实时调度程序使任务的调度更可预测
-
内核和设备驱动程序可以在任何时候实时响应输入事件
-
实现了内核抢占,以支持多任务并行
-
内核代码更容易维护和调试
PREEMPT-RT 适用于需要更好实时性能的 Linux 系统,比如航空、军事、工业机器人、汽车和医疗设备等领域。Ros2的Dashing 和 Eloquent 版本都支持 PREEMPT-RT 实时内核。
preempt-rt
preemptible: 抢占;
rt: real time;
preempt-rt: 实时抢占内核。
“PREEMPT” 是一种操作系统调度技术,指当高优先级的任务到来时,操作系统可以在低优先级任务运行的任何时候中断它,并迅速地处理高优先级任务,以提高系统的实时性和响应性。
“RT” 是实时(Real-Time)的缩写,通常指在某些时间限制内完全响应某个事件或指令的能力。在计算机系统中,实时性是指需要在特定时间限制内完成响应的任务,比如航空控制、工业控制、医疗设备等领域。成为实时操作系统,需要保证内核和用户空间的最大响应时间不超过某个最大值。实时性还意味着,需要在给定时间上限内完成工作,因此,实时任务的预测性和可靠性也很重要。
所以preempt-rt内核就是通过以实时任务为高优先级任务,先处理实时任务的方式来提高任务的实时性。
PREEMPT_RT补丁
PREEMPT-RT 补丁是一段针对 Linux 内核源代码的修改文件,补丁本身就是一组代码。该补丁集包含了对 Linux 内核的一系列修改和增强,以提高系统的实时性和可预测性。在应用 PREEMPT-RT 补丁集时,需要将其应用到 Linux 内核源代码中,然后将整个内核代码重新编译生成新的内核镜像,以便使用者能够在其系统上运行更加实时化的操作系统。
PREEMPT_RT补丁的主要目标是减少Linux内核的不可抢占性(non-preemptibility),即减少内核运行时不可被中断的时间。通过将关键的内核代码段和操作转换为可抢占的形式,PREEMPT_RT使得实时任务能够在特定时间约束下得到及时响应。
(preempt-rt: 将)
PREEMPT_RT的安装
教程
canonical-certs.pem---canonical-revoked-certs.pem
1,查看自己的ubuntu系统版本,内核版本,是否为实时性内核
uname -a
uname -r
2,下载和自己的系统内核版本一样的linux内核资源和patch包
3,解压和配置内核补丁
4,make menuconfig
5,make -j`nproc
6,sudo make && sudo make modules && sudo make modules_install && sudo make install
一定要加上sudo,否则报错。
sudo reboot重启配置内核
当重启到advaned option ubuntu的时候,选择这个选项,回车进入,选择preempt-rt版本。
查看18.04安装教程。
实时系统的测试
下载rt_tests
sudo apt install rt_tests
cyclictest测试工具
Cyclictest是rt-tests下一个使用最广泛的测试工具(本质上就是一个程序),主要用来测试使用内核的延迟,从而判断内核的实时性。
原理
从产生到被执行的时间(延时时间)=定时器中断生成线程任务加入调度队列时间(中断处理时间)+调度处理时间。
参数
cyclictest --help
参数 | 含义 | |
-t thread | 要创建的线程数量 | |
-p priority | 线程的优先级,数字越小,优先级越高,优先级越高,则自然会被优先调度处理。 | |
-N | 测试结果使用精度更高的ns显示(默认是us) |
测试结果分析
Abbreviation | Label | Description |
---|---|---|
T | Thread | Thread index and thread ID |
P | Priority | RT thread priority |
I | Interval | 线程的预期唤醒时间(以 US 为单位)(只是唤醒,还没有被执行) |
C | Count | 测量延迟的次数,即迭代计数(也就是定时器触发的次数,定时器触发一次,线程就需要被调度一次) |
Min | Minimum | 测得的最小延迟时间(以 US 为单位) |
Act | Actual | 最后一次测得的延迟时间(以 US 为单位) |
Max | Maximum | 测得的最大延迟时间(以 US 为单位) |
重点关注的是max latency,因为一个系统实时性能的好坏通常由它的最大延时来决定。