news 2026/3/5 4:21:34

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/3/4 6:53:03

基于Java Springboot高校教室管理系统教室预约报修课表时间(源码+文档+运行视频+讲解视频)

文章目录 系列文章目录目的前言一、详细视频演示二、项目部分实现截图三、技术栈 后端框架springboot前端框架vue持久层框架MyBaitsPlus系统测试 四、代码参考 源码获取 目的 摘要&#xff1a;高校教室管理面临资源分配难、维护响应慢等问题。本文设计基于Java Spring Boot的…

作者头像 李华
网站建设 2026/3/4 6:45:01

Rembg抠图技巧:阴影保留处理方法

Rembg抠图技巧&#xff1a;阴影保留处理方法 1. 智能万能抠图 - Rembg 在图像处理领域&#xff0c;精准、高效的背景去除技术一直是设计师、电商运营和AI开发者的核心需求。传统手动抠图耗时费力&#xff0c;而基于深度学习的自动抠图工具则大大提升了效率与精度。其中&#…

作者头像 李华
网站建设 2026/3/4 9:42:12

中文文本分类新选择|AI万能分类器集成WebUI开箱即用

中文文本分类新选择&#xff5c;AI万能分类器集成WebUI开箱即用 在自然语言处理&#xff08;NLP&#xff09;的实际应用中&#xff0c;文本分类是构建智能客服、舆情监控、工单系统、内容推荐等场景的核心能力。传统方法往往依赖大量标注数据进行模型训练&#xff0c;成本高、…

作者头像 李华
网站建设 2026/3/4 12:29:34

完整示例解析Realtek高清音频驱动的服务启动架构

深入解析Realtek高清音频驱动的服务启动机制&#xff1a;从系统引导到声音输出的完整链路 你有没有遇到过这样的情况——电脑重启后突然没声音&#xff0c;但一切看起来都正常&#xff1f;设备管理器里音频设备在线&#xff0c;音量也没静音&#xff0c;可就是听不到任何声响。…

作者头像 李华
网站建设 2026/3/4 13:41:59

发丝级抠图+透明输出|Rembg让LoRA训练更高效、更稳定

发丝级抠图透明输出&#xff5c;Rembg让LoRA训练更高效、更稳定 在AI生成模型&#xff08;AIGC&#xff09;的实践中&#xff0c;尤其是使用LoRA进行风格或主体微调时&#xff0c;我们常常将注意力集中在模型结构、学习率调度和训练轮数上。然而&#xff0c;真正决定最终生成质…

作者头像 李华
网站建设 2026/3/4 9:55:32

A股上市公司连锁董事网络2001-2024

2009A股上市公司连锁董事网络2001-2024数据简介连锁董事网络是企业间通过董事交叉任职形成的关联网络&#xff0c;是公司治理与战略管理领域的重要研究对象。该网络反映了企业间的信息传递、资源共享与权力互动关系&#xff0c;对研究企业决策效率、行业竞争格局及资本市场运作…

作者头像 李华