This tutorial-article is on How to optimize the real time performance of applications or threads running on Petalinux targeting Xilinx MPSoC and SoC FPGAs. Every real time application require low latency performance, for that this tutorial comes in place!
As Xilinx MPSoC consists of multiple APU, RPU cores for running multiple types of processes, in this tutorial we will be using APU cores for latency optimization using RT patch and then we will Isolate specific CPU cores of APU for high priority application. The Isolation of CPU cores allows for running dedicated application on dedicated CPU cores, so no other threads or application can delay the high priority dedicate application.
Reference of this work are : High Performance Real-time Linux Solution for Xilinx Ultrascale+, Trenz Electronic-Wiki Page.
Applying linux RT patch in petalinux kernel:
- Download the Xilinx linux kernel source at
<petalinux-root>/components/
Here we are using git command to clone the kernel source at petalinux components directorygit clone https://github.com/Xilinx/linux-xlnx.git
. This will createlinux-xlnx
folder.
Also renamed the directory tolinux-xlnx-rt
as we are going to apply the rt patch to the source. - Get the appropriate linux-rt patch version for your kernel from https://www.kernel.org/pub/linux/kernel/projects/rt/
- Patches for older kernel revisions can be found in the older/ directory
- Make sure you download the patch version whose kernel version matches exactly with your kernel version
- Refer to the following table for Linux kernel version of PetaLinux relases,
PetaLinux | 2021.2 | 2022.1 |
---|---|---|
Kernel | xlnx_rebase_v5.10 | 5.15 |
Device-tree | xlnx_rel_v2021.2 | |
U-boot | xlnx_rebase_v2021.01 | 2022.01 |
Xen | xlnx_rebase_4.14 | 4.16 |
ARM-Trusted-Firmware (ATF) | xlnx_rebase_v2.4 | v2.6 |
GCC | MB compiler version 10.2 ARM 10.2.0 | |
Yocto | 3.4 | |
FSBL, PMU Firmware, PLM, PSM Firmware | xlnx_rel_v2021.2 | |
QEMU | xlnx_rel_v2021.2 | 6.1.0 |
or find the kernel version of source check the Makefile in downloaded source. Here is the contents of Makefile showing kernel version:
- Make sure to download the
*.patch.gz
version of the patch. So for above case we need to download 5.10 version for patch files. - Tested patch file https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/5.10/older/patch-5.10-rc7-rt16.patch.gz
- Copy the
*-patch.gz
file to<petalinux-root>/components/
folder - In terminal go to the kernel source directory
cd linux-xlnx-rt
- Patch the kernel sources by running following command:
zcat ../*.patch.gz | patch -p1
- Now in petalinux working directory, after setting up the petalinux environment, create the petalinux project
- Next run the petalinux configuration command
petalinux-config
- Go to
Linux Components Selection
->linux-kernel
and change option fromlinux-xlnx
toext-local-src
- Next assign path to
Linux Components Selection
->External linux-kernel local source settings
->External linux-kernel local source path
and assign the path pointing to <petalinux-root>/components/linux-xlnx-rt
folder
- Save and exit the configuration program
- Next start the petalinux kernel configuration by running following command:
petalinux-config -c kernel
- Go to
General setup
->Timers subsystemand
, make sureHigh Resolution Timer Support
is selected
- Go back to the
General Setup
menu and to-->Preemption Model
. SelectFully Preemptive Kernel (RT)
to activate the linux-rt features
- Go back to the main menu and to-->
Kernel Features
->Timer frequency
and set it to1000 Hz
-
Go back to the main menu and select-->
CPU power Management
. Disable the CPU frequency scaling -
Save the configuration and exit from the program
-
Now next build the petalinux project
petalinux-build
and copy the generated image.ub
at <petalinux-project-folder>/images/linux folder to sd-card boot partition.
- Now boot the board with sd-card and check the kenel version with following command:
uname -a
- Here kernel is updated with
5.10.0-rt16-xilinx-v2021.1 #1 SMP PREEMPT_RT
patch
Above method will update the kernel source and improve the latency for Real time solution in petalinux. Here is the result of cyclictest
application before and after the updated kernel.
Latency measurement with Cyclictest
Before Kernel Patch max latency = 215 micro second
Here is the graph for the test:
After Kernel Patch:Max Latency = 29 micro second and corresponding graph of the test:
Next option is to isolate the CPU for our custom application only and leaving the other remaining CPUs for linux operating system.
Isolation of CPUs
To isolate the CPU follow the following steps:
- Start the petalinux config:
petalinux-config
- Isolate one core of CPU by adding
isolcpus = <cpu no>
bootargs in petalinux config at
DTG Settings
--> Kernel Bootargs
--> user set kernel bootargs
- Build the project
- After booting the petalinux, verify that above bootargs is set in petalinux by checking the following files in petalinux:
cat /sys/devices/system/cpu/isolated
- In above example CPU3 is isolated, so all petalinux applications runs in CPU0-2 unless we set the CPUs affinity to the isoated CPU.To run the application in isolated CPU, use application like
taskset
orin C programming add following thread apis to attach the application to isolated CPUs
int s;
cpu_set_t cpuset;
pthread_t thread;
thread = pthread_self();
// Set affinity mask to include CPUs 0 to 7
CPU_ZERO(&cpuset);
CPU_SET(3, &cpuset);
// assign the thread to third CPU
s = pthread_setaffinity_np(thread, sizeof(cpuset), &cpuset);
Also check the affinity of application using following command:taskset -c -p <pid>
For example checking the affinity for PID 1, init process with 4th isolated CPU:
Also here is the cyclictest result for the isolated CPU 3 and loaded the system with an application which creates a 50 processes in loop.
Max Latency: 37 micro seconds
But in case of isolated CPU, we got Max Latency = 14 micro seconds
网友评论