3.5 RK3399项目开发实录-板载RTLinux系统的使用(wulianjishu666)

STM32F103单片机从零到项目开发程序实例
链接:https://pan.baidu.com/s/1dWNskNinrMk4bxaE-jgHhQ?pwd=ymn3

1. 介绍

为了满足用户对系统实时性的需求,官方在 SDK 源码的内核基础上支持升级 Linux 到 RTLinux。 我们RTlinux支持有preempt和xenomai两个版本,下面以preempt版本来测试。

1.1. RTLinux 系统固件支持

preempt版本支持rk356x和rk3588所有系列板子并发布对应固件。如需要源码请联系商务。

1.2. 测试实时效果

测试实时性能需要cyclictest,可以使用apt安装。

apt update
apt install rt-tests

1.2.1. 测试RTLinux的实时效果

使用aio-3568j进行测试, 执行以下命令测试每个核心实时响应延迟:

sudo ./cyclictest -S -p 99 -m

T:0 序号为0的线程;P:99 线程优先级为99;C: 9397 计数器。线程的时间间隔每达到一次,计数器加1;I: 1000 时间间隔为1000微秒(us);Min: 最小延时(us);Act: 最近一次的延时(us);Avg:平均延时(us);Max: 最大延时(us)。

在aio-3568j 的系统上同时跑一些压测程序和cyclictest来测试每个核心的最大响应延迟:

# 运行3个cpu压测线程、3个io压测线程和3个内存压测线程
stress --cpu 3 --io 3 --vm 3

同时进行网络压测:

#使用iperf进行上下行同时测试
iperf -c 192.168.1.220 -p 8001 -f m -i100 -d -t 800000

最后再进行gpu压测:

#无限地运行,从最后一个基准循环到第一个基准
glmark2-es2-wayland --run-forever

下图是以上面教程来制造压力环境进行三天的延迟测试结果。如下图可知:

  • T0实时线程测试最大延迟85us,平均延迟16us,最小延迟3us。

  • T1实时线程测试最大延迟61us,平均延迟12us,最小延迟3us。

  • T2实时线程测试最大延迟52us,平均延迟11us,最小延迟3us。

  • T3实时线程测试最大延迟18us,平均延迟4us,最小延迟3us。

为什么T0测试结果最差?因为arm默认把所有的SPI中断都由cpu0处理,所以延迟测试会比其他核心要差,我们最好不要把实时线程绑定到cpu0运行。 为什么T3测试结果比其他3个核心好很多?因为我们默认将CPU3从内核SMP平衡和调度算法中剔除,保留CPU3给RT应用使用。 

_images/rtlinux_test.png

1.2.2. Cyclictest标准测试

threads选项(-t)用于指定Cyclictest在检测延迟时将使用的测量线程数。通常,在系统上的每个CPU上只运行一个测量线程是一个标准的测试方案。可以使用亲和性选项(-a)指定线程必须在其上执行的cpu。

这些选项对于最小化运行Cyclictest对观察到的系统的影响至关重要。在使用Cyclictest时,确保在任何给定时间只执行一个测量线程是很重要的。如果两个或多个Cyclictest线程的预期执行时间重叠,则Cyclictest的测量将受到其自己的测量线程所造成的延迟的影响。确保在给定的时间只执行一个测量线程的最好方法是在给定的CPU上只执行一个测量线程。

例如,如果要分析三个特定cpu的延迟,则指定应该使用这些cpu(使用-a选项),并指定应该使用三个测量线程(使用-t选项)。在这种情况下,为了最小化Cyclictest的开销,请确保收集度量数据的主Cyclictest线程没有运行在三个隔离的cpu之一上。主线程的关联性可以使用taskset程序设置,如下所述。

1.2.2.1. 在评估一组隔离的cpu上的延迟时,减小cyclictest的影响

在测量cpu子集上的延迟时,确保主Cyclictest线程正在未被评估的cpu上运行。例如,如果一个系统有两个CPU,并且正在评估CPU 0上的延迟,那么主Cyclictest线程应该固定在CPU 1上。Cyclictest的主线程不是实时的,但是如果它在被评估的CPU上执行,它可能会对延迟产生影响,因为会有额外的上下文切换。在启动Cyclictest之后,可以使用taskset命令将主线程限制为在cpu的某个子集上执行。例如,针对CPU1到CPU3的延时测试:

#CPU1到CPU3运行实时程序,主线运行在CPU0上
taskset -c 0 ./cyclictest -t3 -p99 -a 1-3

taskset程序还可以用于确保系统上运行的其他程序不会影响隔离CPU上的延迟。例如,启动程序top查看线程并固定到CPU 0上,使用下面的命令:

taskset --cpu 0 top -H -p PID
#top打开之后点击f键,光标移动到 P 选项,空格选中,然后点击 q建退出,便可查看到实时线程在哪些CPU上运行。

1.3. 提高实时策略

1.3.1. 抑制控制台消息及禁止内存过度使用

