首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >创龙 瑞芯微 RK3562 国产 2GHz 四核A53 工业开发板—Linux-RT应用开发案例

创龙 瑞芯微 RK3562 国产 2GHz 四核A53 工业开发板—Linux-RT应用开发案例

原创
作者头像
创龙科技Tronlong
发布2025-07-01 17:32:06
发布2025-07-01 17:32:06
1930
举报

开发板简介

创龙科技 TL3562-EVM-B 是一款基于瑞芯微 RK3562J/RK3562 处理器设计的四核 ARMCortex-A53 +单核 ARM Cortex-M0 国产工业评估板,主频高达 2.0GHz。评估板由核心板和评估底板组成,核心板 CPU、ROM、RAM、电源、晶振、连接器等所有元器件均采用国产工业级方案,国产化率 100%。评估底板大部分元器件亦采用国产工业级方案,国产化率约 99%(按元器件数量占比,数据仅供参考)。核心板经过专业的PCBLayout 和高低温测试验证,质量稳定可靠,可满足各种工业应用环境要求。

评估板硬件资源图解1
评估板硬件资源图解1
评估板硬件资源图解2
评估板硬件资源图解2

前 言

本文档主要通过Cyclictest延迟检测工具,以及基于Linux-RT的应用程序评估Linux-RT系统的实时性,适用开发环境如下:

Windows开发环境:Windows 7 64bit、Windows 10 64bit

Linux开发环境:VMware16.2.5、Ubuntu20.04.6 64bit

U-Boot:U-Boot-2017.09

Kernel:Linux-5.10.209、Linux-RT-5.10.209

LinuxSDK:rk3562-buildroot-2021.11-sdk-[版本号](基于rk3562_linux_release_v1.2.0_20240620)

我司默认使用的是Linux内核,同时提供了Linux-RT内核位于产品资料“4-软件资料\Linux\Kernel\image\linux-5.10.209-[版本号]-[Git系列号]”目录下,版本号、Git序列号以实际情况为准。请按照如下方法替换为Linux-RT内核。

请将boot-rt.img镜像拷贝至评估板文件系统任意目录下。执行如下命令,替换内核镜像至Linux系统启动卡,评估板重启生效。

备注:"/dev/mmcblk1p3"为Linux系统启动卡对应的设备节点,如需固化至eMMC,请将设备节点修改为"/dev/mmcblk0p3"。

Target# dd if=boot-rt.img of=/dev/mmcblk1p3 conv=fsync

Target# sync

Target# reboot

图 1
图 1
图 2 Linux-RT内核
图 2 Linux-RT内核

我司提供的Linux-RT内核与Linux内核测试方法一致,请参考《评估板测试手册》或《物联网模块开发案例》进行测试即可,Linux-RT内核支持的外设接口如下表所示。

我司提供的Linux-RT内核应用了开源的RT PREEMPT机制进行补丁。PREEMPT_RT补丁的关键是最小化不可抢占的内核代码量,同时最小化必须更改的代码量,以便提供这种附加的可抢占性。Linux-RT内核增加PREEMPT_RT补丁后,增加了系统响应的确定性和实时性,但是代价是CPU性能降低。

Linux-RT内核与普通Linux内核相比,几个主要的相同之处是:

具有相同的开发生态系统,包括相同工具链、文件系统和安装方法,以及相同的POSIX API等。

仍然存在内核空间和用户空间的划分。

Linux应用程序在用户空间中运行。

Linux-RT内核与普通Linux内核在常规编程方式上的几个主要不同之处是:

调度策略。

优先级和内存控制。

基于Linux-RT内核的应用程序使用了调度策略后,系统将根据调度策略对其进行调优。

Linux系统实时性测试

本章节主要介绍使用Cyclictest延迟检测工具测试Linux系统实时性的方法。Cyclictest是rt-tests测试套件下的一个测试工具,也是rt-tests下使用最广泛的测试工具,一般主要用来测试内核的延迟,从而判断内核的实时性。

Cyclictest常用于实时系统的基准测试,是评估实时系统相对性能的最常用工具之一。Cyclictest反复测量并精确统计线程的实际唤醒时间,以提供有关系统的延迟信息。它可测量由硬件、固件和操作系统引起的实时系统的延迟。

为了测量延迟,Cyclictest运行一个非实时主线程(调度类SCHED_OTHER),该线程以定义的实时优先级(调度类SCHED_FIFO)启动定义数量的测量线程。测量线程周期性地被一个到期的计时器(循环报警)所定义的间隔唤醒,随后计算有效唤醒时间,并通过共享内存将其传递给主线程。主线程统计延迟值并打印最小、最大和平均延迟时间。

参考链接:https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/cyclictest/start?s[]=cyclictest。

Linux-RT性能测试

本次测试分别在CPU空载、满负荷(运行stress压力测试工具)、隔离CPU核心的情况下,对比评估Linux-RT内核的系统实时性。

CPU空载状态

