前言
為助力開發(fā)者高效開展創(chuàng)龍科技研發(fā)評(píng)估板的 Linux-RT 應(yīng)用開發(fā),本文先對(duì)比分析系統(tǒng)實(shí)時(shí)性,再測(cè)試不同 CPU 狀態(tài)下 Linux-RT 性能,同時(shí)提供兩類典型開發(fā)案例,詳解測(cè)試流程、編譯方法及核心代碼,幫助開發(fā)者掌握 Linux-RT 系統(tǒng)應(yīng)用開發(fā)要點(diǎn),保障評(píng)估板實(shí)時(shí)性應(yīng)用穩(wěn)定實(shí)現(xiàn)。
主要通過Cyclictest延遲檢測(cè)工具,以及基于Linux-RT的應(yīng)用程序評(píng)估Linux-RT系統(tǒng)的實(shí)時(shí)性,適用開發(fā)環(huán)境如下:
Windows開發(fā)環(huán)境:Windows 7 64bit、Windows 10 64bit
開發(fā)環(huán)境:VMware16.2.5、Ubuntu20.04.6 64bit
U-Boot:U-Boot-2017.09
Kernel:Linux-RT-5.10.160
LinuxSDK:LinuxSDK-[版本號(hào)](基于rk3588_linux_release_v1.2.1_20230720)
我司默認(rèn)使用的是Linux內(nèi)核,同時(shí)提供了Linux-RT內(nèi)核位于產(chǎn)品資料“4-軟件資料DebianKernelimagelinux-5.10.160-[版本號(hào)]-[Git系列號(hào)]”目錄下。請(qǐng)按照如下方法替換為L(zhǎng)inux-RT內(nèi)核。
將Linux-RT內(nèi)核鏡像boot-rt.img拷貝至評(píng)估板文件系統(tǒng)任意目錄下。執(zhí)行如下命令,替換內(nèi)核鏡像至系統(tǒng)啟動(dòng)卡,評(píng)估板重啟生效。
備注:mmcblk1p3為系統(tǒng)啟動(dòng)卡對(duì)應(yīng)的設(shè)備節(jié)點(diǎn),如需固化至eMMC,請(qǐng)將設(shè)備節(jié)點(diǎn)修改為mmcblk0p3。
Target# dd if=boot-rt.img of=/dev/mmcblk1p3
Target# sync
Target# reboot
圖 1
圖 2?Linux-RT內(nèi)核
我司提供的Linux-RT內(nèi)核應(yīng)用了開源的RT PREEMPT機(jī)制進(jìn)行補(bǔ)丁。PREEMPT_RT補(bǔ)丁的關(guān)鍵是最小化不可搶占的內(nèi)核代碼量,同時(shí)最小化必須更改的代碼量,以便提供這種附加的可搶占性。Linux-RT內(nèi)核增加PREEMPT_RT補(bǔ)丁后,增加了系統(tǒng)響應(yīng)的確定性和實(shí)時(shí)性,但是代價(jià)是CPU性能降低。
Linux-RT內(nèi)核與普通Linux內(nèi)核相比,幾個(gè)主要的相同之處是:
具有相同的開發(fā)生態(tài)系統(tǒng),包括相同工具鏈、文件系統(tǒng)和安裝方法,以及相同的POSIX API等。
仍然存在內(nèi)核空間和用戶空間的劃分。
Linux應(yīng)用程序在用戶空間中運(yùn)行。
Linux-RT內(nèi)核與普通Linux內(nèi)核在常規(guī)編程方式上的幾個(gè)主要不同之處是:
調(diào)度策略。
優(yōu)先級(jí)和內(nèi)存控制。
基于Linux-RT內(nèi)核的應(yīng)用程序使用了調(diào)度策略后,系統(tǒng)將根據(jù)調(diào)度策略對(duì)其進(jìn)行調(diào)優(yōu)。
Linux系統(tǒng)實(shí)時(shí)性測(cè)試
本章節(jié)主要介紹使用Cyclictest延遲檢測(cè)工具測(cè)試Linux系統(tǒng)實(shí)時(shí)性的方法。Cyclictest是rt-tests測(cè)試套件下的一個(gè)測(cè)試工具,也是rt-tests下使用最廣泛的測(cè)試工具,一般主要用來(lái)測(cè)試內(nèi)核的延遲,從而判斷內(nèi)核的實(shí)時(shí)性。
Cyclictest常用于實(shí)時(shí)系統(tǒng)的基準(zhǔn)測(cè)試,是評(píng)估實(shí)時(shí)系統(tǒng)相對(duì)性能的最常用工具之一。Cyclictest反復(fù)測(cè)量并精確統(tǒng)計(jì)線程的實(shí)際喚醒時(shí)間,以提供有關(guān)系統(tǒng)的延遲信息。它可測(cè)量由硬件、固件和操作系統(tǒng)引起的實(shí)時(shí)系統(tǒng)的延遲。
為了測(cè)量延遲,Cyclictest運(yùn)行一個(gè)非實(shí)時(shí)主線程(調(diào)度類SCHED_OTHER),該線程以定義的實(shí)時(shí)優(yōu)先級(jí)(調(diào)度類SCHED_FIFO)啟動(dòng)定義數(shù)量的測(cè)量線程。測(cè)量線程周期性地被一個(gè)到期的計(jì)時(shí)器(循環(huán)報(bào)警)所定義的間隔喚醒,隨后計(jì)算有效喚醒時(shí)間,并通過共享內(nèi)存將其傳遞給主線程。主線程統(tǒng)計(jì)延遲值并打印最小、最大和平均延遲時(shí)間。
參考鏈接:https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/cyclictest/start?s[]=cyclictest。
Linux、Linux-RT實(shí)時(shí)性對(duì)比
本次測(cè)試結(jié)合Iperf和Cyclictest工具,對(duì)比測(cè)試基于Linux-RT-5.10.160內(nèi)核和Linux-5.10.160內(nèi)核的系統(tǒng)實(shí)時(shí)性能。此處使用Iperf工具不斷觸發(fā)系統(tǒng)中斷,提高中斷處理負(fù)載,以便更好測(cè)試系統(tǒng)實(shí)時(shí)特性。
在Ubuntu執(zhí)行如下命令查看IP地址,并以服務(wù)器模式啟動(dòng)Iperf測(cè)試。
Host# ifconfig
Host# iperf3 -s
圖 3
分別使用Linux-RT-5.10.160內(nèi)核和Linux-5.10.160內(nèi)核啟動(dòng)評(píng)估板,執(zhí)行如下命令以客戶端模式啟動(dòng)Iperf,并連接至服務(wù)器端(Ubuntu系統(tǒng))。"192.168.13.8"為Ubuntu的IP地址,"-t3600"設(shè)置測(cè)試時(shí)間為3600秒,"&"表示讓程序在后臺(tái)運(yùn)行。
Target# iperf3 -c 192.168.13.8 -d -t3600 > /dev/null 2>&1 &
圖 4
評(píng)估板文件系統(tǒng)默認(rèn)已提供Cyclictest工具,進(jìn)入評(píng)估板文件系統(tǒng),執(zhí)行如下命令使用Cyclictest工具測(cè)試系統(tǒng)實(shí)時(shí)性。
Target# stress --cpu 8--io 8--vm 8--vm-bytes 64--timeout 620s &
Target# cyclictest -t5 -p98 -m -D10m
圖 5?Linux-RT-5.10.160內(nèi)核測(cè)試結(jié)果
圖 6?Linux-5.10.160內(nèi)核測(cè)試結(jié)果

