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

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

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

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

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

創(chuàng)龍 瑞芯微 RK3588 國產(chǎn)2.4GHz八核 工業(yè)開發(fā)板—Linux-RT應(yīng)用開發(fā)案例
評論