评估板上电启动,进入评估板文件系统执行如下命令,修改内核printk日志等级,避免内核打印信息影响实时测试。

Target# echo 1 > /proc/sys/kernel/printk

调整内存分配策略为“2”,禁用内存过度使用。避免出现OOM(Out-of-Memory) Killer攻击某些进程而产生延迟,影响测试结果。

备注:执行如下命令将会改变内存分配方式,若使用DDR容量为1GByte的评估板,请勿执行该命令。

Target# echo 2 > /proc/sys/vm/overcommit_memory

图 3
图 3

执行如下命令,基于CPU空载状况下测试系统的实时性。测试指令需运行12小时,请保持评估板长时间稳定工作,测试完成后将生成统计结果no_load_output文件。

Target# cyclictest -m -Sp99 -i1000 -h800 -D12h -q > no_load_output

图 4
图 4

参数解析:

-m:锁定当前和将来的内存分配;

-S:采用标准SMP测试;

-p:设置线程优先级;

-i:设置线程的基本间隔;

-h:运行后将延迟直方图转储至标准输出,亦可指定要跟踪的最大延时时间(以微秒为单位);

-D:指定测试运行时长,附加m(分钟)、h(小时)、d(天)指定;

-q:运行时不打印相关信息。

CPU满负荷状态

评估板上电启动,进入评估板文件系统执行如下命令,修改内核printk日志等级,避免内核打印信息影响实时测试。

Target# echo 1 > /proc/sys/kernel/printk

调整内存分配策略为“2”,禁用内存过度使用。避免出现OOM(Out-of-Memory) Killer攻击某些进程而产生延迟,影响测试结果。

备注:执行如下命令将会改变内存分配方式,若使用DDR容量为1GByte的评估板,请勿执行该命令。

Target# echo 2 > /proc/sys/vm/overcommit_memory

图 5
图 5

执行如下命令,运行stress压力测试工具,使得CPU处于满负荷状态。再使用Cyclictest工具测试CPU满负荷状态下的系统实时性能。测试指令需运行12小时,请保持评估板长时间稳定工作,测试完成后将生成统计结果overload_output文件。

Target# stress-ng --cpu 4 --cpu-method=all --io 4 --vm 4 --vm-bytes 64M --timeout 43200s &

Target# cyclictest -m -Sp99 -i1000 -h800 -D12h -q > overload_output

图 6
图 6

参数解析:

--cpu:指定压力测试的进程个数;

--cpu-method:指定CPU压力测试的方式;

--io:指定I/O测试的进程个数;

--vm:指定内存测试的进程个数;

--vm-bytes:指定每个内存测试进程中分配内存的大小;

--timeout:指定测试时长。

隔离CPU核心状态

本次测试以隔离CPU3核心为例,通过降低系统上所运行的其他进程对隔离CPU3产生的延迟影响,确保CPU3进程的正常运行,进而评估Linux-RT内核的系统实时性。

将评估板断电,长按"Ctrl + C"按键并启动评估板,进入U-Boot命令行模式后松开按键,执行如下命令,修改环境变量,隔离CPU3核心。

备注:如从eMMC启动,请将命令中的"sd"修改为"emmc"。

U-Boot# setenv bootargs storagemedia=sd androidboot.storagemedia=sd androidboot.mode=normal isolcpus=3

U-Boot# saveenv

U-Boot# reset

图 7
图 7

评估板重启后,执行如下命令,查看环境变量。

Target# cat /proc/cmdline

图 8
图 8

进入评估板文件系统,执行如下命令,修改内核printk日志等级,避免内核打印信息影响实时测试。

Target# echo 1 > /proc/sys/kernel/printk

调整内存分配策略为“2”,禁用内存过度使用。避免出现OOM(Out-of-Memory) Killer攻击某些进程而产生延迟,影响测试结果。

备注:执行如下命令将会改变内存分配方式,若使用DDR容量为1GByte的评估板,请勿执行该命令。

Target# echo 2 > /proc/sys/vm/overcommit_memory

图 9
图 9

执行如下命令,运行stress压力测试工具,使得CPU处于满负荷状态。再使用taskset工具将Cyclictest测试程序运行在CPU3核心,测试CPU3核心满负荷状态下的系统实时性能。测试指令需运行12小时,请保持评估板长时间稳定工作,测试完成后将生成统计结果iso_overload_output文件。

Target# stress-ng --cpu 4 --cpu-method=all --io 4 --vm 4 --vm-bytes 64M --timeout 43200s &

Target# taskset -c 0-3 cyclictest -m -Sp99 -i1000 -h800 -D12h -q > iso_overload_output

图 10
图 10

统计结果分析

我司已提供脚本文件get_histogram.sh用于绘制统计结果直方图,位于产品资料“4-软件资料\Demo\rt-linux-demos\cyclictest\bin\”目录下,请将该脚本文件拷贝至Ubuntu工作目录下。

图 11
图 11

在Ubuntu系统执行如下命令,安装gnuplot工具。

Host# sudo apt-get -y install gnuplot