對(duì)比測(cè)試數(shù)據(jù),可看到基于Linux-RT-5.10.160內(nèi)核的系統(tǒng)的延遲更加穩(wěn)定,平均延遲、最大延遲更低,系統(tǒng)實(shí)時(shí)性更佳。
Cyclictest命令參數(shù)解析可執(zhí)行"cyclictest --help"查看,如下圖所示。
圖 7
圖 8
Linux-RT性能測(cè)試
本次測(cè)試分別在CPU空載、滿負(fù)荷(運(yùn)行stress壓力測(cè)試工具)、隔離CPU核心的情況下,對(duì)比評(píng)估Linux-RT內(nèi)核的系統(tǒng)實(shí)時(shí)性。
CPU空載狀態(tài)
評(píng)估板上電啟動(dòng),進(jìn)入評(píng)估板文件系統(tǒng)執(zhí)行如下命令,修改內(nèi)核printk日志等級(jí),避免內(nèi)核打印信息影響實(shí)時(shí)測(cè)試。
Target# echo 1 > /proc/sys/kernel/printk
調(diào)整內(nèi)存分配策略為“1”,禁止內(nèi)存過度使用。避免出現(xiàn)OOM(Out-of-Memory) Killer攻擊某些進(jìn)程而產(chǎn)生延遲,影響測(cè)試結(jié)果。
Target# echo 1> /proc/sys/vm/overcommit_memory
圖 9
執(zhí)行如下命令,基于CPU空載狀況下測(cè)試系統(tǒng)的實(shí)時(shí)性。測(cè)試指令需運(yùn)行24小時(shí),請(qǐng)保持評(píng)估板長(zhǎng)時(shí)間穩(wěn)定工作,測(cè)試完成后將生成統(tǒng)計(jì)結(jié)果no_load_output文件。
Target# cyclictest -m -Sp99 -i1000 -h800 -D24h -q > no_load_output
圖 10
參數(shù)解析:
-m:鎖定當(dāng)前和將來(lái)的內(nèi)存分配;
-S:采用標(biāo)準(zhǔn)SMP測(cè)試;
-p:設(shè)置線程優(yōu)先級(jí);
-i:設(shè)置線程的基本間隔;
-h:運(yùn)行后將延遲直方圖轉(zhuǎn)儲(chǔ)至標(biāo)準(zhǔn)輸出,亦可指定要跟蹤的最大延時(shí)時(shí)間(以微秒為單位);
-D:指定測(cè)試運(yùn)行時(shí)長(zhǎng),附加m(分鐘)、h(小時(shí))、d(天)指定;
-q:運(yùn)行時(shí)不打印相關(guān)信息;
CPU滿負(fù)荷狀態(tài)
評(píng)估板上電啟動(dòng),進(jìn)入評(píng)估板文件系統(tǒng)執(zhí)行如下命令,修改內(nèi)核printk日志等級(jí),避免內(nèi)核打印信息影響實(shí)時(shí)測(cè)試。
Target# echo 1 > /proc/sys/kernel/printk
調(diào)整內(nèi)存分配策略為“1”,禁止內(nèi)存過度使用。避免出現(xiàn)OOM(Out-of-Memory) Killer攻擊某些進(jìn)程而產(chǎn)生延遲,影響測(cè)試結(jié)果。
Target# echo 1> /proc/sys/vm/overcommit_memory
圖 11
執(zhí)行如下命令,運(yùn)行stress壓力測(cè)試工具,使得CPU處于滿負(fù)荷狀態(tài)。再使用cyclictest工具測(cè)試CPU滿負(fù)荷狀態(tài)下的系統(tǒng)實(shí)時(shí)性能。測(cè)試指令需運(yùn)行24小時(shí),請(qǐng)保持評(píng)估板長(zhǎng)時(shí)間穩(wěn)定工作,測(cè)試完成后將生成統(tǒng)計(jì)結(jié)果overload_output文件。
Target# stress --cpu 8 --io 8 --vm 8 --vm-bytes 64 --timeout 86400s &
Target# cyclictest -m -Sp99 -i1000 -h800 -D24h -q > overload_output
圖 12
參數(shù)解析:
--cpu:指定壓力測(cè)試的進(jìn)程個(gè)數(shù);
--io:指定I/O測(cè)試的進(jìn)程個(gè)數(shù);
--vm:指定內(nèi)存測(cè)試的進(jìn)程個(gè)數(shù);
--vm-bytes:指定每個(gè)內(nèi)存測(cè)試進(jìn)程中分配內(nèi)存的大小;
--timeout:指定測(cè)試時(shí)長(zhǎng);
隔離CPU核心狀態(tài)
本次測(cè)試以隔離CPU3核心為例,通過降低系統(tǒng)上所運(yùn)行的其他進(jìn)程對(duì)隔離CPU3產(chǎn)生的延遲影響,確保CPU3進(jìn)程的正常運(yùn)行,進(jìn)而評(píng)估Linux-RT內(nèi)核的系統(tǒng)實(shí)時(shí)性。
評(píng)估板上電啟動(dòng)前長(zhǎng)按"Ctrl + C"進(jìn)入U(xiǎn)-Boot命令行模式,執(zhí)行如下命令,修改環(huán)境變量,隔離CPU3核心。
U-Boot# setenvbootargs"storagemedia=emmc androidboot.storagemedia=emmc androidboot.mode=normalisolcpus=3"
U-Boot# saveenv
U-Boot# reset
圖 13
進(jìn)入評(píng)估板文件系統(tǒng),執(zhí)行如下命令,查看環(huán)境變量是否設(shè)置成功。
Target# cat /proc/cmdline
圖 14
執(zhí)行如下命令,修改內(nèi)核printk日志等級(jí),避免內(nèi)核打印信息影響實(shí)時(shí)測(cè)試。
Target# echo 1 > /proc/sys/kernel/printk
調(diào)整內(nèi)存分配策略為“1”,禁用內(nèi)存過度使用。避免出現(xiàn)OOM(Out-of-Memory) Killer攻擊某些進(jìn)程而產(chǎn)生延遲,影響測(cè)試結(jié)果。
Target# echo 1 > /proc/sys/vm/overcommit_memory
圖 15
執(zhí)行如下命令,運(yùn)行stress壓力測(cè)試工具,使得CPU處于滿負(fù)荷狀態(tài)。再使用taskset工具將cyclictest測(cè)試程序運(yùn)行在CPU3核心,測(cè)試CPU3核心滿負(fù)荷狀態(tài)下的系統(tǒng)實(shí)時(shí)性能。測(cè)試指令需運(yùn)行24小時(shí),請(qǐng)保持評(píng)估板長(zhǎng)時(shí)間穩(wěn)定工作,測(cè)試完成后將生成統(tǒng)計(jì)結(jié)果iso_overload_output文件。
Target# stress --cpu 8 --io 8 --vm 8 --vm-bytes 64 --timeout 86400s &
Target# taskset -c 0-7 cyclictest -m -Sp99 -i1000 -h800 -D24h -q > iso_overload_output
圖 16
統(tǒng)計(jì)結(jié)果分析
我司已提供腳本文件get_histogram.sh用于繪制統(tǒng)計(jì)結(jié)果直方圖,位于產(chǎn)品資料“4-軟件資料Demolinux-rt-demosCyclictestbin”目錄下,請(qǐng)將該腳本文件拷貝至Ubuntu工作目錄下。
執(zhí)行如下命令,賦予get_histogram.sh腳本可執(zhí)行權(quán)限。
Host# chmod a+x get_histogram.sh
圖 17
在Ubuntu系統(tǒng)執(zhí)行如下命令,安裝gnuplot工具。
Host# sudo apt-get install gnuplot -y
圖 18
CPU空載狀態(tài)
請(qǐng)將CPU空載狀態(tài)下的統(tǒng)計(jì)結(jié)果no_load_output文件拷貝至Windows工作目錄,使用Windows文本工具打開該文件并拖動(dòng)至文件末尾,可查看Linux系統(tǒng)每個(gè)核心(CPU0~CPU7)的最小延遲(MinLatencies)、平均延遲(AvgLatencies)、最大延遲(MaxLatencies)統(tǒng)計(jì)結(jié)果。
圖 19
請(qǐng)將CPU空載狀態(tài)下的統(tǒng)計(jì)結(jié)果no_load_output文件拷貝至Ubuntu,存放在get_histogram.sh同一目錄下。
執(zhí)行如下命令,拷貝并修改CPU空載狀態(tài)下的統(tǒng)計(jì)結(jié)果文件名為output,并生成直方圖文件plot.png,請(qǐng)將其拷貝至Windows下打開。
備注:滿負(fù)荷狀態(tài)統(tǒng)計(jì)結(jié)果文件overload_output與隔離CPU核心狀態(tài)統(tǒng)計(jì)結(jié)果文件iso_overload_output亦需將文件名修改為output方可生成直方圖文件plot.png。
Host# cp no_load_output output
Host# ./get_histogram.sh
圖 20
圖 21
根據(jù)統(tǒng)計(jì)結(jié)果no_load_output文件數(shù)據(jù)以及結(jié)合直方圖,可得主要數(shù)據(jù)如下表。本次測(cè)試中,CPU1核心Max Latencies值最大,為54us,CPU7核心的Max Latencies值最小,為16us。
備注:
CPU0~CPU3為Cortex-A55核心,CPU4~CPU7為Cortex-A76核心。由于Cortex-A76為高性能核心,Cortex-A55為低功耗核心,因此CPU4~CPU7的測(cè)試結(jié)果會(huì)比CPU0~CPU3實(shí)時(shí)性更好。
測(cè)試數(shù)據(jù)與實(shí)際測(cè)試環(huán)境有關(guān),僅供參考。

