0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

国产!全志T113-i 双核Cortex-A7@1.2GHz 工业开发板—Linux-RT应用开发案例

Tronlong创龙科技 ? 来源:wtbl物通博联 ? 作者:wtbl物通博联 ? 2025-07-30 10:33 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

?前言

本文适用开发环境如下:

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

虚拟机:VMware15.5.5

Linux开发环境:Ubuntu18.04.464bit

LinuxSDK:T113_Tina5.0-V1.0(Linux)

Kernel:Linux-RT-5.4.61

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

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

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

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

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

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

调度策略。

优先级和内存控制。

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

Linux系统实时性测试

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

我司默认使用是的Linux内核,同时提供了Linux-RT内核位于产品资料“4-软件资料LinuxKernelimagelinux-5.4-[版本号]-[Git系列号]nand”目录下,请按照如下方法替换为Linux-RT内核。

将Linux-RT内核镜像boot-rt.fex和Linux-RT内核配套的内核模块目录modules-rt拷贝至Ubuntu工作目录下,执行如下命令,进入modules-rt目录下将Linux-RT内核模块压缩包解压。

Host# cd modules-rt/

Host# tar -zxf 5.4.61-rt37-gb1bd4aa.tar.gz

wKgZPGiJgkOAcU3GAADUJp2-e40972.png图 1

将内核镜像和解压后的内核模块拷贝至评估板文件系统任意目录下。执行如下命令,分别替换内核镜像和内核模块至Linux系统启动卡,评估板重启生效。

备注:若使用eMMC配置评估板,请使用emmc目录下的Linux-RT内核镜像和Linux-RT内核模块,并修改Linux系统启动卡对应设备节点为"/dev/mmcblk1p4"。

Target# dd if=boot-rt.fexof=/dev/mmcblk0p4

Target# rm /lib/modules/* -rf

Target# cp 5.4.61-rt37-gb1bd4aa/ /lib/modules/ -r

Target# sync

Target# reboot

wKgZPGiJgnWABpYgAAAfIhU_Bbc484.png图 2

wKgZPGiJgn6AGPhNAAAedmvKK4c974.png图 3Linux-RT内核

Cyclictest工具简介

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

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

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

使用Cyclictest测试系统实时性

本次测试对比基于Linux-RT-5.4.61内核和Linux-5.4.61内核的Linux系统实时性。参照如下步骤,结合Iperf和Cyclictest工具测试系统的实时性。此处使用Iperf工具不断触发系统中断,提高中断处理负载,以便更好测试系统实时特性。

在Ubuntu执行如下命令查看IP地址,并以服务器模式启动Iperf测试。

Host# ifconfig

Host# iperf-s

wKgZO2iJgomAUkJ-AAFCTUcmfwk381.png图 4

分别使用Linux-RT-5.4.61内核和Linux-5.4.61内核启动评估板,执行如下命令以客户端模式启动Iperf,并连接至服务器端(Ubuntu系统)。"192.168.1.209"为Ubuntu的IP地址,"-t3600"指定测试时间为3600秒,"&"表示让程序在后台运行。

Target# iperf -c 192.168.1.209 -d -t3600 > /dev/null 2>&1 &

wKgZPGiJgpCAHBFOAAAL8S5d9Is535.png图 5

执行如下命令使用Cyclictest程序测试系统实时性。

Target# cyclictest -t5 -p98 -m -n -D10m

wKgZO2iJgpiAUUVvAABJFH6whhE090.png

wKgZO2iJgqWAaut7AABQvpuPY54076.png图 7Linux-5.4.61内核测试结果

wKgZPGiJgrCAc7xXAAAnst9WFrQ572.png表 1Cyclictest测试结果说明

对比测试数据,可看到基于Linux-RT-5.4.61内核的系统的延迟更加稳定,平均延迟、最大延迟更低,系统实时性更佳。

Cyclictest命令参数解析可执行"cyclictest --help"查看,如下图所示。

wKgZO2iJgxGAB78WAACnbphmej8279.png图 8

wKgZPGiJgxmATRPCAAA-m0Tb4IU219.png图 9

Linux-RT性能测试

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

