RTAI的用户空间编程(八)——中断

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

本文档为整理及示例代码展示,相关内容可见文档rtai_man_API官方说明第68-75页。

1. PIC(可编程中断控制器)管理函数

#include "rtai.h"
void rt_startup_irq(unsigned int irq);
//启动并初始化PIC确认中断请求irq

void rt_shutdown_irq(unsigned int irq);
//关闭PIC,不再确认中断请求irq

void rt_enable_irq(unsigned int irq);
//使能PIC中断请求irq

void rt_disable_irq(unsigned int irq);
//禁止PIC中断请求irq

void rt_mask_and_ack_irq(unsigned int irq);
//屏蔽(mask)中断请求,并承认,这样一旦CPU启用中断了,其他中断就能被确认,它们依赖于处理的PIC和编程方式。

void rt_unmask_irq (unsigned int irq);
//不屏蔽PIC中断请求irq,这样相关请求就能再次中断CPU,只要它还被承认

void rt_ack_irq (unsigned int irq);
//承认PIC中断请求irq,这样相关请求就能再次中断CPU,只要它没被屏蔽

以上函数允许您操纵手上的PIC,但是你必须清楚你在做什么。这种职责不适合本手册,你应该参考你的PIC数据表。

注意,linux具备相同的功能,但是只能用来处理它们自己的中断,只有以上函数能安全地在实时处理程序中使用。

再次声明,当你安装了一个实时处理程序时,在传递控制到你的中断处理程序前,RTAI要么已经调用了rt_mask_and_ack_irq,来处理水平触发中断(level triggered interrupts),要么已经调用了rt_ack_irq来处理边缘触发中断(edge triggered interrupts)。通常你应该只在适当的时候对水平触发中断调用rt_unmask_irq,对边缘触发中断什么都不做。在后一种情况下,一旦你使能了CPU级别的中断,应该尽快允许任何在相同的请求上的新中断。

通常某些上面的函数能做等效的事情。除了通过了解硬件没有正确处理方法时,你可以再一次手动操作一次。

而且你必须记住,当你安装一个实时处理程序时,相关的中断通常是禁止的,除非你超出(overtake)了那个linux已有的已经被它使能了的那个。记住如果已经正确处理了,中断也没有出现,有可能你只需rt_enable_irq你的irq。

返回:
无。在24.1.11rt_start_irq返回的不是void类型,而是unsigned long。

int rt_assign_irq_to_cpu (int irq, int cpu);
//强迫外部中断irq的分配转到CPUcpu
int rt_reset_irq_to_sym_mode (int irq);
//重置中断irq为对称(symmetric)中断管理,对称模式在所有CPU上分配IRQ。

