04-第一个xenomai程序
·
第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, ¶m);
/* 设置为可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
六、程序执行流程图

更多推荐



所有评论(0)