CPU空载状态

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

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

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

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

wKgZPGiJgyOASjD3AAAMyD064fI869.png图 10

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

Target# cyclictest -m -n -Sp99 -i1000 -h800 -D12h -q > output

wKgZO2iJgy2AWUa2AAAPN9uqlOk070.png图 11

参数解析:

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

-n:使用clock_nanosleep;

-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攻击某些进程而产生延迟,影响测试结果。

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

wKgZPGiJgyOASjD3AAAMyD064fI869.png图 12

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

Target# stress --cpu 2--io 2--vm 2--vm-bytes 32M --timeout43200s &

Target# cyclictest -m -n -Sp99 -i1000 -h800 -D12h -q > output

wKgZO2iJgzyAX-MaAAAn86XXx-0190.png图 13

参数解析:

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

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

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

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

--timeout:指定测试时长;

隔离CPU核心状态

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

评估板上电启动后,在U-Boot倒计时结束之前按下空格键进入U-Boot命令行模式,执行如下命令,修改环境变量,隔离CPU1核心。

U-Boot# setenv setargs_sd setenv bootargs clk_ignore_unused initcall_debug=${initcall_debug} console=${console} loglevel=${loglevel} root=${sd_root} init=${init} partitions=${partitions} cma=${cma} snum=${snum} mac_addr=${mac} wifi_mac=${wifi_mac} bt_mac=${bt_mac} specialstr=${specialstr} gpt=1 isolcpus=1

U-Boot# setenv setargs_nand_ubi setenv bootargs ubi.mtd=${mtd_name} clk_ignore_unused initcall_debug=${initcall_debug} console=${console} loglevel=${loglevel} root=${nand_root} rootfstype=${rootfstype} init=${init} partitions=${partitions} cma=${cma} snum=${snum} mac_addr=${mac} wifi_mac=${wifi_mac} bt_mac=${bt_mac} specialstr=${specialstr} gpt=1 isolcpus=1

U-Boot# saveenv

U-Boot# reset

wKgZO2iJg0OALZrAAABMNrMzXfI431.png图 14

备注:若为eMMC配置评估板,请执行如下命令,修改环境变量,隔离CPU1核心。

U-Boot# setenv setargs_emmc setenv bootargs clk_ignore_unused initcall_debug=${initcall_debug} console=${console} loglevel=${loglevel} root=${emmc_root} init=${init} partitions=${partitions} cma=${cma} snum=${snum} mac_addr=${mac} wifi_mac=${wifi_mac} bt_mac=${bt_mac} specialstr=${specialstr} gpt=1 isolcpus=1

U-Boot# setenv setargs_sd setenv bootargs clk_ignore_unused initcall_debug=${initcall_debug} console=${console} loglevel=${loglevel} root=${sd_root} init=${init} partitions=${partitions} cma=${cma} snum=${snum} mac_addr=${mac} wifi_mac=${wifi_mac} bt_mac=${bt_mac} specialstr=${specialstr} gpt=1 isolcpus=1

U-Boot# saveenv

U-Boot# reset

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

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

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

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

wKgZPGiJgyOASjD3AAAMyD064fI869.png图 15

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

Target# stress --cpu 2 --io 2 --vm 2 --vm-bytes 32M --timeout 43200s &

Target# taskset -c 0,1 cyclictest -m -n -Sp99 -i1000 -h800 -D12h -q > output

wKgZO2iJg1OADcpwAAAoUkNWjfc293.png图 16

统计结果分析

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

wKgZPGiJg1qAaS3cAABBIezCxfQ313.png图 17

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

Host# sudo apt-get install gnuplot

wKgZPGiJg2GAZUc7AAJ3z-WVvoQ080.png图 18

CPU空载状态

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

wKgZO2iJg2yAU-99AAAauPQIOSE405.png图 19

请将CPU空载状态下的统计结果output文件拷贝至Ubuntu,存放在get_histogram.sh同一目录下。执行如下命令生成直方图文件plot.png,请将其拷贝至Windows下并打开。

Host# ./get_histogram.sh

wKgZO2iJg3eAOHWLAAC1if0x5co986.png图 20

