RTAI用户空间编程(七)——共享内存通讯

RTAI分析  RTAI(Real-Time ApplicationInterface)是对Linux内核的硬实时扩展,它遵循自由软件规范;它可以提供工业级的RTOS功能,而且其所有的功能都可无缝的通过GNU/Linux环境访问。RTAI项目是由意大利米兰理工学院航天工程系(DIAPM)发起开发的遵循GPL的开源项目。RTAI目前的稳定版本是3.3(以下的分析基于3.2),支持的CPU类型包 阅读详情

一. 创建函数

void *rtai_malloc_adr (void *adr, unsigned long name, int size);
void *rtai_malloc (unsigned long name, int size);
void *rtai_kmalloc (unsigned long name, int size);
//rtai_malloc_adr和rtai_malloc用于在用户空间分配而rtai_kmalloc用于在内核空间分配。

参数
adr 用户期望的地址,被分配的内存应该映射到用户空间。
name 无符号长标识符
size 需要的共享内存数量
由于name可以是一个复杂的标识符,系统提供了将6字符标识符转换为无符长整型的服务,反之亦然。由函数nam2num 和 num2nam实现。

unsigned long nam2num (const char *name);
void num2nam(unsigned long id, const char* name);

必须说,第一个分配做一个真正的分配, 从Linux进程调用的任何具有相同名称的后续分配,只是将区域映射到用户空间,或者返回相关指针到已经在内核空间中分配的空间。
这个函数返回一个指针指向被分配的内存,适当地映射到使用的内存空间。

函数返回
成功,返回一个有效地址
失败,返回0.
注意:如果同一个进程在同一个进程中调用了rtai_malloc_adr 和 rtai_malloc两次,将会在第二次调用时返回0.

二. Free函数

void rtai_free (unsigned long name, void *adr);
void rtai_kfree(void *adr); 

 
rtai_free用于释放用户空间中一个以前分配的共享内存,rtai_kfree是用来在内核空间中做同样的操作。

参数
Name 当内存被分配时候使用的无符号长整型标识符
Adr 对应的地址
注意
类似分配函数的操作,释放调用只对取消映射共享内存有影响,这些共享内存到最后被释放,这时才是真正的释放分配的内存。