#可以使用内核参数quiet启动内核,或者启动之后抑制,如下:
echo 1 > /proc/sys/kernel/printk#禁用内存过度使用以避免 Out-of-Memory Killer产生的延迟
echo 2 > /proc/sys/vm/overcommit_memory

1.3.2. 不使用桌面或者使用轻量级窗口管理器

为了更好的实时,我们不建议使用带桌面的系统,因为这将为CPU延迟带来很大的挑战。建议使用minimal ubuntu、自己的QT程序等。 356x的rt固件默认不使用桌面,而是使用窗口管理器weston,显示协议是Wayland。

1.3.2.1. 切换X11环境

如果你需要X11的环境,可手动切换到X11

sudo set_display_server x11
reboot
#sudo set_display_server weston 可再次切换回weston,重启生效
1.3.2.1.1. 使用openbox 窗口管理器启动

切换到X11环境默认使用桌面,如果需要使用轻量级的窗口管理器 在/etc/lightdm/lightdm.conf 指定ession使用openbox窗口管理器:

cat /etc/lightdm/lightdm.conf.d/20-autologin.conf 
[Seat:*]
user-session=openbox
autologin-user=firefly
1.3.2.1.2. 只运行自己的X11程序

若是不用登录管理器启动 X显示服务,可使用xinit手动启动Xorg显示服务。 执行xinit和startx时,它们将寻找~/.xinitrc做为shell脚本运行以启动客户端程序。 若是~/.xinitrc不存在,startx将运行默认值/etc/X11/xinit/xinitrc(默认的xinitrc启动一个Twm,xorg-xclock和Xterm环境)。

首先关闭lightdm服务

systemctl disable lightdm

然后使用startx启动自己的程序

startx chromium

也可修改默认startx指定的client 的xinitrc文件,默认的会运行Xorg

vim /etc/X11/xinit/xinitrc
-------------------------------------------------------------
#!/bin/sh# /etc/X11/xinit/xinitrc
#
# global xinitrc file, used by all X sessions started by xinit (startx)# invoke global X session script
#. /etc/X11/Xsession
#chromium --window-size=1920,1080
chromium --start-maximized  

1.3.3. 绑定核心

实时要求高的事件固定到某个核心上处理,系统及其它实时要求不高的事件集中到一个核心上处理。例如特定的中断,实时程序等事件可以用专门的核心为他们服务。

1.3.3.1. 任务绑定核心

rt应用可由特定核心处理,将rt应用绑定到cpu3

taskset -c 3 rt_task
1.3.3.2. 中断绑定核心

由于arm将所有外设中断全部由cpu0处理,对于重要的中断可以在系统启动之后将中断绑定到其他核心。 例如将eth0中断绑定到cpu2

root@firefly:~# cat /proc/interrupts | grep  eth038:   28600296          0          0          0     GICv3  64 Level     eth039:          0          0          0          0     GICv3  61 Level     eth0root@firefly:~# cat /proc/irq/38/smp_affinity_list 
0-3root@firefly:~# echo 2 > /proc/irq/38/smp_affinity_listroot@firefly:~# cat /proc/irq/38/smp_affinity_list 
2
root@firefly:~# cat /proc/interrupts | grep  eth038:   29009292          0      52859          0     GICv3  64 Level     eth039:          0          0          0          0     GICv3  61 Level     eth0

1.3.4. 使用smp+amp方案

对于实时要求更高的,可以使用amp方案,以达到更好的实时控制。 rk3568支持了amp(非对称多核架构),你可以定制某些核心跑定制的系统。 比如0~2核心跑kernel,3核心跑rt-thread等;支持 Linux(Kernel-4.19、rt-kernel-4.19)、 Baremetal(HAL)、RTOS(RT-Thread) 组合AMP构建形式,可任意搭配。 不同内核之间可以使用核间通信来进行信息交互。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/755861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

032—pandas 时间窗口中最多的风向和频数

前言 时间窗口指的是在一段时间内对数据进行分析的时间段,通常是一个连续的时间段,如一小时、一天、一周或一个月等。在分析时间序列数据时,时间窗口的选择通常会影响分析结果和预测精度。 需求: 风向是指风的方向,…

如何与Polytec建立EDI连接?

Polytec Holding AG是一家总部位于奥地利的汽车供应商和塑料加工公司。该公司的业务分为四个部门:塑料,为乘用车和非汽车行业的发动机和内饰提供塑料部件;复合材料,为商用车和乘用车提供外饰和发动机零部件;汽车造型&a…

106 基于消息队列来做 mysql 大数据表数据的遍历处理

前言 最近有这样的一个需求, 我们存在一张 很大的 mysql 数据表, 数据量大概是在 六百万左右 然后 需要获取所有的记录, 将数据传输到 es 中 然后 当时 我就写了一个脚本来读取 这张大表, 然后 分页获取数据, 然后 按页进行数据处理 转换到 es 但是存在的问题是, 前面 还…

前后端项目笔记

前端项目创建 准备工作 nodejs安装 vue cli安装 vue create frontend 最后一个y的话 它会保存 方便下次创建项目 我这是手快敲错了 随自己 前端项目组件及作用 Element-UI引入 安装 npm i element-ui -S main.js中引入 清空路口App.vue 清空Home页面 随便写个按钮 原因…

