news 2026/4/26 21:59:58

6.6RTIPC之BUFP实例分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
6.6RTIPC之BUFP实例分析

6.6 RTIPC之BUFP实例分析

实时进程或实时线程之间,可以使用 RTIPC BUFP 协议通信。 BUFP 是面向字节的流式缓存通信机制,可以多次向缓存区发送不同数量的字节数据。

BUFP 有如下特性:

  • 缓冲区管理:必须通过setsockopt + IPCPROTO_BUFP申请缓冲区。缓冲区的分配实际上在bind操作中完成,所以应在bind之前申请缓冲区。
  • 端口号:使用数字端口号管理,支持动态端口号分配
  • 端口标签化(Labeled Port):为端口赋予可读名称(如"bufp-demo"),通过名称连接。

Xenomai 源码demo/posix/cobalt目录自带了示例程序,非常完整的演示上述特性。

特性bufp-readwrite.cbufp-label.c
寻址方式指定端口号通过标签动态查找端口
连接模式类连接(connect+write/read类连接(connect+write/read
缓存区分配16KB缓冲区分配16KB缓冲区

6.6.1 BUFP 无连接实时通信

1. 代码概述

bufp-readwrite.c是一个基于 BUFP 协议的实时通信示例,通过SOCK_DGRAM套接字类型实现数据报传输。与iddp-sendrecv.c不同,该程序使用read()/write()代替sendto()/recvfrom(),并通过connect()在客户端固定目标地址,简化了数据收发逻辑。核心功能包括:实时线程创建、内存池配置、数据报的流式读写。

  1. 头文件包含
  • 关键头文件<rtdm/ipc.h>:提供 Xenomai 实时 IPC 支持。
  • 其他标准头文件:包括线程、信号、字符串处理等(如<pthread.h>,<signal.h>)。
  1. 全局变量与常量
  • 线程标识符pthread_t svtid, cltid分别标识服务器和客户端线程。
  • 端口定义BUFP_SVPORT 12定义服务器绑定的实时端口。
  1. 消息数组

msg[]数组包含了服务器线程将要接收的一系列字符串消息。这些消息将用于演示服务器线程和客户端线程之间的通信。

static const char *msg[] = { "Surfing With The Alien", "Lords of Karma", "Banana Mango", "Psycho Monkey", "Luminous Flesh Giants", "Moroccan Sunset", "Satch Boogie", "Flying In A Blue Dream", "Ride", "Summer Song", "Speed Of Light", "Crystal Planet", "Raspberry Jam Delta-V", "Champagne?", "Clouds Race Across The Sky", "Engines Of Creation" };
2.main函数分析
  1. 信号屏蔽:屏蔽SIGINTSIGTERMSIGHUP信号,避免中断线程。
  2. 线程属性配置
    • 服务器线程优先级设为71,客户端线程优先级70
    • 调度策略均为SCHED_FIFO(先进先出实时调度)。
  3. 线程创建
    • 创建服务器线程server和客户端线程client
  4. 信号等待与清理:通过sigwait等待信号,取消线程并回收资源。
3.server服务器线程
  1. 创建套接字
    ints=socket(AF_RTIPC,SOCK_DGRAM,IPCPROTO_BUFP);
  2. 配置缓冲区大小
    bufsz=16384;// 16KB 缓冲区setsockopt(s,SOL_BUFP,BUFP_BUFSZ,&bufsz,sizeof(bufsz));
  3. 绑定端口:绑定到BUFP_SVPORT(端口 12)。
  4. 接收数据
    • 通过read()循环读取数据,打印接收到的字节数和内容。
    ret=read(s,buf,sizeof(buf));printf("received %d bytes, \"%.*s\"\n",ret,ret,buf);
4.client客户端线程
  1. 创建套接字并连接
    s=socket(AF_RTIPC,SOCK_DGRAM,IPCPROTO_BUFP);connect(s,(structsockaddr*)&svsaddr,sizeof(svsaddr));
    • 使用connect()固定目标地址为服务器端口BUFP_SVPORT
  2. 发送数据
    • 通过write()发送消息数组中的字符串,循环切换消息。
    ret=write(s,msg[n],strlen(msg[n]));printf("sent %d bytes, \"%.*s\"\n",ret,ret,msg[n]);
  3. 休眠控制:每次发送后休眠 500 毫秒,避免过度占用 CPU。
    structtimespects={.tv_nsec=500000000};// 500 msclock_nanosleep(CLOCK_REALTIME,0,&ts,NULL);
5. 运行输出示例

从运行输出可以观察到,客户端不断向流式缓冲区写入字符串,而服务器端一次性从缓冲区读取所有换成的字符串。

# ./bufp-readwriteclient: sent22bytes,"Surfing With The Alien"client: sent14bytes,"Lords of Karma"client: sent12bytes,"Banana Mango"client: sent13bytes,"Psycho Monkey"client: sent21bytes,"Luminous Flesh Giants"client: sent15bytes,"Moroccan Sunset"client: sent12bytes,"Satch Boogie"server: received128bytes,"Surfing With The AlienLords of KarmaBanana MangoPsycho MonkeyLuminous Flesh GiantsMoroccan SunsetSatch BoogieFlying In A Blue Dr"client: sent22bytes,"Flying In A Blue Dream"client: sent4bytes,"Ride"client: sent11bytes,"Summer Song"client: sent14bytes,"Speed Of Light"client: sent14bytes,"Crystal Planet"client: sent21bytes,"Raspberry Jam Delta-V"client: sent10bytes,"Champagne?"client: sent26bytes,"Clouds Race Across The Sky"client: sent19bytes,"Engines Of Creation"server: received128bytes,"eamRideSummer SongSpeed Of LightCrystal PlanetRaspberry Jam Delta-VChampagne?Clouds Race Across The SkyEngines Of CreationSurfin"......

6.6.2 BUFP 标签化实时通信

1. 代码概述

bufp-label.c是一个基于 BUFP 协议的实时通信示例,通过端口标签(Label)机制实现动态端口发现。与bufp-readwrite.c不同,该程序使用标签(而非固定端口号)标识通信端点,服务器绑定到动态分配的端口并通过标签注册,客户端通过标签查找服务器端口。核心功能包括:标签绑定、动态端口分配、基于标签的端点发现。

  1. 头文件包含
  • bufp-readwrite.c相同,包含<rtdm/ipc.h>等实时 IPC 和线程操作头文件。
  1. 全局变量与常量
  • 标签定义BUFP_PORT_LABEL "bufp-demo"定义服务端和客户端共用的标签。
#defineBUFP_PORT_LABEL"bufp-demo"
  1. 数据结构
  • 端口标签结构体struct rtipc_port_label用于设置标签选项。
structrtipc_port_label{charlabel[32];// 标签名称(最大 31 字符 + 终止符)};
  1. 消息数组msg[]包含客户端发送的字符串消息,与之前示例一致。
2.main函数分析
  • 线程属性与信号处理:与bufp-readwrite.c完全一致,服务器线程优先级71,客户端70
3.server服务器线程
  1. 创建套接字
    ints=socket(AF_RTIPC,SOCK_DGRAM,IPCPROTO_BUFP);
  2. 配置缓冲区大小:设置BUFP_BUFSZ16KB
  3. 绑定标签
    structrtipc_port_labelplabel;strcpy(plabel.label,BUFP_PORT_LABEL);setsockopt(s,SOL_BUFP,BUFP_LABEL,&plabel,sizeof(plabel));
    • 标签"bufp-demo"在绑定后注册到 Xenomai 的 BUFP 注册表中。绑定后的标签会出现在/proc/xenomai/registry/rtipc/bufp目录中。
  4. 动态端口绑定
    saddr.sipc_port=-1;// 由系统自动分配空闲端口bind(s,(structsockaddr*)&saddr,sizeof(saddr));
  5. 接收数据:通过read()循环读取数据并打印。
4.client客户端线程
  1. 创建套接字并设置标签
    structrtipc_port_labelplabel;strcpy(plabel.label,BUFP_PORT_LABEL);setsockopt(s,SOL_BUFP,BUFP_LABEL,&plabel,sizeof(plabel));
  2. 通过标签连接服务器
    structsockaddr_ipcsvsaddr;svsaddr.sipc_port=-1;// 告知 BUFP 通过标签查找端口connect(s,(structsockaddr*)&svsaddr,sizeof(svsaddr));
  3. 发送数据:循环发送消息数组中的字符串,每次发送后休眠 500 毫秒。
5. 运行输出示例

从运行输出可以观察到,客户端不断向流式缓冲区写入字符串,而服务器端一次性从缓冲区读取所有换成的字符串。

# ./bufp-labelclient: sent22bytes,"Surfing With The Alien"client: sent14bytes,"Lords of Karma"client: sent12bytes,"Banana Mango"client: sent13bytes,"Psycho Monkey"client: sent21bytes,"Luminous Flesh Giants"client: sent15bytes,"Moroccan Sunset"client: sent12bytes,"Satch Boogie"server: received128bytes,"Surfing With The AlienLords of KarmaBanana MangoPsycho MonkeyLuminous Flesh GiantsMoroccan SunsetSatch BoogieFlying In A Blue Dr"client: sent22bytes,"Flying In A Blue Dream"client: sent4bytes,"Ride"client: sent11bytes,"Summer Song"client: sent14bytes,"Speed Of Light"client: sent14bytes,"Crystal Planet"client: sent21bytes,"Raspberry Jam Delta-V"client: sent10bytes,"Champagne?"client: sent26bytes,"Clouds Race Across The Sky"client: sent19bytes,"Engines Of Creation"server: received128bytes,"eamRideSummer SongSpeed Of LightCrystal PlanetRaspberry Jam Delta-VChampagne?Clouds Race Across The SkyEngines Of CreationSurfin"......
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 12:26:05

springboot基于Java Web的医院就诊系统医生排班预约挂号电子病历药品(源码+文档+运行视频+讲解视频)

文章目录 系列文章目录目的前言一、详细视频演示二、项目部分实现截图三、技术栈 后端框架springboot前端框架vue持久层框架MyBaitsPlus系统测试 四、代码参考 源码获取 目的 摘要&#xff1a;随着医疗信息化发展&#xff0c;传统就诊模式效率低、管理难。本文设计基于Spring…

作者头像 李华
网站建设 2026/4/23 8:22:36

抖音图片去水印工具:数字水印原理与无损去除技术的深度解析

在短视频与社交媒体内容共享盛行的背景下&#xff0c;用户对无水印高清图片的需求日益增长。然而&#xff0c;手动去除水印常面临效率低、画质损伤等问题。本文将介绍一款专业的抖音图片去水印网站&#xff0c;并从数字水印技术原理、去水印算法逻辑及用户体验优化三个维度展开…

作者头像 李华
网站建设 2026/4/18 9:48:29

【信息科学与工程学】【安全领域】安全基础——第十五篇 网安协同方案06-L5层面协同

L5会话层网络与安全协同方案深度架构一、会话层基础协同方案方案名称核心目标数据设计方法模型设计方法数学方程/算法依赖条件互斥条件数据协同方式协同效果指标1. 会话状态完整性保护​保护会话状态完整性和连续性会话状态模型&#xff1a;S {sid, seq, ack, window, flags, …

作者头像 李华
网站建设 2026/4/23 21:41:04

Rembg模型更新策略:持续保持最佳效果

Rembg模型更新策略&#xff1a;持续保持最佳效果 1. 智能万能抠图 - Rembg 在图像处理领域&#xff0c;自动去背景技术一直是内容创作、电商展示、UI设计等场景的核心需求。传统手动抠图效率低、成本高&#xff0c;而基于深度学习的智能抠图工具正逐步成为主流。其中&#xf…

作者头像 李华
网站建设 2026/4/25 22:32:37

ResNet18迁移学习实战:云端GPU 5分钟开跑

ResNet18迁移学习实战&#xff1a;云端GPU 5分钟开跑 引言 作为一名Kaggle选手&#xff0c;你是否遇到过这样的困境&#xff1a;本地电脑跑ResNet18模型训练慢如蜗牛&#xff0c;眼看截止日期只剩3天&#xff0c;第一轮epoch还没跑完&#xff1f;别担心&#xff0c;今天我要分…

作者头像 李华
网站建设 2026/4/24 16:52:10

测绘工程师必备:XY转经纬度实战案例解析

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个测绘工程专用的XY坐标转经纬度工具&#xff0c;功能包括&#xff1a;1. 支持多种工程坐标系&#xff08;如北京54、西安80等&#xff09;&#xff1b;2. 提供转换精度评估…

作者头像 李华