Xenomai实现RTOS(2)资源收集以及笔记

本文详细探讨了Linux系统中的实时进程调度,包括SCHED_FIFO、SCHED_RR和SCHED_NORMAL策略。通过CyclicTest和RT-tests进行实时性测试,并介绍了如何在Linux环境下使用Xenomai进行实时性能评估。文章还涵盖了Xenomai的安装、配置和应用,以及C语言编程中涉及的实时任务创建和周期性执行。
摘要由CSDN通过智能技术生成

实时性测试: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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值