HCIE考证心得 | 在云校的学习收获颇多

我是来自深圳信息职业技术学院22级现代移动通信3-3班的冯同学,我在2023年12月12日通过了华为认证Cloud Service HCIE。在此,我将分享考证中的心得体会给大家。 备考的六点建议 一是要细心严谨,做实验时要全神贯注,明确实验要求…

Python-GEE绘制DEM精美图片

目录 上传矢量和DEM获取添加颜色条参考文章 先连接上GEE的自己的项目 import ee import geemap geemap.set_proxy(port33210) ee.Authenticate() ee.Initialize(projecta-flyllf0313)上传矢量和DEM获取 使用Google Earth Engine(GEE)和Google Earth Eng…

基于单片机的模糊PID炉温控制系统设计

摘 要 电热炉是在工业热处理的生产中广泛使用的一种设备,电热炉的温度控制系统存在时变性,非线性,滞后性等特征,难以用常规PID的控制器对系统达到很好的控制效果。当控温精度的要求高时,使用传统的控制理论方法难以达…

亮相AWE 2024,日立中央空调打造定制空气新体验

日立中央空调于3月14日携旗下空气定制全新成果,亮相2024中国家电及消费电子博览会(简称AWE 2024)现场,围绕“科创先行 智引未来”这一主题,通过技术与产品向行业与消费者,展现自身对于家居空气的理解。 展会…

kanzi颜色工作流程

线性和非线性伽玛色彩空间 RGB 颜色空间的目的是表示在计算机显示器上显示的颜色。目前,sRGB是非线性伽玛色彩空间的标准。之所以需要它,是因为人类对光的感知是非线性的,而且计算机显示器对光强度具有非线性响应。 人眼比浅色更能区分深色…

Android 13 源码编译及报错修复

下载AOSP指定分支 repo init -u git://aosp../platform/manifest -b android-13.0.0_r83 同步代码到本地 repo sync -c 初始化编译环境, 选择构建目标 source build/envsetup.sh lunch 选择需要构建的目标,此处以aosp_arm64-eng为例 进行固件编译 make -j12 期间编译…

力扣热门算法题 49. 字母异位词分组,50. Pow(x, n),51. N 皇后

49. 字母异位词分组,50. Pow(x, n),51. N 皇后,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.19 可通过leetcode所有测试用例。 目录 49. 字母异位词分组 解题思路 完整代码 python Java 50. Pow(x…

STM32F411 Micropython使用日记

1、开发板购买:推荐淘宝“无名科技Nologo” 19.8包邮到手;买开发板还需要买SPI NorFlash,推荐8MB的flash,不懂的可以问卖家,买回来需要焊接好,也可以找店家试试看能不能帮忙焊接,不然micropytho…

八节【DBA从入门到实践】课程,带你快速掌握OceanBase运维管理核心技能

为帮助用户及开发者更好、更快地掌握OceanBase DBA核心技能,OceanBase社区设计了配套教程——“DBA从入门到实践”。8期教程带大家循序渐进掌握OceanBase运维管理核心技能。搭配随堂习题和OceanBase技术专家在线答疑,快速掌握重要知识点,并轻…

【DL经典回顾】激活函数大汇总(二十七)(Bent Identity附代码和详细公式)

激活函数大汇总(二十七)(Bent Identity附代码和详细公式) 更多激活函数见激活函数大汇总列表 一、引言 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里,激活函数扮演着不可或…

直观与交互:山海鲸可视化软件与Excel传统表格的对比

作为一名长期使用Excel进行数据处理和分析的用户,最近我尝试了一款名为山海鲸的可视化软件,发现它与Excel传统表格之间存在诸多明显的差异。接下来,我将从个人体验视角出发,谈谈这两种工具的不同之处。 首先,从数据呈…

组件化开发

一、引言 Vue.js 的组件化开发是其核心特性之一,它允许开发者将复杂的界面拆分为可复用的、独立的、小的组件,从而提高开发效率和代码的可维护性。 二、关键点 1.组件的定义 在components下创建.vue文件timecard.vue用来编辑内容。 文件创建完毕后&am…

000_【基础篇】SpringBoot概述

介绍 springboot 是 spring 提供的一个子项目,用于快速构建 spring 应用程序 传统的 SSM 框架要导入很多依赖的 jar 包以及配置很多的配置文件,麻烦、繁琐 springboot 特性 springboot 主要(还有其他的一些特性)有起步依赖和…

精酿啤酒:开启时尚派对的钥匙

Fendi club啤酒,一个代表着时尚与品味的品牌,如今进入了啤酒市场,推出了名为“Fendi club”的啤酒。这一创新的举措不仅展现了品牌的多元化发展,更为消费者提供了一种全新的时尚生活方式。 Fendi club啤酒不仅仅是一种产品&#x…

【C++庖丁解牛】继承的概念及定义 | 继承中的作用域 | 继承与友元继承与静态成员 | 复杂的菱形继承及菱形虚拟继承

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1.继承的概念及定义1.1继…