wKgZPGiJg4GAd0k9AAAX-FTQX0w117.png图 21

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

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

wKgZO2iJg5GALVLkAAATosthYaE599.png表 2

CPU满负荷状态

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

wKgZO2iJg5qAQLwBAAAZiqoEYEY201.png图 22

wKgZO2iJg6GAFX0nAAASzeVxGGY070.png表 3

隔离CPU核心状态

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

wKgZO2iJg6yAP80JAAAt_sA33b8387.png图 23

wKgZPGiJg7aAAErBAAASnampRO8123.png表 4

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

rt_gpio_ctrl案例

案例说明

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

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

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

案例测试

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

评估板上电启动后,在U-Boot倒计时结束之前按下空格键进入U-Boot命令行模式,执行如下命令,修改环境变量,隔离CPU1核心。

U-Boot# setenv setargs_sd setenv bootargs clk_ignore_unused initcall_debug=${initcall_debug} console=${console} loglevel=${loglevel} root=${sd_root} init=${init} partitions=${partitions} cma=${cma} snum=${snum} mac_addr=${mac} wifi_mac=${wifi_mac} bt_mac=${bt_mac} specialstr=${specialstr} gpt=1 isolcpus=1

U-Boot# setenv setargs_nand_ubi setenv bootargs ubi.mtd=${mtd_name} clk_ignore_unused initcall_debug=${initcall_debug} console=${console} loglevel=${loglevel} root=${nand_root} rootfstype=${rootfstype} init=${init} partitions=${partitions} cma=${cma} snum=${snum} mac_addr=${mac} wifi_mac=${wifi_mac} bt_mac=${bt_mac} specialstr=${specialstr} gpt=1 isolcpus=1

U-Boot# saveenv

U-Boot# reset

wKgZO2iJg0OALZrAAABMNrMzXfI431.png图 24

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

Target# sysctl kernel.sched_rt_runtime_us=-1

Target# taskset -c 1 ./rt_gpio_ctrl -t 10 -d 100

wKgZPGiJg8aADn2VAAAogBjKX9M498.png图 25

同时使用示波器捕捉LED两次电平翻转之间的间隔就对应上线程调度的延迟测试点为R46电阻一端。

wKgZO2iJg9CALBRWAABs9zE7OMA927.png图 26

算出电平两次翻转的时间间隔为?x=104us,如下图所示。由于程序中增加了100us的时间延时,因此实际延时时应为:104us– 100us= 4us,与程序统计打印的Latency results平均值5us相近。

wKgZO2iJhD6AJcmjAAJHxyWZ-fU360.png图 27

案例编译

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

Host# CC=/home/tronlong/T113/tina5.0_v1.0/out/t113_i/tlt113-evm-nand/buildroot/buildroot/host/usr/bin/arm-linux-gnueabi-gccCXX=/home/tronlong/T113/tina5.0_v1.0/out/t113_i/tlt113-evm-nand/buildroot/buildroot/host/usr/bin/arm-linux-gnueabi-g++ make

备注:若使用eMMC配置评估板,请将命令中的"tlt113-evm-nand"改为"tlt113-evm-emmc"。

wKgZO2iJhEiABvAnAAETGASNjdg588.png图 28

关键代码说明

(1)创建一个基于PREEMPT_RT的实时任务,具体操作包括内存锁定、线程堆栈内存设置、调度策略和优先级配置等。

wKgZPGiJhFGAJ5RuAAEVzQVrQQY990.png图 29

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

wKgZPGiJhF2ASCAsAACdBCfbabk687.png图 30

(3)统计调度时间延时情况。

wKgZO2iJhGmAHrqHAACbBnhFQ6w886.png图 31

