第4篇:第一个程序:Hello World、编译运行

一、xeno-config 介绍

xeno-config 是 Xenomai 提供的配置查询工具,用于获取 Xenomai 库的编译和链接参数。

# 查看帮助
xeno-config --help

# 查看版本
xeno-config --version

# 获取编译参数(头文件路径)
xeno-config --cflags

# 获取链接参数(库文件路径)
xeno-config --ldflags

# 指定 POSIX 皮肤
xeno-config --posix

# 查看所有可用选项
xeno-config --help

常用组合:

# 编译时使用
$(xeno-config --posix --cflags --ldflags)

二、编写 Hello World 程序

使用 POSIX API 编写简单实时任务:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <mqueue.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>

/* 线程优先级:1-99,数值越高优先级越高 */
#define HIGH_PRIORITY  50

/* 线程属性 */
pthread_t thread;
pthread_attr_t attr;
struct sched_param param;

void *hello_func(void *arg)
{
    struct timespec ts;
    ts.tv_sec = 1;
    ts.tv_nsec = 0;
    
    while (1) {
        printf("Hello World from Xenomai!\n");
        /* 使用 clock_nanosleep 代替 sleep,避免普通睡眠的系统调用 */
        clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL);
    }
    return NULL;
}

int main(int argc, char *argv[])
{
    printf("Starting Xenomai Hello World...\n");
    
    /* 初始化线程属性 */
    pthread_attr_init(&attr);
    
    /* 设置显式调度,不继承父线程调度策略 
     * 这是一个关键步骤,确保使用我们指定的调度策略而非继承父线程 */
    pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
    
    /* 设置为实时调度策略 SCHED_FIFO(先进先出) */
    pthread_attr_setschedpolicy(&attr, SCHED_FIFO);
    
    /* 设置优先级:1-99,数值越高优先级越高 */
    param.sched_priority = HIGH_PRIORITY;
    pthread_attr_setschedparam(&attr, &param);
    
    /* 设置为可join状态,便于主线程等待子线程结束 */
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
    
    /* 创建实时线程 */
    pthread_create(&thread, &attr, hello_func, NULL);
    
    /* 等待线程结束 */
    pthread_join(thread, NULL);
    
    printf("Done!\n");
    return 0;
}

三、编译程序

# 使用 xeno-config,--posix 表示使用 POSIX 皮肤
gcc hello.c -o hello $(xeno-config --posix --cflags --ldflags)

编译参数说明:

  • --cflags:获取头文件路径,如 -I/usr/xenomai/include
  • --posix:指定使用 POSIX 皮肤(皮肤可理解为API接口层)
  • --ldflags:获取链接库参数,如 -L/usr/xenomai/lib -lxenomai

四、运行程序

需要使用 sudo 运行(因为实时调度需要特权):

#taskset -c 1表示指定运行在CPU1上
sudo taskset -c 1 ./hello

运行效果:
在这里插入图片描述

Ctrl+C 可终止程序。

五、Xenomai 状态查看

1. /proc/xenomai/ 目录结构

Xenomai 通过 /proc/xenomai/ 目录提供了一系列状态文件,用于监控系统运行状态:

/proc/xenomai/
├── affinity       # CPU 亲和性配置
├── clock          # 时钟信息
├── debug          # 调试信息
├── faults         # 错误/故障信息
├── heap           # Xenomai 实时内存堆使用情况
├── latency        # 实时延迟统计
├── registry       # 已注册的实时任务、内存、设备等信息
├── sched          # 调度相关统计
├── timer          # 定时器信息
└── version        # Xenomai 版本信息

2. /proc/xenomai/sched/ 目录结构

/proc/xenomai/sched/
├── latency        # 各任务的延迟详情
├── rt            # 各 CPU 上的实时任务信息
├── stat          # 调度统计(MSW/CSW/XSC/PF)
├── trace         # 调度跟踪信息
└── verbose       # 详细调度信息

3. /proc/xenomai/sched/stat 文件说明

执行 cat /proc/xenomai/sched/stat 查看调度统计:

CPU  PID    MSW        CSW        XSC        PF
 0   0     0          0          0          0
 0   1234  100        500        200        5
 1   5678  50         300        100        2

4. 各字段含义

字段 全称 含义 说明
CPU - 运行 CPU 编号 任务当前运行的 CPU 核心号
PID Process ID 进程/线程 ID Xenomai 实时任务的 PID
MSW Mode Switch 域上下文切换次数 任务在 Linux 域 ↔ Xenomai 域之间切换的次数
CSW Context Switch 上下文切换次数 任务在 Xenomai 域内被调度切换的次数
XSC Xenomai System Call Xenomai 系统调用次数 任务调用 Xenomai API 的次数
PF Page Fault 缺页中断次数 发生缺页中断的次数

5. 字段详细解释

MSW(Mode Switch)- 域上下文切换

MSW 表示域上下文切换次数,即任务在 Linux 域Xenomai 域 之间切换的次数。

  • 当实时任务需要进行系统调用(如 accept recv)时,会从 Xenomai 域切换到 Linux 域
  • 系统调用完成后,再切回 Xenomai 域
  • MSW 次数越少越好,说明任务在用户态运行时间越长

在这里插入图片描述

CSW(Context Switch)- 上下文切换

CSW 表示 Xenomai 域内的上下文切换次数。

  • 当高优先级任务抢占低优先级任务时产生
  • 当任务主动放弃 CPU(如 nanosleep)时产生
  • CSW 次数越少,说明调度开销越小
XSC(Xenomai System Call)- Xenomai 系统调用

XSC 表示任务调用 Xenomai API 的次数。

  • 每次调用 clock_nanosleep()pthread_create() 等 Xenomai 函数时累加
  • 用于分析程序的系统调用频率
PF(Page Fault)- 缺页中断

PF 表示发生缺页中断的次数。

  • 实时任务应尽量避免缺页中断
  • 缺页中断会导致内存访问延迟,破坏实时性

6. 常用查看命令

# 查看 Xenomai 版本
cat /proc/xenomai/version

# 查看所有实时线程列表
cat /proc/xenomai/threads

# 查看调度统计
cat /proc/xenomai/sched/stat

# 查看内存堆使用情况
cat /proc/xenomai/heap

六、程序执行流程图

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