6.5RTIPC之IDDP实例分析

6.5 RTIPC之IDDP实例分析

实时进程或实时线程之间,可以使用 RTIPC IDDP 协议通信。 IDDP 基于数据报(UDP风格),单次发送即完成传输。

IDDP 有如下特性:

  • 内存池管理:可通过setsockopt + IDDP_POOLSZ申请本地内存池,不使用 Xenomai 系统内存池。本地内存池的分配实际上在bind操作中完成,所以应在bind之前申请本地内存池。
  • 端口号:使用数字端口号管理,支持动态端口号分配
  • 端口标签化(Labeled Port):为端口赋予可读名称(如"iddp-demo"),通过名称连接。

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

特性iddp-sendrecv.ciddp-label.c
寻址方式指定端口号通过标签动态查找端口
连接模式无连接(sendto/recvfrom类连接(connect+write/recvfrom
内存池单独申请独立内存池iddp-pool使用 Xenomai 系统内存池system heap(默认)

6.5.1 IDDP 无连接实时通信:iddp-sendrecv.c

1. 代码概述

iddp-sendrecv.c是一个使用 IDDP 协议的 C 语言示例程序,它展示了如何创建两个实时线程,并通过创建套接字、设置内存池、绑定端口以及使用sendtorecvfrom实现数据的发送与接收。该示例中,服务器线程绑定到一个实时时端口,接收来自客户端线程的数据报。客户端线程同样创建一个数据报套接字,绑定到一个不同的实时时端口,然后向服务器线程发送一系列预定义的消息。

  1. 头文件包含

代码开始部分包含了多个头文件,用于标准输入输出、线程操作、实时 IPC(进程间通信)、以及一些其他必要的系统功能。其中,<rtdm/ipc.h>是与 Xenomai 实时数据分发协议相关的头文件。

  1. 全局变量与常量
  • pthread_t svtid, cltid;:定义了两个线程变量,用于标识服务器线程和客户端线程。
  • IDDP_SVPORTIDDP_CLPORT:这两个宏定义了服务器线程和客户端线程所使用的实时时端口号。
#define IDDP_SVPORT 12 #define IDDP_CLPORT 13
  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. 线程属性设置:分别为服务器线程和客户端线程设置了线程属性,包括调度策略(SCHED_FIFO表示先进先出调度策略)、调度优先级等。
  3. 创建线程:通过pthread_create函数分别创建了服务器线程和客户端线程。
  4. 等待信号main函数会调用sigwait函数来等待任意一个被屏蔽的信号。当接收到信号后,程序会取消服务器线程和客户端线程,并通过pthread_join等待它们完成。
3.server(void *arg)服务器线程
  1. 创建套接字:使用socket(AF_RTIPC, SOCK_DGRAM, IPCPROTO_IDDP)创建一个类型为SOCK_DGRAM的数据报套接字。
  2. 设置内存池:通过setsockopt调用为服务器端点设置IDDP_POOLSZ,申请了一个本地32KB的内存池,这样数据报的内存分配可以从这个本地内存池中获取,避免从默认的 Xenomai 的系统内存池中分配。
poolsz = 32768; /* bytes */ ret = setsockopt(s, SOL_IDDP, IDDP_POOLSZ, &poolsz, sizeof(poolsz));
  1. 绑定套接字:使用bind函数将套接字绑定到指定的实时时端口IDDP_SVPORT
  2. 接收数据:通过一个无限循环,服务器线程不断调用recvfrom函数来接收数据报。当有新的数据报到达时,它会打印出接收到的数据报的字节数、内容以及发送端的端口号。
4.client(void *arg)客户端线程
  1. 创建套接字:同样地,客户端线程也使用socket(AF_RTIPC, SOCK_DGRAM, IPCPROTO_IDDP)创建了一个类型为SOCK_DGRAM的数据报套接字。
  2. 绑定套接字:客户端线程将其套接字绑定到一个不同的实时时端口IDDP_CLPORT。虽然这不是必须的,但是在某些情况下,绑定一个端口可以为发送端提供一个有效的对端名称。
  3. 发送数据:客户端线程在一个无限循环中调用sendto发送消息数组msg[]中的字符串,且每次发送时指定目标端口(IDDP_SVPORT=42)。每次发送后,它会切换到下一个消息,并使用clock_nanosleep函数休眠 500 毫秒,以便为系统其它服务提供一些运行时间。
5. 运行及输出

运行程序:

# ./iddp-sendrecv server: received 22 bytes, "Surfing With The Alien" from port 13 client: sent 22 bytes, "Surfing With The Alien" server: received 14 bytes, "Lords of Karma" from port 13 client: sent 14 bytes, "Lords of Karma" server: received 12 bytes, "Banana Mango" from port 13 client: sent 12 bytes, "Banana Mango" server: received 13 bytes, "Psycho Monkey" from port 13 client: sent 13 bytes, "Psycho Monkey" ......

观察内存池,其独立申请了iddp-pool@12内存池,没有使用system heap

cat /proc/xenomai/heap TOTAL FREE NAME 4194304 4183872 system heap 16384 16384 debug log 262144 261968 shared heap 262144 262112 private heap[427] 32768 32768 iddp-pool@12

6.5.2 IDDP 标签化实时通信:iddp-label.c

1. 代码概述

iddp-label.c是一个使用 IDDP 协议的 C 语言示例程序,它展示了如何通过标签化端口实现实时通信。它创建两个实时线程,并通过创建套接字、设置内存池、绑定端口以及使用connect/writerecvfrom在两个线程间交换数据。服务器线程绑定到动态端口,并设置标签,接收来自客户端线程的数据报。客户端线程同样创建一个数据报套接字,绑定到一个不同的实时时端口,连接服务器的标签化端口,并向服务器发送一系列预定义的消息。

  1. 头文件包含

代码开始部分包含了多个头文件,用于标准输入输出、线程操作、实时 IPC(进程间通信)、以及一些其他必要的系统功能。其中,<rtdm/ipc.h>是与 Xenomai 实时数据分发协议相关的头文件。

  1. 全局变量与常量
  • pthread_t svtid, cltid;:定义了两个线程变量,用于标识服务器线程和客户端线程。
  • IDDP_CLPORT:定义了客户端线程所使用的实时时端口号。
  • IDDP_PORT_LABEL:服务器端线程使用动态端口号,其端口标签为iddp-demo
#define IDDP_CLPORT 27 #define IDDP_PORT_LABEL "iddp-demo"
  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. 线程属性设置:分别为服务器线程和客户端线程设置了线程属性,包括调度策略(SCHED_FIFO表示先进先出调度策略)、调度优先级等。
  3. 创建线程:通过pthread_create函数分别创建了服务器线程和客户端线程。
  4. 等待信号main函数会调用sigwait函数来等待任意一个被屏蔽的信号。当接收到信号后,程序会取消服务器线程和客户端线程,并通过pthread_join等待它们完成。
3. 服务端(server线程)
  1. 创建实时套接字

    socket(AF_RTIPC,SOCK_DGRAM,IPCPROTO_IDDP);// 基于实时域(RTIPC)的IDDP协议
  2. 设置端口标签

    strcpy(plabel.label,IDDP_PORT_LABEL);setsockopt(s,SOL_IDDP,IDDP_LABEL,&plabel,sizeof(plabel));// 将标签绑定到套接字
  3. 动态绑定端口

    bind(s,(structsockaddr*)&saddr,sizeof(saddr));// saddr.sipc_port = -1表示自动分配
    • 绑定时内核自动分配空闲端口,并将标签注册到/proc/xenomai/registry/rtipc/iddp
  4. 循环接收消息

    recvfrom(s,buf,sizeof(buf),0,(structsockaddr*)&claddr,&addrlen);
4. 客户端(client线程)
  1. 绑定可选端口

    bind(s,(structsockaddr*)&clsaddr,sizeof(clsaddr));// clsaddr.sipc_port = IDDP_CLPORT(27)
    • 指定客户端的源端口,便于服务端识别(非必需,但示例中用于展示)。
  2. 标签连接

    setsockopt(s,SOL_IDDP,IDDP_LABEL,...);// 设置目标端口标签connect(s,(structsockaddr*)&svsaddr,sizeof(svsaddr));// svsaddr.sipc_port = -1表示搜索标签
    • 内核通过标签iddp-demo自动定位服务端端口,无需硬编码端口号。
  3. 实时消息发送

    write(s,msg[n],len);// 使用默认连接地址(已通过connect绑定)
    • 通过clock_nanosleep主动休眠,模拟实时任务的工作周期(500ms间隔)。
5. 运行及输出
# ./iddp-label server: received 22 bytes, "Surfing With The Alien" from port 27 client: sent 22 bytes, "Surfing With The Alien" server: received 14 bytes, "Lords of Karma" from port 27 client: sent 14 bytes, "Lords of Karma" server: received 12 bytes, "Banana Mango" from port 27 client: sent 12 bytes, "Banana Mango" ......

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1148399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rembg WebUI响应式设计:多设备适配方案

Rembg WebUI响应式设计&#xff1a;多设备适配方案 1. 智能万能抠图 - Rembg 在图像处理与内容创作日益普及的今天&#xff0c;自动去背景技术已成为设计师、电商运营、AI开发者不可或缺的工具。传统手动抠图效率低、成本高&#xff0c;而基于深度学习的智能抠图方案正逐步成…

Rembg抠图质量调优:参数调整最佳实践

Rembg抠图质量调优&#xff1a;参数调整最佳实践 1. 引言&#xff1a;智能万能抠图 - Rembg 在图像处理与内容创作领域&#xff0c;精准、高效的背景去除技术一直是核心需求之一。无论是电商商品图精修、社交媒体素材制作&#xff0c;还是AI生成内容&#xff08;AIGC&#xf…

Rembg抠图案例研究:影视后期制作的应用

Rembg抠图案例研究&#xff1a;影视后期制作的应用 1. 引言&#xff1a;智能万能抠图在影视后期中的价值 1.1 影视后期的背景分离挑战 在影视后期制作中&#xff0c;背景分离&#xff08;Matte Extraction&#xff09; 是一项基础但至关重要的任务。无论是绿幕合成、角色特效…

Java springboot基于微信小程序的西安汉服妆造租赁系统化妆预约(源码+文档+运行视频+讲解视频)

文章目录 系列文章目录目的前言一、详细视频演示二、项目部分实现截图三、技术栈 后端框架springboot前端框架vue持久层框架MyBaitsPlus微信小程序介绍系统测试 四、代码参考 源码获取 目的 摘要&#xff1a;西安作为历史文化名城&#xff0c;汉服妆造租赁需求日益增长&#…

ResNet18果蔬分类教程:手把手教学,云端GPU即开即用

ResNet18果蔬分类教程&#xff1a;手把手教学&#xff0c;云端GPU即开即用 引言 想象一下&#xff0c;你是一家农业公司的技术员&#xff0c;每天需要分拣成千上万的水果和蔬菜。传统的人工分拣不仅效率低下&#xff0c;还容易出错。这时候&#xff0c;AI技术就能大显身手了。…

drizzle和prisma的适用场景和使用方法上有哪些区别

大家好&#xff0c;我是jobleap.cn的小九。 Drizzle 和 Prisma 是目前 TypeScript 生态中最主流的两个 ORM&#xff08;对象关系映射&#xff09;工具。它们在设计哲学、开发体验、性能表现以及适用场景上有非常显著的区别。 简而言之&#xff1a;Prisma 像是一个高度封装、开箱…

A2A支付系统实战:从零构建跨境结算平台

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个跨境A2A支付系统原型&#xff0c;包含以下核心模块&#xff1a;1. 银行API对接模块&#xff08;模拟至少3家银行接口&#xff09; 2. 实时汇率获取和计算引擎 3. 反洗钱(A…

ResNet18图像识别新手指南:免配置网页版直接体验

ResNet18图像识别新手指南&#xff1a;免配置网页版直接体验 引言&#xff1a;AI识别物品原来这么简单 想象一下&#xff0c;你正在准备中学生科技节的展示项目&#xff0c;想要让同学们感受人工智能的神奇之处。当手机摄像头对准一个苹果时&#xff0c;屏幕立即显示"ap…

ResNet18数据增强技巧:云端GPU实时预览增强效果

ResNet18数据增强技巧&#xff1a;云端GPU实时预览增强效果 引言 当你第一次接触深度学习中的图像分类任务时&#xff0c;可能会遇到一个常见问题&#xff1a;为什么同样的模型&#xff0c;别人训练出来的准确率总是比你高&#xff1f;秘密很可能藏在"数据增强"这个…

基于cloudflare + D1的应用,有必要用prisma或者drizzle吗

大家好&#xff0c;我是jobleap.cn的小九。 在基于 Cloudflare Workers D1 的架构中&#xff0c;使用 ORM&#xff08;尤其是 Drizzle&#xff09;不仅有必要&#xff0c;而且是目前开发者公认的最佳实践。 虽然你完全可以使用 Cloudflare 提供的原生原生 API&#xff08;如 e…

为编程新手设计的ZCODE入门教程,从注册到第一个项目,手把手教你如何使用AI工具轻松编写代码。无需编程经验,快速入门。

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个面向新手的ZCODE教程项目&#xff0c;生成一个简单的个人博客网站。教程分步骤引导用户完成注册、创建项目、输入需求、生成代码、部署上线等流程。代码使用HTML/CSS/Java…

无需联网、CPU友好|ResNet18官方镜像实现本地化图像识别

无需联网、CPU友好&#xff5c;ResNet18官方镜像实现本地化图像识别离线可用 轻量高效 官方模型原生集成 技术栈&#xff1a;PyTorch TorchVision Flask 模型&#xff1a;ResNet-18&#xff08;ImageNet 预训练&#xff0c;官方权重&#xff09; 部署方式&#xff1a;Docke…

1小时搭建Ubuntu测试环境:快速原型开发指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个Ubuntu快速原型环境生成器&#xff0c;功能&#xff1a;1.虚拟机自动配置 2.预设开发环境模板 3.一键快照管理 4.网络配置工具 5.资源监控面板。使用Vagrant和VirtualBox&…

技术深度重构:去中心化的上下文工程落地实践

大家好&#xff0c;我是玄姐。核心论点&#xff1a;上下文工程&#xff08;Context Engineering&#xff09;的本质不是“如何填充 Prompt”&#xff0c;而是“如何在有限的 Attention Window 和 KV Cache 约束下&#xff0c;构建一个图灵完备的虚拟运行时环境”。过度工程化&a…

高稳定CPU版深度估计|AI单目深度估计-MiDaS镜像上线

高稳定CPU版深度估计&#xff5c;AI单目深度估计-MiDaS镜像上线 &#x1f310; 技术背景&#xff1a;从2D图像到3D空间感知的跨越 在计算机视觉领域&#xff0c;单目深度估计&#xff08;Monocular Depth Estimation&#xff09;是一项极具挑战性但又极具实用价值的任务。与双…

PS2DLC.ZIP小白教程:5分钟学会基础操作

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个极简的PS2DLC.ZIP处理工具&#xff0c;功能包括&#xff1a;1. 一键解压&#xff1b;2. 自动创建正确的目录结构&#xff1b;3. 简单明了的图形界面&#xff1b;4. 基础文…

如何用AI自动解析GDK订阅规则并生成代码

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请开发一个Python脚本&#xff0c;能够自动解析GDK平台最新发布的订阅规则文档&#xff08;假设文档为Markdown格式&#xff09;。要求&#xff1a;1. 提取关键规则条款&#xff0…

MARKDOWN 语法零基础入门指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个MARKDOWN 语法学习应用&#xff0c;提供交互式教程和新手友好的界面。点击项目生成按钮&#xff0c;等待项目生成完整后预览效果 今天想和大家分享一下我学习Markdown语法…

MiDaS_small模型实战|轻量级CPU推理,秒级生成Inferno深度热力图

MiDaS_small模型实战&#xff5c;轻量级CPU推理&#xff0c;秒级生成Inferno深度热力图 &#x1f31f; 引言&#xff1a;让2D图像“感知”3D空间 在计算机视觉领域&#xff0c;单目深度估计&#xff08;Monocular Depth Estimation&#xff09;是一项极具挑战性但又极具实用价…

JavaScript:void(0)完全解析 - 新手必读指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个交互式学习模块&#xff0c;通过分步动画和简单示例演示JavaScript:void(0)的工作原理。从基础语法开始&#xff0c;逐步展示其与undefined的关系、在a标签中的应用等。包…