实时性测试:cyclictest详解
必须了解的Linux系统中的进程调度
看了一点资料,是不是可以理解为:Linux中的实时进程和普通进程的task_struct数据结构不同;使用的调度策略不同(SCHED_FIFO 、 SCHED_RR和SCHED_NORMAL),导致了进程被区分为实时进程和普通进程
浅析Linux中完全公平调度——CFS
查看系统中的进程列表,以及它们对应的实时优先级(RTPRIO),如果该列显示-
,则不是实时进程。
ps -eo state,uid,pid,ppid,rtprio,time,comm
linux进程调度方法(SCHED_OTHER,SCHED_FIFO,SCHED_RR)
使用RT-tests与Linux Test Project (LTP)测试系统实时性:Worst Case Latency Test Scenarios。
sudo time cyclictest -t4 -p 99 -i 1000 -n -l 1000000000000 -m
# Generating the disk i/o load
while true; do taskset -c 3 /bin/du / ; done &
# Generating the CPU load with Ping
taskset -c 0 /bin/ping -l 100000 -q -s 10 -f localhost &
taskset -c 1 /bin/ping -l 100000 -q -s 10 -f localhost &
taskset -c 2 /bin/ping -l 100000 -q -s 10 -f localhost &
taskset -c 3 /bin/ping -l 100000 -q -s 10 -f localhost &
# Generating the Network load
# First start the server...
/usr/bin/netserver
# then start netperf to connect to the server
/usr/bin/netperf -H <IP_ADDR_OF_SERVER> -t TCP_STREAM -A 16K,16K -l 3600
# Streamming Stress using firefox webbrowser.
firefox http://www.intomail.net/stream.php
2022年1月11日 18:47:07对RT-tests包和Linux Test Project包研究后得出的结论:使用CyclicTest只能对非实时系统以及打有Preempt-RT补丁(虽然没测过)的系统起作用;想要验证Cobalt内核的有效性,就必须自己写benchmark,可以先参照Xenomai的latency benchmark是如何实现的。
C语言编程技巧-signal(信号机制)
Linux多进程编程
2022年2月15日 11:41:20:
ROS探索总结(二十九)——功夫茶机器人项目总结 评论里面有很多关于xenomai的讨论,可以参考一波。
xeno-test
根据官方文档中的说法,运行/usr/xenomai/bin/latency
查看是否有报错后,就要运行xeno-test
命令来评估系统性能了,这里就遇到了第一个坑:
如果直接运行这个命令会提示你找不到,建议
sudo apt install xenomai-system-tools
,坑的是这个system-tools对应的是2.6.4版本的xenomai,安上就错了。
xeno-test实际上是包含在/usr/xenomai/bin/
目录下的,这里每次都要输入/usr/xenomai/bin/xeno-test
很麻烦,首先在.zshrc中添加:
export PATH=/usr/xenomai/bin:$PATH
接着按照这个教程《sudo + command时,提示找不到命令》配置一下。
接着可以输入xeno-test --help
给的示例命令看看:sudo xeno-test -l "dohell -s 192.168.0.5 -m /mnt -l /ltp" -t 2
入门代码一段如下(网上抄的):
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/mman.h>
#include <alchemy/task.h>
#include <alchemy/timer.h>
#include <math.h>
#define CLOCK_RES 1e-9 //Clock resolution is 1 ns by default
#define LOOP_PERIOD 1e7 //Expressed in ticks
//RTIME period = 1000000000;
RT_TASK loop_task;
void loop_task_proc(void *arg)
{
RT_TASK *curtask;
RT_TASK_INFO curtaskinfo;
int iret = 0;
RTIME tstart, now;
curtask = rt_task_self();
rt_task_inquire(curtask, &curtaskinfo);
int ctr = 0;
//Print the info
printf("Starting task %s with period of 10 ms ....\n", curtaskinfo.name);
//Make the task periodic with a specified loop period
rt_task_set_periodic(NULL, TM_NOW, LOOP_PERIOD);
tstart = rt_timer_read();
//Start the task loop
while(1){
printf("Loop count: %d, Loop time: %.5f ms\n", ctr, (rt_timer_read() - tstart)/1000000.0);
ctr++;
rt_task_wait_period(NULL);
}
}
int main(int argc, char **argv)
{
char str[20];
//Lock the memory to avoid memory swapping for this program
//Linux提供的函数,内存交换会导致实时任务错过deadline,该命令会使进程锁定在RAM中
mlockall(MCL_CURRENT | MCL_FUTURE);
printf("Starting cyclic task...\n");
//Create the real time task
sprintf(str, "cyclic_task");
rt_task_create(&loop_task, str, 0, 50, 0);
//Since task starts in suspended mode, start task
rt_task_start(&loop_task, &loop_task_proc, 0);
//Wait for Ctrl-C
pause();
return 0;
}
我的c_cpp_properties.json:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/xenomai/include/**",
"/usr/xenomai/include/*" //这里不这样写,stdio.h会报错,什么鬼。。。
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++14",
"intelliSenseMode": "linux-clang-x64"
}
],
"version": 4
}
ARM64平台安装Xenomai的尝试
使用的开发板是OK8MM-C,这块板的CPU是imx8m mini的。首先替换官方提供的sdk中的OK8MM-linux-kernel/文件夹为自己的kernel源码。
sudo apt update
sudo apt install gcc-7-aarch64-linux-gnu
sudo apt install gcc-aarch64-linux-gnu
~/Downloads/xenomai-v3.2.1/scripts/prepare-kernel.sh --arch=arm64
mkdir -p ./build/linux
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=./build/linux defconfig
#在./build/linux目录下生成.config配置文件。
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=./build/linux menuconfig
# 原教程中没有提到这一句,但是总要配置的吧?
arm64的menuconfig界面与x86下的totally different…
* General setup
--> Local version - append to kernel release: -jiayu
# `uname -a`会额外显示的自定义文本,写什么无所谓吧。
* ACPI (Advanced Configuration and Power Interface) Support
--> Processor (Disable)
* Kernel Features
--> Multi-core scheduler support (Disable)
* CPU Power Management
--> CPU Idle
--> CPU idle PM support (Disable)
--> CPU Frequency scaling
--> CPU Frequency scaling (Disable)
* Device Drivers
--> Graphics support (Disable)
--> ETNAVIV (DRM support for Vivante GPU IP cores) (Disable)
# page migration的依赖
* Memory Management options
--> Transparent Hugepage Support (Disable)
--> Allow for memory compaction (Disable)
--> Contiguous Memory Allocator (Disable)
--> Page Migration (Disable)
编译开始!
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=./build/linux Image dtbs modules
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=./build/linux modules_install INSTALL_MOD_PATH=/home/jiayu/
把编译出来的5.10.76-jiayu文件夹整个粘贴到文件系统中的/lib/modules下面。
参考资料
Building_Applications_For_Xenomai_3
宝藏!Xenomai General
Real-Time Programming with Xenomai 3 - Part 1: Installation and Basic Setup
Real-Time Programming with Xenomai 3 - Part 2: Writing a simple periodic task.