?
审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11522

    浏览量

    214219
  • 开发板
    +关注

    关注

    25

    文章

    5725

    浏览量

    105587
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Qt应用开发--国产工业开发板T113-i的部署教程

    本次开发教程的测试板卡来自创龙科技的TLT113-EVM国产工业评估,基于
    的头像 发表于 11-05 08:44 ?3281次阅读
    Qt应用<b class='flag-5'>开发</b>--<b class='flag-5'>国产</b><b class='flag-5'>工业</b><b class='flag-5'>开发板</b><b class='flag-5'>T113-i</b>的部署教程

    【米尔-T113-i开发板试用】上电+配编译器+编译+运行ruapu测试工具流程视频

    MYC-YT113i核心开发板 真正的国产核心,100%国产物料认证
    发表于 02-25 22:49

    【米尔-T113-i开发板试用】米尔-T113-i开发环境搭建

    首先感谢MYIR & ELECFANS给与的使用米尔-T113-i开发板的机会。 一、开发板简介 米尔-
    发表于 03-01 21:43

    国产RISC-V基于T113-i异构多核平台

    T113-i是一款Cortex-A7@1.2GHz
    发表于 10-10 22:08

    国产RISC-V案例分享,基于T113-i异构多核平台!

    RISC-V核心优势T113-i是一款Cortex-A7@1.2GHz
    发表于 10-29 09:47

    【正点原子】T113-i开发板资料震撼来袭!异开发、工控设计方案!

    【正点原子】T113-i开发板震撼来袭!异开发、工控设计方案!ATK-DLT
    发表于 03-13 15:37

    A40i开发板——Linux-RT内核应用开发教程(2)

    处理器设计,4ARM Cortex-A7的高性能低功耗国产开发板,每主频高达1.2GHz。基
    发表于 04-19 15:22

    基于A40i开发板——Linux-RT内核应用开发教程(3)

    节——rt_input案例,欢迎各位阅读!本期用到的案例板子是创龙科技旗下的A40i工业级别开发板,是基于
    发表于 04-19 15:33

    T113-i+玄铁HiFi4开发板ARM Cortex-A7 )规格书

    评估简介创龙科技TLT113-EVM是一款基于科技T113-i
    发表于 01-31 22:42

    T113i国产核心上市

    产品更加坚固耐用,且开发板引出了尽可能多的处理器核心资源,是工业、电力、交通等关键领域实现国产化降本的优质之选! 01 超高性价比 工规处理器 不同于
    发表于 11-20 16:32

    多核异构工业开发板:创龙科技T113-i

    概述 本次评测开发板--创龙T113-i工业开发板,这是一款基于科技处
    的头像 发表于 10-24 10:26 ?2336次阅读
    多核异构<b class='flag-5'>工业</b><b class='flag-5'>开发板</b>:创龙科技<b class='flag-5'>T113-i</b>

    如何把LVGL移植到T113-i国产工业开发板

    本次开发教程的测试板卡来自创龙科技的TLT113-EVM国产工业评估,基于
    发表于 11-14 17:28 ?1486次阅读
    如何把LVGL移植到<b class='flag-5'>T113-i</b><b class='flag-5'>国产</b><b class='flag-5'>工业</b><b class='flag-5'>开发板</b>

    G2D图像处理硬件调用和测试-基于米尔-T113-i开发板

    ,100%国产物料认证国产T113-i处理器配备2*Cortex-A7@1.2GHz,RISC-V外置DDR3接口、支持视频编解码器、HiFi4DSP接口丰富:视频
    的头像 发表于 04-12 08:01 ?1410次阅读
    G2D图像处理硬件调用和测试-基于米尔-<b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>T113-i</b><b class='flag-5'>开发板</b>

    T113-i最新发布Tina5.0系统!支持3大新特性!

    创龙科技T113-iCortex-A7@1.2GHz
    的头像 发表于 05-14 08:05 ?1216次阅读
    <b class='flag-5'>T113-i</b>最新发布Tina5.0系统!支持3大新特性!

    国产T113-i Cortex-A7@1.2GHz 工业开发板—LVGL应用开发案

    本文主要演示基于TLT113-EVM评估的LVGL官方案例以及应用开发案
    的头像 发表于 07-29 10:06 ?123次阅读
    <b class='flag-5'>国产</b>!<b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>T113-i</b>  <b class='flag-5'>双</b><b class='flag-5'>核</b><b class='flag-5'>Cortex-A7@1.2GHz</b> <b class='flag-5'>工业</b><b class='flag-5'>开发板</b>—LVGL应用<b class='flag-5'>开发案</b>例