1.CPU滿負(fù)荷狀態(tài)
參考如上方法,分析CPU滿負(fù)荷狀態(tài)下的統(tǒng)計(jì)結(jié)果如下所示。本次測(cè)試中,CPU0核心Max Latencies值最大,為59us,CPU5、CPU7核心的Max Latencies值最小,為25us。

圖 22
2.隔離CPU核心狀態(tài)
參考如上方法,分析隔離CPU核心狀態(tài)下的統(tǒng)計(jì)結(jié)果如下所示。本次測(cè)試中,CPU0、CPU1核心Max Latencies值最大,為59us,隔離CPU3核心的Max Latencies值相比CPU空載狀態(tài)、CPU滿負(fù)荷狀態(tài)時(shí)CPU3核心的Max Latencies值最小,為18us。

圖 23
根據(jù)CPU空載、CPU滿負(fù)荷、隔離CPU核心三種狀態(tài)的測(cè)試結(jié)果可知:當(dāng)程序指定至隔離的CPU3核心上運(yùn)行時(shí),Debian系統(tǒng)延遲降低,可有效提高系統(tǒng)實(shí)時(shí)性。故推薦對(duì)實(shí)時(shí)性要求較高的程序(功能)指定至隔離的CPU核心運(yùn)行。
rt_gpio_ctrl案例
案例說(shuō)明
通過創(chuàng)建一個(gè)基本的實(shí)時(shí)線程,在線程內(nèi)觸發(fā)LED的電平翻轉(zhuǎn),同時(shí)程序統(tǒng)計(jì)實(shí)時(shí)線程的調(diào)度延時(shí),并通過示波器測(cè)出LED電平兩次翻轉(zhuǎn)的時(shí)間間隔。由于程序默認(rèn)以最高優(yōu)先級(jí)運(yùn)行,為避免CPU資源被程序完全占用導(dǎo)致系統(tǒng)被掛起,因此在程序中增加100us的延時(shí)。程序原理大致如下:
在Linux-RT內(nèi)核上創(chuàng)建、使用實(shí)時(shí)線程。
實(shí)時(shí)線程中,計(jì)算出觸發(fā)LED電平翻轉(zhuǎn)的系統(tǒng)調(diào)度延時(shí)。
案例測(cè)試
本次測(cè)試以隔離CPU4核心為例進(jìn)行演示,評(píng)估板上電前長(zhǎng)按"Ctrl + C"進(jìn)入U(xiǎn)-Boot命令行模式,修改環(huán)境變量,隔離CPU4核心,保存環(huán)境變量后重啟評(píng)估板。
U-Boot# setenvbootargs"storagemedia=emmc androidboot.storagemedia=emmc androidboot.mode=normalisolcpus=4"
U-Boot# saveenv
U-Boot# reset
圖 24
進(jìn)入評(píng)估板文件系統(tǒng),執(zhí)行如下命令,確認(rèn)已正確隔離CPU。
Target# cat /proc/cmdline
圖 25
將案例bin目錄下的可執(zhí)行文件拷貝至評(píng)估板文件系統(tǒng),并執(zhí)行如下命令運(yùn)行測(cè)試程序,再按"Ctrl + C"退出測(cè)試,串口終端將打印程序統(tǒng)計(jì)的延遲數(shù)據(jù),如下圖所示。
Target# taskset -c 4 ./rt_gpio_ctrl
圖 26
同時(shí)使用示波器捕捉LED兩次電平翻轉(zhuǎn)之間的間隔,即可得到線程調(diào)度的延遲,測(cè)試點(diǎn)為R62電阻一端。
圖 27
本次測(cè)得電平翻轉(zhuǎn)周期為?x=104us,如下圖所示。由于程序中默認(rèn)增加了100us的時(shí)間延時(shí),因此實(shí)際延時(shí)應(yīng)為:104us -100us = 4us,與程序統(tǒng)計(jì)打印的Latency results平均值相近。
圖 28
案例編譯
將產(chǎn)品資料“4-軟件資料Demolinux-rt-demosrt_gpio_ctrlsrc”案例源碼拷貝至Ubuntu。進(jìn)入案例源碼目錄,執(zhí)行如下命令,編譯案例生成可執(zhí)行文件。
Host# export PATH=/home/tronlong/RK3588/rk3588_linux_release_v1.2.1/extra-tools/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin:$PATH
Host# make CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++
圖 29
關(guān)鍵代碼說(shuō)明
(1)創(chuàng)建實(shí)時(shí)任務(wù),具體操作包括內(nèi)存鎖定、線程堆棧內(nèi)存設(shè)置、調(diào)度策略和優(yōu)先級(jí)配置等。
圖 30
(2)在線程中打開LED文件節(jié)點(diǎn),并對(duì)LED狀態(tài)進(jìn)行翻轉(zhuǎn)。
圖 31
(3)統(tǒng)計(jì)調(diào)度時(shí)間延時(shí)情況。
圖 32
?由于篇幅過長(zhǎng)等原因,部分內(nèi)容均不逐一展示,如需獲取完整版詳細(xì)資料,請(qǐng)關(guān)注創(chuàng)龍科技微信公眾號(hào)或官網(wǎng),或者評(píng)論區(qū)留言,感謝您的支持!
審核編輯 黃宇
-
Linux
+關(guān)注
關(guān)注
88文章
11786瀏覽量
219325 -
開發(fā)板
+關(guān)注
關(guān)注
26文章
6345瀏覽量
119445 -
RK3588
+關(guān)注
關(guān)注
8文章
571瀏覽量
7481
發(fā)布評(píng)論請(qǐng)先 登錄
Banana Pi開源社區(qū)基于瑞芯微RK3588開發(fā)板,DeepSeek開發(fā)利器
迅為RK3588開發(fā)板運(yùn)行openkylin麒麟系統(tǒng)
探索巔峰性能 |迅為瑞芯微RK3588開發(fā)板/核心板深度剖析
迅為瑞芯微RK3588開發(fā)板深度剖析丨首選的性能
Banana Pi開源社區(qū)基于瑞芯微RK3588開發(fā)板,DeepSeek開發(fā)利器
迅為瑞芯微iTOP-3588開發(fā)板/核心板
迅為RK3588開發(fā)板Linux安卓麒麟瑞芯微國(guó)產(chǎn)工業(yè)AI人工智能
香蕉派 BPI-W3采用瑞芯微RK3588開源硬件開發(fā)板公開發(fā)售
全國(guó)產(chǎn)!RK3588(2.4GHz八核AI 6T NPU 8K麒麟)工業(yè)核心板規(guī)格書
創(chuàng)龍 瑞芯微 RK3588 國(guó)產(chǎn)2.4GHz八核 工業(yè)開發(fā)板—調(diào)試工具安裝
創(chuàng)龍 瑞芯微 RK3588 國(guó)產(chǎn)2.4GHz八核 工業(yè)開發(fā)板—視頻圖像處理框架
RK3588核心板/開發(fā)板RT-Linux系統(tǒng)實(shí)時(shí)性及硬件中斷延遲測(cè)試
創(chuàng)龍 瑞芯微 RK3588 國(guó)產(chǎn)2.4GHz八核 工業(yè)開發(fā)板—Linux-RT應(yīng)用開發(fā)案例
評(píng)論