linux 域和xenomai 实时域之间的交互
/*
* XDDP-based RT/NRT threads communication demo.
*
* Real-time Xenomai threads and regular Linux threads may want to
* exchange data in a way that does not require the former to leave
* the real-time domain (i.e. secondary mode). Message pipes - as
* implemented by the RTDM-based XDDP protocol - are provided for this
* purpose.
*
* On the Linux domain side, pseudo-device files named /dev/rtp<minor>
* give regular POSIX threads access to non real-time communication
* endpoints, via the standard character-based I/O interface. On the
* Xenomai domain side, sockets may be bound to XDDP ports, which act
* as proxies to send and receive data to/from the associated
* pseudo-device files. Ports and pseudo-device minor numbers are
* paired, meaning that e.g. port 7 will proxy the traffic for
* /dev/rtp7. Therefore, port numbers may range from 0 to
* CONFIG_XENO_OPT_PIPE_NRDEV - 1.
*
* All data sent through a bound/connected XDDP socket via sendto(2) or
* write(2) will be passed to the peer endpoint in the Linux domain,
* and made available for reading via the standard read(2) system
* call. Conversely, all data sent using write(2) through the non
* real-time endpoint will be conveyed to the real-time socket
* endpoint, and made available to the recvfrom(2) or read(2) system
* calls.
*
* Both threads can use the bi-directional data path to send and
* receive datagrams in a FIFO manner, as illustrated by the simple
* echoing process implemented by this program.
*
* realtime_thread------------------------------>-------+
* => get socket |
* => bind socket to port 0 v
* => write traffic to NRT domain via sendto() |
* => read traffic from NRT domain via recvfrom() <--|--+
* | |
* regular_thread---------------------------------------+ |
* => open /dev/rtp0 | ^
* => read traffic from RT domain via read() | |
* => echo traffic back to RT domain via write() +--+
*
* See Makefile in this directory for build directives.
*
* NOTE: XDDP is a replacement for the legacy RT_PIPE interface
* available from the native skin until Xenomai 3.
*/
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <malloc.h>
#include <pthread.h>
#include <fcntl.h>
#include <errno.h>
#include <rtdk.h>
#include <rtdm/rtipc.h>
pthread_t rt, nrt;
#define XDDP_PORT 0 /* [0..CONFIG-XENO_OPT_PIPE_NRDEV - 1] */
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"
};
static void fail(const char *reason)
{
perror(reason);
exit(EXIT_FAILURE);
}
static void *realtime_thread(void *arg)
{
struct sockaddr_ipc saddr;
int ret, s, n = 0, len;
struct timespec ts;
size_t poolsz;
char buf[128];
/*
* Get a datagram socket to bind to the RT endpoint. Each
* endpoint is represented by a port number within the XDDP
* protocol namespace.
*/
s = socket(AF_RTIPC, SOCK_DGRAM, IPCPROTO_XDDP);
if (s < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
/*
* Set a local 16k pool for the RT endpoint. Memory needed to
* convey datagrams will be pulled from this pool, instead of
* Xenomai's system pool.
*/
poolsz = 16384; /* bytes */
ret = setsockopt(s, SOL_XDDP, XDDP_POOLSZ,
&poolsz, sizeof(poolsz));
if (ret)
fail("setsockopt");
/*
* Bind the socket to the port, to setup a proxy to channel
* traffic to/from the Linux domain.
*
* saddr.sipc_port specifies the port number to use.
*/
memset(&saddr, 0, sizeof(saddr));
saddr.sipc_family = AF_RTIPC;
saddr.sipc_port = XDDP_PORT;
ret = bind(s, (struct sockaddr *)&saddr, sizeof(saddr));
if (ret)
fail("bind");
for (;;) {
len = strlen(msg[n]);
/*
* Send a datagram to the NRT endpoint via the proxy.
* We may pass a NULL destination address, since a
* bound socket is assigned a default destination
* address matching the binding address (unless
* connect(2) was issued before bind(2), in which case
* the former would prevail).
*/
ret = sendto(s, msg[n], len, 0, NULL, 0);
if (ret != len)
fail("sendto");
rt_printf("%s: sent %d bytes, \"%.*s\"\n",
__FUNCTION__, ret, ret, msg[n]);
/* Read back packets echoed by the regular thread */
ret = recvfrom(s, buf, sizeof(buf), 0, NULL, 0);
if (ret <= 0)
fail("recvfrom");
rt_printf(" => \"%.*s\" echoed by peer\n", ret, buf);
n = (n + 1) % (sizeof(msg) / sizeof(msg[0]));
/*
* We run in full real-time mode (i.e. primary mode),
* so we have to let the system breathe between two
* iterations.
*/
ts.tv_sec = 0;
ts.tv_nsec = 500000000; /* 500 ms */
clock_nanosleep(CLOCK_REALTIME, 0, &ts, NULL);
}
return NULL;
}
static void *regular_thread(void *arg)
{
char buf[128], *devname;
int fd, ret;
if (asprintf(&devname, "/dev/rtp%d", XDDP_PORT) < 0)
fail("asprintf");
fd = open(devname, O_RDWR);
free(devname);
if (fd < 0)
fail("open");
for (;;) {
/* Get the next message from realtime_thread. */
ret = read(fd, buf, sizeof(buf));
if (ret <= 0)
fail("read");
/* Echo the message back to realtime_thread. */
ret = write(fd, buf, ret);
if (ret <= 0)
fail("write");
}
return NULL;
}
static void cleanup_upon_sig(int sig)
{
pthread_cancel(rt);
pthread_cancel(nrt);
signal(sig, SIG_DFL);
pthread_join(rt, NULL);
pthread_join(nrt, NULL);
}
int main(int argc, char **argv)
{
struct sched_param rtparam = { .sched_priority = 42 };
pthread_attr_t rtattr, regattr;
sigset_t mask, oldmask;
mlockall(MCL_CURRENT | MCL_FUTURE);
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
signal(SIGINT, cleanup_upon_sig);
sigaddset(&mask, SIGTERM);
signal(SIGTERM, cleanup_upon_sig);
sigaddset(&mask, SIGHUP);
signal(SIGHUP, cleanup_upon_sig);
pthread_sigmask(SIG_BLOCK, &mask, &oldmask);
/*
* This is a real-time compatible printf() package from
* Xenomai's RT Development Kit (RTDK), that does NOT cause
* any transition to secondary (i.e. non real-time) mode when
* writing output.
*/
rt_print_auto_init(1);
pthread_attr_init(&rtattr);
pthread_attr_setdetachstate(&rtattr, PTHREAD_CREATE_JOINABLE);
pthread_attr_setinheritsched(&rtattr, PTHREAD_EXPLICIT_SCHED);
pthread_attr_setschedpolicy(&rtattr, SCHED_FIFO);
pthread_attr_setschedparam(&rtattr, &rtparam);
errno = pthread_create(&rt, &rtattr, &realtime_thread, NULL);
if (errno)
fail("pthread_create");
pthread_attr_init(®attr);
pthread_attr_setdetachstate(®attr, PTHREAD_CREATE_JOINABLE);
pthread_attr_setinheritsched(®attr, PTHREAD_EXPLICIT_SCHED);
pthread_attr_setschedpolicy(®attr, SCHED_OTHER);
errno = pthread_create(&nrt, ®attr, ®ular_thread, NULL);
if (errno)
fail("pthread_create");
sigsuspend(&oldmask);
return 0;
}
################################################################
测试结果:
realtime_thread: sent 21 bytes, "Raspberry Jam Delta-V"
=> "Raspberry Jam Delta-V" echoed by peer
realtime_thread: sent 10 bytes, "Champagne?"
=> "Champagne?" echoed by peer
realtime_thread: sent 26 bytes, "Clouds Race Across The Sky"
=> "Clouds Race Across The Sky" echoed by peer
realtime_thread: sent 19 bytes, "Engines Of Creation"
=> "Engines Of Creation" echoed by peer
realtime_thread: sent 22 bytes, "Surfing With The Alien"
=> "Surfing With The Alien" echoed by peer
realtime_thread: sent 14 bytes, "Lords of Karma"
=> "Lords of Karma" echoed by peer
realtime_thread: sent 12 bytes, "Banana Mango"
=> "Banana Mango" echoed by peer
realtime_thread: sent 13 bytes, "Psycho Monkey"
=> "Psycho Monkey" echoed by peer
realtime_thread: sent 21 bytes, "Luminous Flesh Giants"
=> "Luminous Flesh Giants" echoed by peer
realtime_thread: sent 15 bytes, "Moroccan Sunset"
=> "Moroccan Sunset" echoed by peer
realtime_thread: sent 12 bytes, "Satch Boogie"
=> "Satch Boogie" echoed by peer
realtime_thread: sent 22 bytes, "Flying In A Blue Dream"
=> "Flying In A Blue Dream" echoed by peer
realtime_thread: sent 4 bytes, "Ride"
=> "Ride" echoed by peer
realtime_thread: sent 11 bytes, "Summer Song"
=> "Summer Song" echoed by peer
realtime_thread: sent 14 bytes, "Speed Of Light"
=> "Speed Of Light" echoed by peer
realtime_thread: sent 14 bytes, "Crystal Planet"
=> "Crystal Planet" echoed by peer
realtime_thread: sent 21 bytes, "Raspberry Jam Delta-V"
=> "Raspberry Jam Delta-V" echoed by peer
realtime_thread: sent 10 bytes, "Champagne?"
=> "Champagne?" echoed by peer
realtime_thread: sent 26 bytes, "Clouds Race Across The Sky"
=> "Clouds Race Across The Sky" echoed by peer
realtime_thread: sent 19 bytes, "Engines Of Creation"
=> "Engines Of Creation" echoed by peer
realtime_thread: sent 22 bytes, "Surfing With The Alien"
=> "Surfing With The Alien" echoed by peer
realtime_thread: sent 14 bytes, "Lords of Karma"
=> "Lords of Karma" echoed by peer
realtime_thread: sent 12 bytes, "Banana Mango"
=> "Banana Mango" echoed by peer
realtime_thread: sent 13 bytes, "Psycho Monkey"
=> "Psycho Monkey" echoed by peer
realtime_thread: sent 21 bytes, "Luminous Flesh Giants"
=> "Luminous Flesh Giants" echoed by peer
realtime_thread: sent 15 bytes, "Moroccan Sunset"
=> "Moroccan Sunset" echoed by peer
realtime_thread: sent 12 bytes, "Satch Boogie"
=> "Satch Boogie" echoed by peer
realtime_thread: sent 22 bytes, "Flying In A Blue Dream"
=> "Flying In A Blue Dream" echoed by peer
realtime_thread: sent 4 bytes, "Ride"
=> "Ride" echoed by peer
realtime_thread: sent 11 bytes, "Summer Song"
=> "Summer Song" echoed by peer
realtime_thread: sent 14 bytes, "Speed Of Light"
=> "Speed Of Light" echoed by peer
realtime_thread: sent 14 bytes, "Crystal Planet"
=> "Crystal Planet" echoed by peer
realtime_thread: sent 21 bytes, "Raspberry Jam Delta-V"
=> "Raspberry Jam Delta-V" echoed by peer
realtime_thread: sent 10 bytes, "Champagne?"
=> "Champagne?" echoed by peer
realtime_thread: sent 26 bytes, "Clouds Race Across The Sky"
=> "Clouds Race Across The Sky" echoed by peer
realtime_thread: sent 19 bytes, "Engines Of Creation"
=> "Engines Of Creation" echoed by peer
realtime_thread: sent 22 bytes, "Surfing With The Alien"
=> "Surfing With The Alien" echoed by peer
linux 域和xenomai 实时域之间的交互的更多相关文章
- Linux ln命令:在文件之间建立链接(硬链接和软链接)详解版1
Linux ln命令:在文件之间建立链接(硬链接和软链接)详解版 < Linux创建文件及修改文件时间戳(touch命令)Linux复制文件和目录(cp命令) > <Linux就该这 ...
- python基础之类和对象、对象之间的交互、类名称空间与对象/实例名称空间
一 面向对象初识 Python要么是面向过程要么是面向对象. 概念及优缺点: 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东 ...
- 第四节:Vuejs组件及组件之间的交互
一. 组件及其交互 1.组件的注册 (1).全局注册 Vue.component('组件名称', { }) 第1个参数是标签名称,第2个参数是一个选项对象. 选项参数包括 data:必须是一个func ...
- 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等)
python基础--面向对象 (1)面向过程VS面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. ...
- 我的Android第五章:通过Intent实现活动与活动之间的交互
Intent在活动的操作 作用: Itent是Android程序中各个组件直接交换的一个重要方式可以指定当前组件要执行任务同时也可以给各个组件直接进行数据交互 同时Inten ...
- Fragments之间的交互(实现参数传递)
Fragments之间的交互(实现参数传递) 日常开发中,通常Fragments之间可能需要交互,比如基于用户事件改变Fragment的内容.所有Fragment之间的交互需要通过他们关联的Activ ...
- AngularJs-指令和指令之间的交互(动感超人)
前言: 上节我们学习到了指令和控制器之间的交互,通过给指令添加动作,调用了控制器中的方法.本节我们学习指令和指令之间是如何交互的,我们通过一个小游戏来和大家一起学习,听大漠老师说这是国外的人写的dem ...
- OC和JS之间的交互
OC和JS之间的交互 目录 对OC和JS之间交互的理解 JS调用OC OC调用JS 对OC和JS之间交互的理解 JS调用OC JS文件 function sendCommand(cmd,param){ ...
随机推荐
- 多个Mapper和Reducer的Job
多个Mapper和Reducer的Job @(Hadoop) 对于复杂的mr任务来说,只有一个map和reduce往往是不能够满足任务需求的,有可能是需要n个map之后进行reduce,reduce之 ...
- zedboard--嵌入式网络摄像机(mjpg-streamer)的移植和搭建(二十二)
在zedboard上移植和搭建嵌入式网络摄像机mjpg-streamer.具体步骤如下: 来自:http://write.blog.csdn.net/postedit/13741451 1.安装lib ...
- System.Drawing.Color的颜色对照表
经常使用System.Drawing.Color, 本篇介绍一下颜色与名称及RGB值的对应关系. 1. 颜色与名称的对照表(点击下图放大看): 2. 颜色与RGB值对照表: Color.AliceBl ...
- [Angular-Scaled web] 3. Basic State with ui-router
1. Install ui-route, include js file in html and add dependence in js file. bower install angular-ui ...
- Nginx 内嵌lua脚本,结合Redis使用
0x00 Nginx 内嵌Lua脚本有下面特点: 20k个并发连接 Lua脚本能够在Nignx 11个层次的不同层次发挥作用,扩展Ngnix功能 Lua速度极快(寄存器指令) 0x01 应用场景 在w ...
- Mysqldump参数大全(参数来源于mysql5.5.19源码)
参数 参数说明 --all-databases , -A 导出全部数据库. mysqldump -uroot -p --all-databases --all-tablespaces , -Y ...
- 使用Loader实时查询本地数据库用法
在看Android的文档时,看到了这么一个东西: Loader 究竟是什么东西呢? Introduced in Android 3.0, loaders make it easy to asynchr ...
- iOS 真机调试多台mac电脑共用一个证书
大致流程:在你的开发电脑上导出一个 p12文件,以及在 apple开发者中心下载一个profile文件,把这两个文件导出给你的mac开发友就行了 打开 mac 钥匙工具-----找到你的证书---- ...
- DBA眼中的CLR
SQL Server 2005引入CLR之後,開發者們熱情地接受了它. CLR作爲一個強有力的工具,開發者可在數據庫中利用它調用其它面嚮對象語言編寫而成的功能. 從DBA的視角來看,CLR的引入淡化了 ...
- Shodan:黑客的物联网搜索引擎
记得看过一个电影.里面的科学家开发了一个超级系统,能够实时监控全部可用摄像头.让逃犯无处遁形. Shodan这个新型的搜索引擎可能会让这个想法变成现实. 和Google这些传统互联网信息搜索引擎不同. ...