返回:
如果系统上只有一个CPU,返回1
如果至少有两个,成功,返回0
如果cpu指向的是不存在的CPU,返回CPU的数目
其他失败,返回一个负值
负值定义如下:
EINVAL (irq 不是有效的IRQ数或者发现某些内部数据不一致。
(irq is not a valid IRQ number or some internal data inconsistency is found.)

注意:
- 这些功能只对多处理器系统有影响。
- 有了linux2.4.xx,这样的服务最终在原始内核本地可用
- 有了这样的linux版本,rt_reset_irq_to_sym_mode,重置原始linux交付模式,或者它们称之为的交付亲和力(deliver affinity)。警告:这样的名字主要是为了兼容性原因才保存的,对于这样一个内核,重置操作不一定意味着对称外部中断交付。

int rt_request_global_irq (unsigned int irq, void (*handler)(void));
//为IRQ级别的irq安装函数handlers实时中断服务程序,最后窃取到LINUX。随后handlers在中断数irq发生的时候被援用。安装的handler必须处理好他窃取的使用相同的irq数的linux handler,用rt_pend_linux_irq来适当激活

int rt_free_global_irq (unsigned int irq);
//卸载中断服务程序,如果之前已经被内核拥有,则为linux重新设置它

int request_RTirq (unsigned int irq, void (*handler)(void));
int free_RTirq (unsigned int irq);
//rtai.h里定义的宏,只有我们为2.0.35做的变体RT_linux以向后兼容支持它。他们完全等效于上面两个函数。

int rt_request_linux_irq (unsigned int irq, void (*handler)(int irq, void *dev_id, struct pt_regs *regs), char *linux_handler_id, void *dev_id);
//作为标准linux中断服务进程为IQO级别的irq安装函数处理程序,迫使linux和其他中断处理程序共享IRQ,就算它不希望这样。处理程序附加到任何已经存在的处理同样的irq的linux处理程序上,作为linux irq自己的处理程序运行。这样实时应用可以以自身的意愿监视linux中断处理程序。处理程序出现在/pro/interrupts.
//linux_handler_id 是/pro/interrupts的名称。参数dev_id是以与标准linux irq请求调用同样的方式传给中断处理程序的。

int rt_free_linux_irq (unsigned int irq, void *dev_id);
//

void rt_pend_linux_irq (unsigned int irq);
//给linux服务一个中断,附加一个linux中断irq用于linux IRQ模式处理,也就是,同时硬件中断完全启用。

示例代码

#include "rtai.h"
#include "rtai_srq.h"
int rt_request_srq (unsigned int label, void (*rtai_handler)(void),long long (*user_handler)(unsigned int whatever));
int rt_free_srq (unsigned int srq);
void rt_pend_linux_srq (unsigned int srq);

2. 内核模块(?)
This is the ways to write your ISR to prevent it from being preempted:

your_isr()
{
    disable_sched();

    //Your actual ISR code goes here....

    enable_sched();
}

在RTAI和Linux间共享IRQ

static struct pci_dev* plx;

static void PLX_linuxPostIrqHandler( int irq, void *dev_id,
                                 struct pt_regs *regs)
{
    rt_enable_irq(plx->irq);
}

static void PLX_irqHandler(void )
{
...
    /* Lock scheduling */
    rt_sched_lock();

    // Do the realtime irq handling if required

...
    /* The irq is not for me, give to linux */
    if (!myIrq)
    {
        rt_mask_and_ack_irq(plx->irq);
        rt_pend_linux_irq(plx->irq);
    }

    /* Unlock scheduling */
    rt_sched_unlock();
}


//init_module
...
/* Register irq handler */
rt_request_global_irq( plx->irq, PLX_irqHandler );
rt_request_linux_irq( plx->irq, PLX_linuxPostIrqHandler,
                            "LINUX_POST_IRQHANDLER", PLX_linuxPostIrqHandler );
    rt_startup_irq(plx->irq);
    rt_enable_irq( plx->irq );
..

//cleanup
...

rt_disable_irq( plx->irq );
rt_free_global_irq( plx->irq );
rt_free_linux_irq( plx->irq, PLX_linuxPostIrqHandler );
RTAI的用户空间编程(五)——注意事项 阅读详情

相关推荐

LXRT-RTAI用户空间编程(代码框架、常用函数等)

LXRT-RTAI用户空间编程(代码框架、常用函数等)

RTAI API ---RTAI service functions

rt_global_cli rt_global_sti rt_global_save_flags rt_global_restore_flags rt_global_save_flags_and_cli send_ipi_shorthand send_ipi_logical rt_assign_irq_to_cpu rt_reset_irq_to_sym_mode rt_

changexhao的专栏 552

RTAI很全的指导手册

RTAI很全的指导手册RTAI很全的指导手册

Linux+RTAI实时内核编译

如今Linux系统正被广泛用于各种嵌入式实时系统中,但由于Linux系统本身不支持硬实时扩展,故限制了其发展。由于Linux + RTAI的双内核方式构成的实时系统方案具有良好性能,本文将简述如何构建这样一个Linux + RTAI的实时系统。 一、准备工作 首先选择一款RTAI的版本,我们这里以RTAI-3.7为例,从官网【www.rtai.org】下载该RTAI压缩包。进入RTAI-3.7

程序员「阿基米东」的编程之旅 1万+

RTAI Linux实时操作系统原理剖析

本ppt文档详尽地剖析了x86架构下的RTAI工作原理,对基于双内核的实时Linux操作系统开发有一定的参考价值

树莓派4在Bookworm Raspbian系统下无法进入桌面模式(启动后出现彩色画面,然后一直黑屏,但是可以正常启动和ssh)

本文记录了这段比较坎坷的探索之路,由于你的问题不一定是我最终解决方案的,可能是前面探索路上试过的,所以建议按顺序看排除前置问题。 双十一又买了个树莓派 4B,插上之前树莓派 4B 的 TF 卡直接就能使用(毕竟是一样规格的)。但是由于用来连接硬盘的 USB 线是坏的,我以为是系统问题就进行了重装(所以坏掉的线还是直接扔了好)。 重新安装系统就装了最新的 2023-10-10 版本的 64 位的 Raspberry Pi OS,但是出现了一个问题: 启动后出现彩色画面,然后一直黑屏。

ZhongUncle的博客 3735

RTAI的用户空间编程(六)——管道通讯

RTAI的用户空间编程(六)——管道通讯

千里之行,始于足下 772

定制PYNQ的overlay

一、用HLS生成一个定制IP(加速器)(1)首先打开vivado hls,本人的版本是2017.2,点击创建一个新工程。(2)设置工程名和路径,顶层函数设置为add,创建一个新的C++程序,名字叫做adder.cpp,不用在testbench中添加文件。选择板子的时候搜索xc7z020clg400-1,这是PYNQ的板子号,选择完成。             (3)在左侧的菜单栏里选择Sourc...

bramblewalls的博客 1万+

RTAI安装

5.1        RTAI安装 24.1.x,适合于2.4核心,主要采用rthal实现方案。3.x版本,适合2.4-2.6核心,采用了Adeos实现方案。最新版本为RTAI 3.3。(源代码中集成了Adeos补丁) 1.          在所有工作开始前,先来核对一下你的gcc版本。例如: # gcc –v Paolo Mantegazza教授(RTAI开发者)用的

bitrain的专栏 2198

STM32CUBEMX 使用教程5 — DMA配置 & 串口结合DMA实现数据搬运

DMA(Direct Memory Access),直接存储器访问(或数据搬运),是STM32中很实用的一个外设。DMA 传输数据方式不需要 CPU 参与控制传输,也不用中断处理的方式进行数据搬运处理,纯粹通过硬件为 RAM 与 I/O 设备之间开辟一条直接传送数据的通路,使 CPU 的效率大大提高。

weixin_43866583的博客 1499

告别迷茫!手把手教你用ArcGIS+GTB搞定生态源地MSPA分析(附避坑指南)

本文详细介绍了如何使用ArcGIS和GTB进行生态源地MSPA分析的全流程,包括软件安装、数据预处理、参数设置、结果可视化和常见问题排查。特别针对ArcGIS和GTB组合使用时的常见问题提供了避坑指南,帮助研究者高效完成生态规划任务。

weixin_30756499的博客 434

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

RML2018.01a数据集的读取与使用

基于深度学习的自动调制识别

QAQIknow的博客 1万+

编写LXRT(RTAI-LXRT)用户空间程序详解

编写LXRT(RTAI-LXRT)用户空间程序   Asad Chan    2011-06-28       此文档仅为那些刚涉猎RTAI Linux的爱好者编写。在用户空间下编写RTAI-LXRT程序并不是一件困难的事,可以参考《DIAPM RTAI ProgrammingGuide 1.0》和《How to port your C++ GNU/Linux applicationto

yang_chen_shi_wo的博客 2342

可信启动方案设计

本博客简要解释了TF-A中的Measured-Boot可信启动设计实现。

AI-安全-功耗 1203

2024年数字IC秋招-海康威视-数字逻辑设计工程师-笔试题

笔试题型:单选 + 多选笔试平台:百一测试(电脑监控)笔试时间:1h30minA. AW通道B. D通道C. B通道D. AR通道return x++;x = 5;y = Foo(x);

qq_42135020的博客 3199

RTAI与LINUX关于中断共享分析

1.    Linux2.6中断数据结构:extern struct irq_desc irq_desc[NR_IRQS]; //中断描述符表 struct irqaction {    irq_handler_t handler;//中断注册函数    unsigned long flags;    cpumask_t mask;    const char *nam

Annann的专栏 1344

QT自制TCP服务器

TCP服务器 网络调试助手

大脑曝光 3626

【IgH EtherCAT】 一个在Linux 内核空间运行的、基于 RTAI  的硬实时 EtherCAT 主站示例

这个序列图详细描绘了从模块加载到卸载的整个生命周期中,Linux 内核、RTAI 子系统、驱动逻辑以及 EtherCAT 主站之间的动态交互。它完全绕开了标准 Linux 的调度和定时机制,将所有实时关键操作都交由 RTAI 微内核处理,从而获得了微秒级的、确定性的性能。:此示例的核心是 RTAI。它不依赖 Linux 自身的调度器或定时器,而是使用 RTAI 提供的、运行在 Linux 内核之下的实时微内核服务。运行的硬实时应用,通过 RTAI 提供的任务调度和定时器来实现高精度的周期性控制。

cxyhjl的博客 1133

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

RTAI/LINUX的系统结构

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

weixin_43216826的博客 1932

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

weixin_43216826的博客 1600

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

linux rtai qt,RTLinux versus RTAI

http://www.linuxfordevices.com/files/misc/ripoll-rtl-v-rtai.htmlBy Ismael Ripoll (2002).License: OPL.In this document I have tried to puttogether the most relevant (in my opinion) characteristics ofRT...

weixin_36130575的博客 348

linux rtai qt,基于RTAI的嵌入式Linux硬实时性能的研究与实现

0 引言Linux是一种能运行于多种平台、源代码公开、免费、功能强大、遵守POSIX标准、与Unix兼容的操作系统。随着嵌入式系统的不断发展和应用,嵌入式Linux操作系统也在各方面得到了广泛的应用。但是,作为通用操作系统的Linux,要应用在嵌入式领域,需要作必要的改进。在电能质量监控等对实时性要求较高的领域,需要将最初按照分时系统目标设计的Linux改造成能支持硬实时性的操作系统。uClinu...

weixin_39989941的博客 596
上一篇: RTAI用户空间编程(七)——共享内存通讯
下一篇: 实时系统性能测试指标及方法
迷路麋鹿
博客等级 码龄15年 24粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值