XILINX ARM+FPGA Zynq-7010/20 Linux-RT案例开发手册
nanshan 2025-01-06 14:38 16 浏览 0 评论
Linux-RT内核简介
RT-Linux(Real-Time Linux)亦称作实时Linux,是Linux中的一种硬实时操作系统,它最早由美国墨西哥理工学院的V.Yodaiken开发。
产品资料提供的Linux-RT内核应用了开源的RT PREEMPT机制进行补丁。PREEMPT_RT补丁的关键是最小化不可抢占的内核代码量,同时最小化必须更改的代码量,以便提供这种附加的可抢占性。PREEMPT_RT补丁利用Linux内核的SMP功能来添加这种额外的抢占性,而不需要完整的内核重写。
Linux-RT内核与普通Linux内核相比,几个主要的相同之处是:
- 具有相同的开发生态系统,包括相同工具链、文件系统和安装方法,以及相同的POSIX API等。
- 仍然存在内核空间和用户空间的划分。
- Linux应用程序在用户空间中运行。
Linux-RT内核与普通Linux内核在常规编程方式上的几个主要不同之处是:
- 调度策略。
- 优先级和内存控制。
- 基于Linux-RT内核的应用程序使用了调度策略后,系统将根据调度策略对其进行调优。
Linux系统实时性测试
本章节主要介绍使用Cyclictest延迟检测工具测试Linux系统实时性的方法。Cyclictest是rt-tests测试套件下的一个测试工具,也是rt-tests下使用最广泛的测试工具,一般主要用来测试使用内核的延迟,从而判断内核的实时性。
Cyclictest工具简介
Cyclictest常用于实时系统的基准测试,是评估实时系统相对性能的最常用工具之一。Cyclictest反复测量并精确统计线程的实际唤醒时间,以提供有关系统的延迟信息。它可测量由硬件、固件和操作系统引起的实时系统的延迟。
为了测量延迟,Cyclictest运行一个非实时主线程(调度类SCHED_OTHER),该线程以定义的实时优先级(调度类SCHED_FIFO)启动定义数量的测量线程。测量线程周期性地被一个到期的计时器(循环报警)所定义的间隔唤醒,随后计算有效唤醒时间,并通过共享内存将其传递给主线程。主线程统计延迟值并打印最小、最大和平均延迟时间。
参考链接:https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/cyclictest/start?s[]=cyclictest
编译Cyclictest工具
将产品资料“4-软件资料\Demo\rt-linux-demos\Cyclictest\”目录下的rt-tests.tar.gz压缩包复制到Ubuntu系统,执行如下命令将其解压。
Host# tar -xvf rt-tests.tar.gz
图 1
进入解压生成的rt-tests源文件目录,执行source命令加载平台PetaLinux环境变量。命令中的PetaLinux路径请根据实际情况修改。加载完成后,在案例编译时即可依赖PetaLinux开发包自带的开发环境和运行库。
Host# cd rt-tests/
Host# source /home/tronlong/PetaLinux/settings.sh
Host# make cyclictest CC=arm-linux-gnueabihf-gcc
图 2
编译完成后,将在当前路径下生成cyclictest可执行文件,将其复制到评估板文件系统。
使用Cyclictest测试系统实时性
本次测试对比基于Linux-RT-4.9.0内核和Linux-4.9.0内核的Linux系统实时性。参照如下步骤,结合Iperf和Cyclictest工具测试系统的实时性。此处使用Iperf工具不断触发系统中断,提高中断处理负载,以便更好测试系统实时特性。
在Ubuntu执行如下命令查看IP地址,并以服务器模式启动Iperf测试。
Host# ifconfig
Host# iperf -s -i 1
图 3
分别使用Linux-RT-4.9.0内核(参考Linux系统启动卡制作及系统固化文档更换内核)和Linux-4.9.0内核(系统启动卡默认内核)启动评估板,在评估板中执行如下命令以客户端模式启动Iperf,并连接到服务器端(Ubuntu系统)。192.168.0.154为Ubuntu的IP地址,“-t3600”指定测试时间为3600秒,&表示让程序在后台运行。
Target# iperf -c 192.168.0.154 -d -t3600&
图 4
进入可执行文件cyclictest所在目录,执行如下命令测试系统实时性。
Target# ./cyclictest -t5 -p98 -m -n -D10m
图5 Linux-RT-4.9.0内核测试结果
图 6 Linux-4.9.0内核测试结果
表 1 Cyclictest测试结果说明
参数 | 解析 |
T(Thread) | 线程索引和线程ID |
P(Priority) | 线程的优先级 |
I(Interval) | 延迟,测量线程的预期唤醒周期 |
C(Count) | 测量延迟的次数 |
Min(Minimum) | 测量的最小延迟(单位us) |
Act(Actual) | 最近一次测量的延迟(单位us) |
Avg(Average) | 平均延时(单位us) |
Max(Maximum) | 测量的最大延迟(单位us) |
对比测试数据,可看到基于Linux-RT-4.9.0内核的系统的延时更加稳定,最大延时更低,系统实时性更佳。
Cyclictest命令参数解析可执行“./cyclictest --help”查看,如下图所示。
图 7
图 8
tl_rt_gpio_ctrl案例
案例说明
通过创建一个基本的实时线程,在线程内触发LED1的电平翻转,同时程序统计实时线程的调度延时,并通过示波器测出LED1电平两次翻转的时间间隔。
由于程序默认以最高优先级运行,为避免CPU资源被程序完全占用,导致系统被挂起,因此在程序中增加100us的延时。
程序原理大致如下:
(1)在Linux-RT内核上创建、使用实时线程。
(2)实时线程中,计算出触发LED1(/sys/class/leds/user-led0/brightness)电平翻转的系统调度延时。
案例目录下包含bin目录和src目录,其中bin目录包含经由我司验证的可执行文件,src目录包含案例源码。
案例测试
将案例bin目录下的可执行文件复制到评估板文件系统,并执行如下命令运行测试程序,再按“Ctrl+C”退出测试,串口终端将打印程序统计的延时数据,如下图所示。Error results为偏差分析结果,不是错误结果。
Target# ./tl_rt_gpio_ctrl
图 9
同时使用示波器捕捉LED1两次电平翻转之间的间隔就对应上线程调度的延迟,测试点为R34电阻一端。
图 10
算出电平两次翻转的时间间隔为?x=123.0us,如下图所示。由于程序中默认增加了100us的时间延时,实际延时应为:123.0us-100us=23.0us,与程序统计平均值23us基本一致。
图 11
案例编译
将产品资料“4-软件资料\Demo\rt-linux-demos\tl_rt_gpio_ctrl\”案例源码复制到Ubuntu。进入案例源码目录,执行如下命令加载平台的PetaLinux环境变量,编译案例生成可执行文件。
Host# source /home/tronlong/PetaLinux/settings.sh
Host# CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ make
图 12
关键代码
(1)创建一个基于PREEMPT_RT的实时任务,具体操作包括内存锁定、线程堆栈内存设置、调度策略和优先级配置等。
图 13
(2)在线程中打开LED文件节点,并对LED状态进行翻转。
图 14
(3)统计调度时间延时情况。
图 15
tl_rt_input案例
案例说明
通过创建一个基本的实时线程,在线程内打开input设备,并对按键事件进行监听,然后触发评估底板LED1的电平翻转,再通过示波器测量按键触发到LED1电平翻转期间的实际耗时。程序原理大致如下:
(1)在Linux-RT内核上创建、使用实时线程。
(2)实时线程中对打开的input设备节点进行按键事件监听,通过判断监听得到的按键事件来触发LED1(/sys/class/leds/user-led0/brightness)的电平翻转。
案例测试
将案例bin目录下的可执行文件复制到评估板文件系统,并执行如下命令运行测试程序,程序运行后按下KEY1(SW1)按键点亮LED1,松开按键后LED1熄灭,再按“Ctrl+C”退出测试程序。
Target# ./tl_rt_input
图 16
分别使用示波器探头1测量按键KEY1管脚1,使用示波器探头2测量LED电路R31电阻一端。
图 17
图 18
从按键下降沿触发的开始(下图黄线)到LED上升沿触发的完成(下图绿线)的时间间隔,即为系统实时捕获按键输入时间并响应触发LED电平翻转的时间Δx,从图中可看到Δx = 80.0us。
图 19
补充说明:
基础设备树文件中需将消抖延时参数debounce-interval配置为0(默认已为0)。如没有对其进行配置,驱动会将其设置成默认的参数值5ms,此时示波器测试结果约为5ms。在硬件特性上,由于按键电压由低电平上拉到高电平比较缓慢(实际测试中延时约为80us),因此本次测试实时事件的输入采用下降沿触发方式。
案例编译
将产品资料“4-软件资料\Demo\rt-linux-demos\tl_rt_input\”案例源码复制到Ubuntu。进入案例源码目录,执行如下命令加载平台的PetaLinux环境变量,编译案例生成可执行文件。
Host# source /home/tronlong/PetaLinux/settings.sh
Host# CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ make
图 20
关键代码
(1)创建一个基于PREEMPT_RT的实时任务,具体操作包括内存锁定、线程的堆栈内存设置、调度策略和优先级配置等。
图 21
(2)在线程中打开input设备节点并监听按键事件,同时触发LED电平的翻转。
图 22
相关推荐
- 0722-6.2.0-如何在RedHat7.2使用rpm安装CDH(无CM)
-
文档编写目的在前面的文档中,介绍了在有CM和无CM两种情况下使用rpm方式安装CDH5.10.0,本文档将介绍如何在无CM的情况下使用rpm方式安装CDH6.2.0,与之前安装C5进行对比。环境介绍:...
- ARM64 平台基于 openEuler + iSula 环境部署 Kubernetes
-
为什么要在arm64平台上部署Kubernetes,而且还是鲲鹏920的架构。说来话长。。。此处省略5000字。介绍下系统信息;o架构:鲲鹏920(Kunpeng920)oOS:ope...
- 生产环境starrocks 3.1存算一体集群部署
-
集群规划FE:节点主要负责元数据管理、客户端连接管理、查询计划和查询调度。>3节点。BE:节点负责数据存储和SQL执行。>3节点。CN:无存储功能能的BE。环境准备CPU检查JDK...
- 在CentOS上添加swap虚拟内存并设置优先级
-
现如今很多云服务器都会自己配置好虚拟内存,当然也有很多没有配置虚拟内存的,虚拟内存可以让我们的低配服务器使用更多的内存,可以减少很多硬件成本,比如我们运行很多服务的时候,内存常常会满,当配置了虚拟内存...
- 国产深度(deepin)操作系统优化指南
-
1.升级内核随着deepin版本的更新,会自动升级系统内核,但是我们依旧可以通过命令行手动升级内核,以获取更好的性能和更多的硬件支持。具体操作:-添加PPAs使用以下命令添加PPAs:```...
- postgresql-15.4 多节点主从(读写分离)
-
1、下载软件[root@TX-CN-PostgreSQL01-252software]#wgethttps://ftp.postgresql.org/pub/source/v15.4/postg...
- Docker 容器 Java 服务内存与 GC 优化实施方案
-
一、设置Docker容器内存限制(生产环境建议)1.查看宿主机可用内存bashfree-h#示例输出(假设宿主机剩余16GB可用内存)#Mem:64G...
- 虚拟内存设置、解决linux内存不够问题
-
虚拟内存设置(解决linux内存不够情况)背景介绍 Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存...
- Elasticsearch性能调优(5):服务器配置选择
-
在选择elasticsearch服务器时,要尽可能地选择与当前业务量相匹配的服务器。如果服务器配置太低,则意味着需要更多的节点来满足需求,一个集群的节点太多时会增加集群管理的成本。如果服务器配置太高,...
- Es如何落地
-
一、配置准备节点类型CPU内存硬盘网络机器数操作系统data节点16C64G2000G本地SSD所有es同一可用区3(ecs)Centos7master节点2C8G200G云SSD所有es同一可用区...
- 针对Linux内存管理知识学习总结
-
现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。对于内存部分需要知道:地址映射内存管理的方式缺页异常先来看一些基本的知识,在进程看来,内存分为内...
- MySQL进阶之性能优化
-
概述MySQL的性能优化,包括了服务器硬件优化、操作系统的优化、MySQL数据库配置优化、数据库表设计的优化、SQL语句优化等5个方面的优化。在进行优化之前,需要先掌握性能分析的思路和方法,找出问题,...
- Linux Cgroups(Control Groups)原理
-
LinuxCgroups(ControlGroups)是内核提供的资源分配、限制和监控机制,通过层级化进程分组实现资源的精细化控制。以下从核心原理、操作示例和版本演进三方面详细分析:一、核心原理与...
- linux 常用性能优化参数及理解
-
1.优化内核相关参数配置文件/etc/sysctl.conf配置方法直接将参数添加进文件每条一行.sysctl-a可以查看默认配置sysctl-p执行并检测是否有错误例如设置错了参数:[roo...
- 如何在 Linux 中使用 Sysctl 命令?
-
sysctl是一个用于配置和查询Linux内核参数的命令行工具。它通过与/proc/sys虚拟文件系统交互,允许用户在运行时动态修改内核参数。这些参数控制着系统的各种行为,包括网络设置、文件...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)