2026/5/20 22:04:31
网站建设
项目流程
大连金豆网站建设,免费托管wordpress,本地生活网站建设,网站后台根据前端做吗6.5 RTIPC之IDDP实例分析
实时进程或实时线程之间#xff0c;可以使用 RTIPC IDDP 协议通信。 IDDP 基于数据报#xff08;UDP风格#xff09;#xff0c;单次发送即完成传输。
IDDP 有如下特性#xff1a;
内存池管理#xff1a;可通过 setsockopt IDDP_POOLSZ 申请本地…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类连接connectwrite/recvfrom内存池单独申请独立内存池iddp-pool使用 Xenomai 系统内存池system heap(默认)6.5.1 IDDP 无连接实时通信iddp-sendrecv.c1. 代码概述iddp-sendrecv.c是一个使用 IDDP 协议的 C 语言示例程序它展示了如何创建两个实时线程并通过创建套接字、设置内存池、绑定端口以及使用sendto和recvfrom实现数据的发送与接收。该示例中服务器线程绑定到一个实时时端口接收来自客户端线程的数据报。客户端线程同样创建一个数据报套接字绑定到一个不同的实时时端口然后向服务器线程发送一系列预定义的消息。头文件包含代码开始部分包含了多个头文件用于标准输入输出、线程操作、实时 IPC进程间通信、以及一些其他必要的系统功能。其中rtdm/ipc.h是与 Xenomai 实时数据分发协议相关的头文件。全局变量与常量pthread_t svtid, cltid;定义了两个线程变量用于标识服务器线程和客户端线程。IDDP_SVPORT与IDDP_CLPORT这两个宏定义了服务器线程和客户端线程所使用的实时时端口号。#define IDDP_SVPORT 12 #define IDDP_CLPORT 13消息数组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函数分析信号屏蔽程序开始时屏蔽了一些信号如SIGINT、SIGTERM和SIGHUP以确保在这些信号到来时不会中断正在运行的线程。线程属性设置分别为服务器线程和客户端线程设置了线程属性包括调度策略SCHED_FIFO表示先进先出调度策略、调度优先级等。创建线程通过pthread_create函数分别创建了服务器线程和客户端线程。等待信号main函数会调用sigwait函数来等待任意一个被屏蔽的信号。当接收到信号后程序会取消服务器线程和客户端线程并通过pthread_join等待它们完成。3.server(void *arg)服务器线程创建套接字使用socket(AF_RTIPC, SOCK_DGRAM, IPCPROTO_IDDP)创建一个类型为SOCK_DGRAM的数据报套接字。设置内存池通过setsockopt调用为服务器端点设置IDDP_POOLSZ申请了一个本地32KB的内存池这样数据报的内存分配可以从这个本地内存池中获取避免从默认的 Xenomai 的系统内存池中分配。poolsz 32768; /* bytes */ ret setsockopt(s, SOL_IDDP, IDDP_POOLSZ, poolsz, sizeof(poolsz));绑定套接字使用bind函数将套接字绑定到指定的实时时端口IDDP_SVPORT。接收数据通过一个无限循环服务器线程不断调用recvfrom函数来接收数据报。当有新的数据报到达时它会打印出接收到的数据报的字节数、内容以及发送端的端口号。4.client(void *arg)客户端线程创建套接字同样地客户端线程也使用socket(AF_RTIPC, SOCK_DGRAM, IPCPROTO_IDDP)创建了一个类型为SOCK_DGRAM的数据报套接字。绑定套接字客户端线程将其套接字绑定到一个不同的实时时端口IDDP_CLPORT。虽然这不是必须的但是在某些情况下绑定一个端口可以为发送端提供一个有效的对端名称。发送数据客户端线程在一个无限循环中调用sendto发送消息数组msg[]中的字符串且每次发送时指定目标端口IDDP_SVPORT42。每次发送后它会切换到下一个消息并使用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-pool12内存池没有使用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-pool126.5.2 IDDP 标签化实时通信iddp-label.c1. 代码概述iddp-label.c是一个使用 IDDP 协议的 C 语言示例程序它展示了如何通过标签化端口实现实时通信。它创建两个实时线程并通过创建套接字、设置内存池、绑定端口以及使用connect/write和recvfrom在两个线程间交换数据。服务器线程绑定到动态端口并设置标签接收来自客户端线程的数据报。客户端线程同样创建一个数据报套接字绑定到一个不同的实时时端口连接服务器的标签化端口并向服务器发送一系列预定义的消息。头文件包含代码开始部分包含了多个头文件用于标准输入输出、线程操作、实时 IPC进程间通信、以及一些其他必要的系统功能。其中rtdm/ipc.h是与 Xenomai 实时数据分发协议相关的头文件。全局变量与常量pthread_t svtid, cltid;定义了两个线程变量用于标识服务器线程和客户端线程。IDDP_CLPORT定义了客户端线程所使用的实时时端口号。IDDP_PORT_LABEL服务器端线程使用动态端口号其端口标签为iddp-demo#define IDDP_CLPORT 27 #define IDDP_PORT_LABEL iddp-demo消息数组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函数分析信号屏蔽程序开始时屏蔽了一些信号如SIGINT、SIGTERM和SIGHUP以确保在这些信号到来时不会中断正在运行的线程。线程属性设置分别为服务器线程和客户端线程设置了线程属性包括调度策略SCHED_FIFO表示先进先出调度策略、调度优先级等。创建线程通过pthread_create函数分别创建了服务器线程和客户端线程。等待信号main函数会调用sigwait函数来等待任意一个被屏蔽的信号。当接收到信号后程序会取消服务器线程和客户端线程并通过pthread_join等待它们完成。3. 服务端server线程创建实时套接字socket(AF_RTIPC,SOCK_DGRAM,IPCPROTO_IDDP);// 基于实时域RTIPC的IDDP协议设置端口标签strcpy(plabel.label,IDDP_PORT_LABEL);setsockopt(s,SOL_IDDP,IDDP_LABEL,plabel,sizeof(plabel));// 将标签绑定到套接字动态绑定端口bind(s,(structsockaddr*)saddr,sizeof(saddr));// saddr.sipc_port -1表示自动分配绑定时内核自动分配空闲端口并将标签注册到/proc/xenomai/registry/rtipc/iddp。循环接收消息recvfrom(s,buf,sizeof(buf),0,(structsockaddr*)claddr,addrlen);4. 客户端client线程绑定可选端口bind(s,(structsockaddr*)clsaddr,sizeof(clsaddr));// clsaddr.sipc_port IDDP_CLPORT(27)指定客户端的源端口便于服务端识别非必需但示例中用于展示。标签连接setsockopt(s,SOL_IDDP,IDDP_LABEL,...);// 设置目标端口标签connect(s,(structsockaddr*)svsaddr,sizeof(svsaddr));// svsaddr.sipc_port -1表示搜索标签内核通过标签iddp-demo自动定位服务端端口无需硬编码端口号。实时消息发送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 ......