4. 示例代码(http://chrtai.sourceforge.net/)

/*
  shm_task.c

  Set up a periodic task that increments a heartbeat array in shared memory.
*/

#define MODULE
#define __KERNEL__
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/errno.h>  /* ENOMEM */
#include <stddef.h>       /* sizeof() */
#include "rtai.h"
#include "rtai_sched.h"
#include "rtai_shm.h"
#include "common.h"     /* SHM_KEY, SHM_HOWMANY */

MODULE_LICENSE("GPL");

RT_TASK shm_task;
static RTIME shm_period_ns = 100000;

static int * shm_array = 0;

static void shm_function(int arg)
{
  int heartbeat = 0;
  int t;

  while (1) {
    heartbeat++;
    /* make sure the memory has been allocated before we write to it */
    if (0 != shm_array) {
      /* now write to it */
      for (t = 0; t < SHM_HOWMANY; t++) {
    shm_array[t] = heartbeat;
      }
    }
    rt_task_wait_period();
  }

  return;
}

int init_module(void)
{
  int retval;
  RTIME shm_period_count;

  shm_array = rtai_kmalloc(SHM_KEY, SHM_HOWMANY * sizeof(int));
  if (0 == shm_array) {
    return -ENOMEM;
  }
  rt_set_periodic_mode();
  shm_period_count = nano2count(shm_period_ns);
  start_rt_timer(shm_period_count);
  retval = rt_task_init(&shm_task, shm_function, 0, 1024,
             RT_LOWEST_PRIORITY, 0, 0);
  if (0 != retval) {
    return retval;
  }
  retval = rt_task_make_periodic(&shm_task,
                 rt_get_time() + shm_period_count,
                 shm_period_count);
  if (0 != retval) {
    return retval;
  }
  return 0;
}
void cleanup_module(void)
{
  rt_task_delete(&shm_task);

  rtai_kfree(SHM_KEY);

  return;
}

/*--------------------------------------------*/
#include <stdio.h>        /* printf() */
#include <stddef.h>       /* sizeof() */
#include <signal.h>       /* signal(), SIGINT */
#include <sys/mman.h>     /* PROT_READ, needed for rtai_shm.h */
#include <sys/types.h>        /* off_t, needed for rtai_shm.h */
#include <sys/fcntl.h>        /* O_RDWR, needed for rtai_shm.h */
#include <rtai_shm.h>     /* rtai_malloc,free() */
#include "common.h"     /* SHM_KEY, SHM_HOWMANY */

/*
  This signal handler just sets the 'done' flag, which we will loop
  on when printing the shared memory. This lets us quit nicely.
 */
static int done = 0;
static void quit(int sig)
{
  done = 1;
}
int main(void)
{
  int * shm_array;
  int head, tail;

  shm_array = rtai_malloc(SHM_KEY, SHM_HOWMANY * sizeof(int));
  if (0 == shm_array) {
    fprintf(stderr, "can't allocate shared memory\n");
    return 1;
  }
  /*
    Attach our signal hander to SIGINT, the signal raised when we hit
    Control-C.
   */
  signal(SIGINT, quit);

  while (! done) {
    /*
      Read the first and last element of the array. The should be
      the same, but if we are interrupted by the RT code in between
      these reads, the tail will be newer.
    */
    head = shm_array[0];
    /* we could get interrupted here */
    tail = shm_array[SHM_HOWMANY - 1];
    /*
      Print out head and tail of shared memory, and an error if
      they're different.
    */
    printf("%10d\t%10d\r", head, tail);
    if (head != tail) {
      printf("\nsplit read\n");
    }
  }
  /*
    Control-C stopped us, so let's exit nicely by freeing up our connection
    to shared memory.
   */
  rtai_free(SHM_KEY, shm_array);
  return 0;
}

共享内存可以在应用程序之间使用,如一个实时任务程序,一个linux程序。Malloc成功的前提是加载了 rtai_shm.ko

AI PLC:存量设备智能升级的即插即用式增强方案 AI PLC并非简单将人工智能嵌入传统PLC,而是面向工业控制确定性、实时性与数据高保真需求的架构级重构。其核心在于解耦控制层(硬实时)、感知层(高吞吐)与决策层(智能体),解决时序冲突、数据割裂与编程范式错位三大瓶颈。技术价值体现在不改接线、不重编逻辑的前提下,赋予老旧PLC振动预测、参数自整定、故障根因分析等能力,显著提升产线鲁棒性与运维效率。典型应用场景覆盖注塑、陶瓷、包装等多行业32台变频器协同控制、预测性维护及语义化策略执行。本文聚焦AI PLC在新旧设备混合产线中的落地路径与工程实践,尤其突出M 阅读详情

相关推荐

LinuxCNC源码阅读:从界面通信到HAL信号链的实战解析

在工业控制领域,实时操作系统与硬件抽象层是构建运动控制系统的基石。LinuxCNC作为一款开源CNC控制器,通过精巧的软件分层,将复杂的数控逻辑与硬件驱动解耦。理解其背后的机制,不仅有助于定制界面,更能深度介入自研硬件的信号链设计。NML作为进程间通信的桥梁,解决了界面与核心控制模块的消息交换问题;HAL则通过引脚、信号与函数的灵活绑定,让软件指令轻松转化为步进电机脉冲。本文从实时接口RTAPI切入,结合步进电机典型配置与源码构建实践,剖析从界面到硬件的完整数据流,帮助开发者掌握LinuxCNC二次开发的核

weixin_29163857的博客 236

工作总结日志<三> 数控系统RTLinux内核上几个系统类型和函数在RTAI内核上的对应

系统时间类型 hrtime_t ----------- RTIME 内核打印函数 rtl_printf( ) ----------- rt_printk( ) 线程句柄类型 pthread_t  ----------- RT_TASK 线程创建函数 pthread_create( ) -------------- rt_task_init( ) 线程删除函数 pthread_delete_

qq_16229807的专栏 952

[官方培训]22-UE资产优化 Epic 肖月 笔记

Nanite+Lumen目标:面向TA,美术,不影响视觉的前提下,优化运行和编辑效率引擎:UE5.1延迟管线平台:主流PC,Windows 10 with DX12。

Tcohneyn的博客 1574

pci linux时序函数,实时Linux下的PCI驱动开发(下)

进入驱动的HPI相关部分后,就要好好研究pci2040的datasheet了。说实话,一个驱动程序的大部分内容,就是把datasheet里的内容翻译成代码,所以每一个驱动工程师都应该深入的阅读硬件文档。首先看pci2040的配置空间,如下所示有两个最重要的基地址,一个是HPI CSR内存基地址,可以通过它把PCI2040的HPI CSR寄存器群映射到主机的内存;还有一个是控制空间基地址,可以把PC...

weixin_33326218的博客 215

一位海外开发者的 OpenSPG KAG 实践分享

KAG 是一个以创建和操作知识图谱为核心的框架。知识图谱是数据之间相互关联的可视化和结构化表示,对于搜索引擎、推荐系统和机器学习等应用至关重要。KAG 的目标是提供一个强大的平台,使开发者能够:轻松构建图谱;通过增强算法丰富数据;集成人工智能,以进行更精确的推理。通过理解 KAG,可以明显看出,这个框架旨在帮助从初学者到专业开发者,在项目中创造更优的解决方案。它在简便性和集成方面的优势,使其成为下一代基于数据的应用程序的前景工具。

金融机器智能社区 3405

K230开发板实战:5步搞定YOLOv8模型部署(附常见报错解决方案)

本文提供了一份详细的K230开发板部署YOLOv8模型的实战教程。内容涵盖从环境准备、模型转换到代码编写的完整流程,并重点解析了使用AICube工具链时常见的“生成部署文件异常”等报错解决方案,旨在帮助开发者高效完成嵌入式AI模型部署。

weixin_29053073的博客 784

RTAI/LINUX的系统结构

综述 RTAI 的设计思想源于 RT-Linux,设计一个专门处理实时任务的实时调度器, 通过虚拟中断技术把 Linux 当作一个优先级最低的实时任务来运行,系统中的实时任务和非实时任务分别运行在 RTAI 和 Linux 上。 出于可移植性考虑,早前版本的 RTAI 在硬件和 Linux 之间定义了一个实时硬件抽象层(Real-Time Hardware Abstraction Layer,RT...

weixin_43216826的博客 1932

Python与西门子PLC数据交互实战:基于Snap7的跨平台工业通信指南

本文详细介绍了如何使用Python和Snap7库实现与西门子PLC的数据交互。内容涵盖跨平台环境搭建、连接参数配置、数据读写实战及性能优化技巧,为工业自动化、数据采集和智能制造场景提供了一套轻量、灵活且高效的通信解决方案。

vim8coder的博客 283

Linux内核笔记006 - 交换分区

1. 交换分区概念 一个cpu,同一时刻只能执行一条指令,执行某个进程时,其它进程一定是停止状态。那么,当cpu切换到进程B运行时,如果系统中已经没有空闲的物理内存页面了,内核就会选择一个其它进程占用的物理内存页面,将其内容备份到磁盘上,这样就可以先腾出来给当前正在运行的进程B使用了,这个过程叫做"页面换出",当切换到进程A运行时,再重新分配一个物理内存页面(如果也没有空闲物理内存页面,同样执行换出操作),并且从磁盘上恢复换出的内容,这个过程叫做"页面换入"。用于备份内存数据的磁盘空间,就是"交换..

北观止的博客 1050

Unity零基础到进阶 ☀️| Unity中的 GC及优化 超级全面解析 ☆(ゝω・)v 建议收藏!

介绍: 在游戏运行的时候,数据主要存储在内存中,当游戏的数据在不需要的时候,存储当前数据的内存就可以被回收以再次使用。内存垃圾是指当前废弃数据所占用的内存,垃圾回收(GC)是指将废弃的内存重新回收再次使用的过程。 Unity中将垃圾回收当作内存管理的一部分,如果游戏中废弃数据占用内存较大,则游戏的性能会受到极大影响,此时垃圾回收会成为游戏性能的一大障碍点。 本文我们主要学习垃圾回收的机制,垃圾回收如何被触发以及如何提GC收效率来提高游戏的性能。 Unity内存管理机制简介 要想了解垃圾回收如何工作以及何时被

努力前行,总会成为自己心中的那道光 6万+

2025_NIPS_Truthful Aggregation of LLMs with an Application to Online Advertising

大型语言模型(LLMs)生成内容的 revenue 变现是在线广告的下一个前沿领域。我们考虑这样一种场景:广告商旨在影响LLM的回复,而平台则寻求最大化广告商价值并确保用户满意度。核心挑战在于,广告商的偏好通常与用户偏好存在冲突,且广告商可能误报其偏好。为解决这一问题,我们提出MOSAIC——一种拍卖机制,它确保真实申报是广告商的占优策略,并使每个广告商的效用与其对社会福利的贡献保持一致。重要的是,该机制无需LLM微调或访问模型权重,且随着计算资源的增加,可证明收敛到最优微调LLM的输出。

c_cpp_csharp的专栏 80

RTAI的用户空间编程

任务创建实时任务的创建主要完成对代表实时任务实体的任务结构变量的初始化操作,包括分配任务栈、初始化任务栈、初始化链表指针等。 1. 函数RT_TASK* rt_task_init(unsigned long name, int priority, int stack_size, int max_msg_size) RT_TASK*rt_task_init_schmod(unsigned lo...

changexhao的专栏 1549

2025华为OD面试手撕代码真题目录及面试八股文

本专栏更新每年华为OD机试的高频手撕代码题,每个题目都会使用五种语言进行解答(C & C++& Java & Python & JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2024e卷,od机试,2024E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2024华为od,如何备

KJ.JK 5万+

RTAI进程间各种通讯方式

RTAI进程间各种通讯方式

千里之行,始于足下 783

一键熄火:在 SAP ABAP 平台停用 OAuth 2.0 Client 的正确姿势

本文是一篇面向SAP ABAP平台运维与开发团队的实战指南,重点讲解了OAuth 2.0客户端的停用操作。文章首先阐述了停用的必要性——当客户端存在泄漏风险或配置错误时,停用能在阻断访问的同时保留配置。随后详细介绍了通过SOAUTH2事务码执行停用的具体步骤,并区分了"停用"、"删除"和"撤销令牌"三个关键概念及其适用场景。 文章提供了两个真实案例:一个是怀疑客户端泄漏后的紧急处置流程,另一个是合规审计期间的冻结与恢复操作。最后总结了一份验证清单,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 278

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

RTAI 分析

实时内核, rtai

changexhao的专栏 1227

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

常用的Xenomai 原生API

http://www.cs.ru.nl/lab/xenomai/ 常用的Xenomai 原生API:     1、任务管理      Xenomai 本身提供的一系列多任务调度机制,主要有以下一些函数:      int rt_task_create (RT_TASK *task, const char *name, int stksize,int prio, int mode) ;

CyberLabs的专栏 2935

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

常用Xenomai API

常用的Xenomai 原生API:     1、任务管理      Xenomai 本身提供的一系列多任务调度机制,主要有以下一些函数:      int rt_task_create (RT_TASK *task, const char *name, int stksize,int prio, int mode) ; 任务的创建;      int rt_task_start (RT_

linuxarmsummary的专栏 1719

CNC软件架构的新突破。开源的基于多核异构框架RTOnBoot和Linuxcnc打造低成本高性能CNC解决方案

对于机器人生态,我们认为ROS分布式和Linuxcnc的相结合才是对执行机构实时性最有利的架构,一方面利用了ROS的分布式和生态,一方面又发挥了Linuxcnc的生态和实时架构方面的优势,再加上我们的方案锦上添花,进一步提升实时性和实时稳定性。当然,这方面有多种实现途径,也是仁者见仁,智者见智。我们的HAL和RTAPI有三套,一套在Linux用户空间,一套在Linux内核空间,一套在另一核的Nuttx上,而原始的Linuxcnc有两套,一套在Linux用户空间,一套在Linux内核空间。

yangbaitao1971的博客 163

嵌入式系统Linux实时化(四)Xenomai应用开发测试

通过在E2000硬件平台运行普通的多线程切换测试与Xenomai技术框架的多线程实时切换测试比较,Linux系统通过Xenomai的双内核技术进行实时化改造,实时性能获得较大的提高,可以满足嵌入式领域一些软实时应用场景的运用

91创客学堂 1817

几类常用的Xenomai 原生API

几类常用的Xenomai 原生API: 1、任务管理 Xenomai 本身提供的一系列多任务调度机制,主要有以下一些函数: intrt_task_create (RT_TASK *task, const char *name, int stksize, int prio, intmode) ; 任务的创建; int rt_task_start(RT_TASK *task, void(

jayandchuxu的专栏 2587

EtherCAT入门: 为什么能做到硬实时?

本章先建立 EtherCAT 的整体印象,说明工业以太网当前的增长态势,再直接给出“为什么它快”的结论,后面章节再逐层拆开。EtherCAT 本质上是一种运行在标准百兆以太网物理层上的工业实时现场总线:主站发出一帧数据,这帧数据像流水线一样依次穿过所有从站,每个从站在帧“路过”自己的瞬间用硬件读走属于自己的输出、写入自己的输入,帧转一圈回到主站,一个控制周期的全网 I/O 交换就完成了。这个“一帧走全网”和传统做法的区别,一张图就能看清: 它最典型的特点:维度内容物理层标准 全双工以太网,也有 、光纤

qq_40170041的博客 261

RTAI内核功能分析和关键技术

Linux 内核中灵活的模块化机制在 RTAI 中得到完美发挥。按照实现功能的不 同,RTAI 将系统划分为多个不同的模块,比如:硬件抽象层模块、实时任务调度 模块、管道机制模块、内存共享机制模块、邮箱机制模块和信号量机制模块等。 接下来对 RTAI 的几个主要功能模块进行简单介绍。 硬件抽象层模块(rtai_hal.ko)是 RTAI 最重要的模块之一。该模块主要实现 与 ADEOS 之间进行交...

weixin_43216826的博客 1600

【Linux内核】kmalloc分配内存大小(非常详细)

基于linux-5.15分析。

1万+
上一篇: RTAI的用户空间编程(六)——管道通讯
下一篇: RTAI的用户空间编程(八)——中断
迷路麋鹿
博客等级 码龄15年 24粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值