图 12
图 12

CPU空载状态

请将CPU空载状态下的统计结果no_load_output文件拷贝至Windows工作目录,使用Windows文本工具打开该文件并拖动至文件末尾,可查看Linux系统每个核心(CPU0~CPU3)的最小延迟(Min Latencies)、平均延迟(Avg Latencies)、最大延迟(Max Latencies)统计结果。

图 13
图 13

请将CPU空载状态下的统计结果no_load_output文件拷贝至Ubuntu,存放在get_histogram.sh同一目录下。执行如下命令修改文件名为"output"。

Host# cp no_load_output output

图 14
图 14

执行如下命令生成直方图文件plot.png,请将其拷贝至Windows下并打开。

Host# ./get_histogram.sh

图 15
图 15
图 16
图 16

根据测试结果output文件数据以及结合直方图,可得主要数据如下表。本次测试中,CPU0核心Max Latencies值最大,为119us,CPU1核心的Max Latencies值最小,为42us。

备注:测试数据与实际测试环境有关,仅供参考。

CPU满负荷状态

参考如上方法,分析CPU满负荷状态下的统计结果如下所示。本次测试中,CPU0核心Max Latencies值最大,为215us,CPU1核心的Max Latencies值最小,为141us。

图 17
图 17

隔离CPU核心状态

参考如上方法,分析隔离CPU核心状态下的统计结果如下所示。本次测试中,CPU1核心Max Latencies值最大,为232us,隔离CPU3核心的Max Latencies值最小,为33us。

图 18
图 18

根据CPU满负荷、隔离CPU核心状态的测试结果可知:当程序指定至隔离的CPU3核心上运行时,Linux系统延迟最低,可有效提高系统实时性。故推荐对实时性要求较高的程序(功能)指定至隔离的CPU核心运行。

rt_gpio_ctrl案例

案例说明

通过创建一个基本的实时线程,在线程内触发LED的电平翻转,同时程序统计实时线程的调度延时,并通过示波器测出LED电平两次翻转的时间间隔。由于程序默认以最高优先级运行,为避免CPU资源被程序完全占用导致系统被挂起,因此在程序中增加100us的延时。程序原理大致如下:

在Linux-RT内核上创建、使用实时线程。

实时线程中,计算出触发LED电平翻转的系统调度延时。

案例测试

本小节测试以隔离CPU3核心为例,通过降低系统上所运行的其他进程对隔离CPU3产生的延迟影响,确保CPU3进程的正常运行,进而评估Linux-RT内核的系统实时性。

将评估板断电,长按"Ctrl + C"按键并启动评估板,进入U-Boot命令行模式后松开按键,执行如下命令,修改环境变量,隔离CPU3核心。

备注:如从eMMC启动,请将命令中的"sd"修改为"emmc"。

U-Boot# setenv bootargs "storagemedia=sd androidboot.storagemedia=sd androidboot.mode=normal isolcpus=3"

U-Boot# saveenv

U-Boot# reset

图 19
图 19
图 20
图 20

将案例bin目录下的可执行文件拷贝至评估板文件系统,并执行如下命令运行测试程序,再按"Ctrl + C"退出测试,串口终端将打印程序统计的延迟数据,如下图所示。

Target# sysctl kernel.sched_rt_runtime_us=-1

Target# taskset -c 3 ./rt_gpio_ctrl 100

图 21
图 21

同时使用示波器捕捉LED两次电平翻转之间的间隔,即可得到线程调度的延迟,测试点为R50电阻一端。

图 22
图 22

本次测得电平翻转周期为∆x = 113us,如下图所示。由于程序中增加了100us的时间延时,因此实际延时应为:113us - 100us = 13us,与程序统计打印的Latency results平均值13us相近。

图 23
图 23

案例编译

将产品资料“4-软件资料\Demo\rt-linux-demos\rt_gpio_ctrl\src\”案例源码拷贝至Ubuntu。进入案例源码目录,执行如下命令,编译案例生成可执行文件。

Host# source /home/tronlong/RK3562/rk3562-buildroot-2021.11-sdk-v1.0/buildroot/output/rockchip_rk3562/host/environment-setup

Host# make

图 24
图 24

关键代码说明

创建实时任务,具体操作包括内存锁定、线程堆栈内存设置、调度策略和优先级配置等。

图 25
图 25

在线程中打开LED文件节点,并对LED状态进行翻转。

图 26
图 26

统计调度时间延时情况。

图 27
图 27

​由于篇幅过长等原因,部分内容均不逐一展示,如需获取完整版详细资料,请关注创龙科技微信公众号或官网,或者评论区留言,感谢您的支持!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开发板简介
  • 前 言
  • Linux系统实时性测试
    • Linux-RT性能测试
      • CPU空载状态
      • CPU满负荷状态
      • 隔离CPU核心状态
      • 统计结果分析
  • rt_gpio_ctrl案例
    • 案例说明
    • 案例测试
    • 案例编译
    • 关键代码说明
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档