xenomai 在X86平台下中断响应时间测试

2023-10-26

版权声明:本文为本文为博主原创文章,转载请注明出处。如有问题,欢迎指正。博客地址:https://www.cnblogs.com/wsg1100/

本文主要讲述xenomai 在X86平台上的中断响应时间测试。

1.中断响应时间

实时操作系统的意义就在于能够在确定的时间内处理各种突发的事件,而中断是这些事件、系统抢占调度的触发点,中断何时得到处理反应了实时系统的基本实时性能,因而衡量嵌入式实时操作系统的最主要、最具有代表性的性能指标参数无疑是中断响应时间。

中断延迟时间是指从接收到中断信号到操作系统做出响应,并完成进入中断服务例程所需要的时间。中断延迟时间=最大关中断时间+硬件开始处理中断到开始执行中断服务例程第一条指令之间的时间。

通俗地说:中断产生到内核执行中断处理程序第一条指令的时间。

2. x86中断处理和xenomai中断管理机制

2.1.x86中断机制

详见X86 linux异常处理与Ipipe接管中断/异常

X86 系统中有256个vector,用来识别中断或异常的类型,vector 0-31处理器保留,有固定的用途, 从32到255的vector编号被指定为用户定义的中断,不被处理器保留。 这些中断通常分配给外部I / O设备(部分固定为APIC中断),以使这些设备能够将中断发送到处理器,每个vector的处理程序都保存在一个特殊的位置–IDT(中断描述符表),IDT的基地址保存在寄存器IDTR,在64位x86下IDT是一个16字节描述的数组(32位系统为8字节),当中断发生时CPU将vector乘以16(32位系统是乘以8)来找到IDT中的对应条目idt_data,然后根据条目信息跳转到处理入口执行中断和异常处理。

2.2.xenomai中断管理机制

(1)硬件中断

Xenomai是一个RTOS,与linux共存,为了使Xenomai能够保持可预测的延迟(硬实时),必须阻止Linux内核直接处理中断,先将中断重定给Xenomai处理,然后才是Linux内核。为此在底层增加一个微内核来实现。微内核充当虚拟可编程中断控制器,分离Linux和Xenomai之间的中断掩码,该微内核称为中断管道(I-Pipe),中断的分发和实时性由I-Pipe来保障,I-Pipe在系统中的位置如下所示。

Linux和xenomai在I-ipipe上称为domain, I-Pipe将Linux和xenomai系统组织到两个域中,其中xenomai域的优先级高于Linux域。这两个域共享一个地址空间,允许来自xenomai的线程调用 Linux 内核域中的服务。 I-Pipe 以 domain 优先级顺序调度中断。 Xenomai 被设置为最高优先级域,并将首先接收中断。

如上图所示,当cpu接收到一个中断后,通过IDT表中的中断入口进入I-Pipe处理逻辑,I-Pipe会先判断该中断是否是实时系统的中断(实时域中断),如果是,直接执行其中断服务函数。如果不是的话会将该中断保存到Linux域中断管理中记录,待xenomai 让出cpu后,Linux域执行时逐一从log中取出按Linux的中断入口去处理。

用于记录中断的log的是bitmap:

pendbitmap

ipipe_str-1

(2)虚拟中断

ipipe为了 xenomai 与 linux 之间交互时,如域切换调度、实时与非实时通讯等,为保证xenomai的实时性,引入了虚拟中断机制 。需要注意的是虚拟中断和常规 softirq 本质上不同,不能混淆 , softirq 只存在 linux 中,ipipe虚拟中断更近似于硬件中断,但不是硬件触发,由内核之间需要处理紧急任务时向另一个内核发送,除产生源不同外,ipipe将虚拟中断和硬件中断同等对待,ipipe处理虚拟中断与处理硬件中断流程一致。

虚拟中断注册和其他中断注册是一样的,只是这个中断号是通过函数ipipe_alloc_virq()来分配,由函数ipipe_free_virq()释放。比如__ipipe_printk_virq,当 xenomai 需要调用 linux 的打印输出时,只需要在 xenomai 中执行ipipe_post_irq_root(__ipipe_printk_virq)(给低优先级的 Linux 发送中断),然后就会在 Linux 上下文中执行__ipipe_flush_printk(),进行打印 xenomai 输出的内容,进而避免打印影响xenomai实时性。

相反,Linux可以通过虚拟中断触发 xenomai 上的一些活动,只需要在 Linux上下文中执行ipipe_post_irq_head(virq_xxx)(给 xenomai 发送中断),xenomai 就会很快执行相应操作。此外虚拟中断还可以本内核触发本内核虚拟中断。不管是虚拟中断还是硬件中断, xenomai 优先级都比 Linux 高。

4.中断响应测试设计

4.I-pipe内核间虚拟中断

注册一个RTDM设备,分配一个虚拟中断,将这个虚拟中断号(virq)与中断处理函数(ISR) 通过RTDM接口注册到xenomai域。

测试时发送前读取TSC的值,转换为时间t0,使用ipipe_post_irq_head(virq) 发送中断,在中断处理函数中读取时间t1,时间T= t1- t0就是虚拟中断响应时间,测试流程如下。

image-20211010213208842

上述过程用户任务定时测试K次,就可以得到K次中断响应时间。

4.1.硬件中断

(1)测试方法

由于硬件中断的特殊性,测试方法有很多,常用的方式有:

  • 使用外部设备通过GPIO引脚触发中断,中断服务程序中翻转GPIO电平,外部通过示波器或者MCU来反映中断响应时间。缺点:需要外部设备、外设操作速度慢、x86平台上Gpio子系统xenomai 支持不是很好(注:该文写于2019年,目前xenomai3.2-rc+已对部分intel平台支持实时GPIO驱动,xenomai也提供了GPIO测试程序)。
  • 使用硬件定时器周期触发中断,中断处理函数中读取时间,读取到的时间减去定时器触发中断的时间即中断响应时间。
  • SMP架构可通过可编程中断控制器来产生中断,记录中断发送时时间t0,中断处理函数中读取时间t1,时间T= t1- t0就是硬件中断响应时间。(本方案

(2)测试设计

X86 SMP系统中,当外设向CPU发出中断,中断不会直接发送到CPU,有一个高级可编程中断控制器(APIC)负责顺序处理来自对各设备的多个中断请求,APIC由Local APIC和I/O APIC两部分组成。

image-20211010212235505

  • Local APIC位于每个CPU核心上,负责本CPU特定的中断配置,通常用来管理来自APIC-timer、热传感器和其他此类链接本地I/O设备的中断。
  • I/O APIC提供多处理器中断管理,用于CPU核之间分配外部中断,按一定规则将外部中断处理成中断消息发送到Local APIC。

根据LAPIC可编程产生中断的特性,使用APIC来产生中断,LAPIC的中断命令寄存器(ICR)是一个64位寄存器(见图),它允许处理器上运行的软件指定处理器中断(IPI)并将其发送到系统中的其他处理器。要发送IPI,软件必须设置ICR以指示要发送的IPI消息的类型以及目标处理器。写入ICR的动作会导致IPI被发送。

image-20211010212113017

根据以上信息,我们利用写ICR寄存器来向CPU产生一个中断代替外部硬件触发来测是xenomai 中断响应时间。

在每个CPU中,每个中断和异常分配一个数来标识,称为vector number,在X86体系中中断向量范围为0-255,最多表示256个中断,用一个8位的无符号整数来表示,前32个vector为系统保留,32-255可由用户(OS)动态分配。

所以需要选出一个未使用的vector来作为本次测试的中断号,

作为测试中断号,对应的修改内核源码添加中断号,以及中断服务程序ipipe_inttest_interruptipipe_inttest_interrupt将中断号压栈后跳转至ipipe层做分发,ipipe会根据中断注册信息递交给Linux或xenomai处理。

整个测试与虚拟中断测试类似流程如下:

  1. 安装测试RTDM驱动,将中断处理函数xnintr_test_handler()注册到xenomai域,中断处理函数中读取当前TSC时间t0。
  2. 应用程序发起一次中断响应测试。
  3. 内核中,测试驱动读取当前TSC时间t0,然后写LAPIC ICR寄存器向目标CPU产生中断。
  4. 目标CPU保存当前上下后执行中断服务程序ISR(ipipe_inttest_interrupt)。
  5. ISR(ipipe_inttest_interrupt)调用__ipipe_handle_irq让ipipe分发中断,ipipe根据中断注册信息让xenomai执行注册的中断处理程序xnintr_test_handler
  6. xnintr_test_handler中读取当前TSC时间t1,后返回。
  7. 测试驱动将本次测试数据t1、t0拷贝到用户空间。
  8. 用户程序计算时间测,统计测试结果输出,跳转到第2步继续下一轮测试。
	ctx-> handler = (ipipe_irq_handler_t)xnintr_test_handler;
	err = ipipe_request_irq(&xnsched_realtime_domain, ctx->irq, (ipipe_irq_handler_t)ctx->handler, (void *)ctx, __ipipe_ack_apic); 

测量中断是从本CPU LAPIC发送给本CPU处理;核间中断响应时间为本CPU LAPIC发送中断给其他CPU。但是ipipe没有实现本CPU给本CPU发送中断的接口,所以还需要实现这个接口ipipe_send_ipi_curr()

5.测试结果

CPU和GPU同时加压如下

#CPU
stress -c 10

#GPU
While true; do glmark2-es2 -size 800x450 > /dev/null; done& 
While true; do glmark2-es2 -size 800x450 > /dev/null; done&
While true; do glmark2-es2 -size 800x450 > /dev/null; done&
While true; do glmark2-es2 -size 800x450 > /dev/null; done&

每项测试中断产生周期和测试总时间如下。

5.1.I-pipe内核间虚拟中断

无负载测试情况(单位us):

中断周期及测试时长 最小 平均 最大
100us 23h18m 0.120 0.194 0.360

高负载测试情况(单位us):

中断周期及测试时长 最小 平均 最大
100us 24h 0.168 0.216 0.324

5.2.硬件中断

无负载测试情况(单位us):

中断周期及测试时长 最小 平均 最大
100us 24h 0.223 0.401 1.819

高负载测试情况(单位us):

中断周期及测试时长 最小 平均 最大
100us 24h 0.026 0.394 7.192

5.3.核间中断

无负载测试情况(单位us):

中断周期及测试时长 最小 平均 最大
100us 23h35m -0.155 0.137 4.179

不清楚为什么会有负值,初步猜测是不是每个CPU核的TSC不是同步的,若哪位读者知道,还望不吝赐教。

高负载测试情况(单位us):

中断周期及测试时长 最小 平均 最大
100us 21h 0.086 0.184 4.288

版权声明:本文为本文为博主原创文章,转载请注明出处。如有问题,欢迎指正。博客地址:https://www.cnblogs.com/wsg1100/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

xenomai 在X86平台下中断响应时间测试 的相关文章

  • 将尾部输出重定向到程序中

    我想使用 tail 作为标准输入向程序发送文本文件中的最新行 首先 我向程序回显一些每次都相同的输入 然后从输入文件发送尾部输入 该输入文件应首先通过 sed 处理 以下是我期望工作的命令行 但是当程序运行时 它只接收回显输入 而不接收尾部
  • 更改子进程中的 iostream

    现在 我正在开发一个项目 其中我需要启动一个子进程来使用 C 在 Linux 中执行一个新程序 并且我需要重定向标准输入和输出 就像在 C 中一样 它们是cin and cout 到一个文件 这意味着在子进程中 标准输入和输出都是文件 子进
  • 如何获取uinput创建的设备的名称(路径)

    我已经成功设置了一个小程序来创建uinput questions tagged uinput我计划使用它来自动测试接收键盘输入事件的应用程序 我已关注both http thiemonge org getting started with
  • 为什么我的 Java 代码执行 bash 命令不正确?

    我试图让我的 Java 程序与 Linux bash 交互 但出了问题 我有一个简单的可执行文件prog从中读取一个整数stdin并输出其平方 执行中 echo 5 prog 从 bash 本身打印正确答案25 in stdout但运行 i
  • 在 Ubuntu 上运行独立的 ASP.NET Core 应用程序

    我已经发布了一个 ASP NET Core 应用程序作为针对 Ubuntu 的独立应用程序 发布似乎工作正常 我已将这些文件复制到一台漂亮的 Ubuntu 机器上 现在 我如何运行我的应用程序 我的理解是 因为它是一个独立的 NET Cor
  • CALL指令是否总是将EIP指向的地址压入堆栈?

    x86架构中函数调用时是否存在返回地址不入栈的情况 No CALL根据定义 将在跳转到目标地址之前将返回地址压入堆栈 该返回地址是EIP or RIP sizeof call instruction 通常为 5 个字节 英特尔 64 和 I
  • GCC 4.7 字符串文字的源字符编码和执行字符编码?

    Linux x86 64 上的 GCC 4 7 是否具有默认字符编码 用于验证和解码 C 源文件中字符串文字的内容 这是可配置的吗 此外 当将字符串数据从字符串文字链接到输出的数据部分时 它是否具有默认的执行字符编码 这是可配置的吗 在任何
  • Google PubSub 在阻止和等待消息时没有标准输出

    我正在使用这个问题底部的 Python 代码监听 Google PubSub 消息 它实际上是来自 Google 的异步拉取示例 我运行我的程序并输出到文件 python my script py tee log txt 如果我在接收消息时
  • 当模式在范围内时使用 sed 打印范围?

    我有一个充满查询的日志文件 我只想查看有错误的查询 日志条目类似于 path to file executing query QUERY SIZE ROWS MSG DURATION 我想打印所有这些东西 但只有当MSG 包含一些有趣的内容
  • 从 bash 脚本返回值

    我想创建一个返回值的 Bash 文件 意思是 在脚本 script a bash 中我有一定的计算 脚本 script b bash 会调用它 script a bash return 1 5 script b bash a value s
  • 每个进程是否都存在内核堆栈?

    每个用户空间进程是否都存在一个内核堆栈和一个用户空间堆栈 如果两个堆栈都存在 那么每个用户空间进程应该有 2 个堆栈指针 对吗 在 Linux 中 每个任务 用户空间或内核线程 都有一个 8kb 或 4kb 的内核堆栈 具体取决于内核配置
  • 安全地记住 bash 脚本中的 ssh 凭据[重复]

    这个问题在这里已经有答案了 假设我有一个 bash 脚本 它通过 ssh 在远程计算机上执行命令 Do something here ssh otheruser host command1 Do something else ssh oth
  • 使用多线程的套接字服务器或文件服务器实现:概念不清楚

    请帮我理清这个概念 假设我们有一个使用线程实现的套接字端口服务器 套接字服务器侦听套接字端口 并在消息到达时创建一个线程来服务该请求 客户端代码向服务器发送给定数量的消息 该客户端代码也可以由多个用户在不同的计算机上运行 我知道客户端代码作
  • 在 Unix 中,我可以在目录中运行“make”而无需先 cd 到该目录吗?

    在 Unix 中 我可以运行make在没有的目录中cd首先进入该目录 make C path to dir
  • 远程 ssh 命令:第一个回显输出丢失

    我试图通过 ssh 1 liner 调用在远程机器上运行多个命令 方法是将它们指定为传递给 bash c 的分号分隔字符串 它适用于某些情况 但不适用于其他情况 看一下这个 Note the echo 1 output is lost ba
  • Web 本地应用程序 Apache:运行 shell 脚本

    我开发了一个 shell 脚本 我想用它创建一个 UI 我决定使用带有本地服务器的 Web 界面 因为我对 HTML PHP 的了解很少 比 QT 或 Java 的了解更多 我只是希望我的 html 可以在我的计算机上运行 shell 脚本
  • 套接字发送并发保证

    如果我在两个进程 或两个线程 之间共享一个套接字 并且在这两个进程中我尝试发送一条阻塞的大消息 大于下划线协议缓冲区 是否可以保证这两个消息将按顺序发送 或者消息可以在内核内部交错吗 我主要对 TCP over IP 行为感兴趣 但了解它是
  • bash 别名中允许使用哪些字符[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我最近添加了 alias cd alias cd alias cd 到我的 bash aliases 文件 玩弄这个 我注意到在别名时 被
  • Linux 的 gcc __attribute__((selectany)) 替代方案?

    我想知道是否有替代方案 attribute selectany 在Linux中 我想定义这样的东西 char a qwe zxc 并将其包含在许多链接在一起的 c 文件中 因此链接器将看到 a 的多个定义 因此不会链接 我读过这个属性 se
  • 使用 WGET 运行 cronjob PHP

    我尝试执行一个 cron 并每 5 分钟运行一个 url 我尝试使用 WGET 但我不想下载服务器上的文件 我只想运行它 这是我使用的 crontab 5 wget http www example com cronit php 除了 wg

随机推荐

  • (C语言)16进制转10进制

    include
  • Java反射机制与Method的invoke方法实现

    一 什么是反射 1 Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息 从而操作类或对象的属性和方法 本质是JVM得到class对象之后 再通过class对象进行反编译 从而获取对象的各种信息 2 Java属于先编译再运行的语
  • 机械革命黑苹果改造计划第四番-外接显示器、win时间不正确问题解决

    问题 1 无法外接显示器 最大的问题就是目前无法外接显示器 因为机械革命大多数型号笔记本电脑的HDMI DP接口都是直接物理接在独显上的 内屏用核显外接显示器接独显 英伟达独显也是黑苹果无法驱动的 而且发现机械革命tpyec接口还减配了没有
  • CSA作业

    1 修改当前主机名为rhcsa 设置当前时区为Asia Shanghai 2 在 home和 root目录下面创建file1文件和dir1目录 3 在 home file1文件里面写入内容hello welcome to home 4 在
  • Python中进程和线程详解与四款Python程序库

    Num01 gt 线程 线程是操作系统中能够进行运算调度的最小单位 它被包含在进程之中 是进程中的实际运作单位 一个线程指的是进程中一个单一顺序的控制流 一个进程中可以并发多条线程 每条线程并行执行不同的任务 Num02 gt 进程 进程就
  • Qt报错: error: C2001: 常量中有换行符,解决QT运行时有中文乱码

    Qt系列文章目录 文章目录 Qt系列文章目录 前言 一 问题原因 二 解决办法 1 第一种方法 改变文件的编码格式 2 第二种方法 修改代码 总结 前言 在编译别人的Qt工程中 总会遇到莫名其妙的问题 在别人机器上运行好好的工程 拷贝到自己
  • BAPI_ACC_DOCUMENT_POST 税码未在任何总分类账目中出现

    BAPI ACC DOCUMENT POST 报错 税码未在任何总分类账目中出现 原因 BAPI不支持auto tax caculate 单独录入税分录 需要设置一下direct tax
  • [leetcode 周赛 149] 1156 单字符重复子串的最大长度

    目录 1156 Swap For Longest Repeated Character Substring 单字符重复子串的最大长度 描述 思路 代码实现 1156 Swap For Longest Repeated Character S
  • Ajax请求后防止自动刷新方法

    Ajax请求后会刷新页面 启用延时函数在刷新后进行jq操作 刷新时间在5 10ms内 在经过这段时间后再进行jq操作
  • 函数重载、函数覆盖以及函数隐藏

    函数重载 是指允许存在多个同名函数 而这些函数的参数表不同 或许参数个数不同 或许参数类型不同 或者两者都不相同 函数重载是发生在同一个类中 调用时 根据参数的不同进行调用 同时编译器在编译期间就确定了要调用的函数 或者说这是一种早期绑定
  • 前端下载文件(Blob)的几种方式使用Blob下载文件

    前端下载文件的几种方式 使用Blob下载文件 在前端下载文件是个很通用的需求 一般后端会提供下载的方式有两种 1 直接返回文件的网络地址 一般用在静态文件上 比如图片以及各种音视频资源等 2 返回文件流 一般用在动态文件上 比如根据前端选择
  • IntelliJ IDEA 必备插件(持续更新...)

    插件名称 功能描述 gitignore 过滤提交到git仓库的文件 Alibaba Java Coding Guidelines 阿里巴巴Java规约检查插件 gitflow Integration git flow集成插件
  • python配置opencv环境

    1 下载python3 7 2 它自带pip 直接输入 pip install opencv python pip install numpy pip install matplotlib 安装不成功则在pip install XXX命令的
  • 《C++语言基础》程序阅读——和对象找感觉

    返回 贺老师课程教学链接 按照封装与信息隐藏的原则 除非特别需要 类中的数据成员需要设置为私有 由此带来的问题是 在类外如何访问这些私有成员 下面4段程序概括了常用的方法 请仔细阅读下面的程序 在阅读过程中 画出对象 变量在内存中的表示图
  • Unity如何把游戏导出成手机安装包

    文章目录 前言 使用环境 步骤 添加模块 添加场景 导出 平台 导出前的设置 构建APK 其他文章 前言 本文章主要演示了 如何将制作好的游戏 导出成APK 安装到手机上 使用环境 Unity2022 步骤 添加模块 确保你已经安装了And
  • Python中sub()用法

    Python来进行查询和替换一个文本字符串 可以使用sub 方法来进行查询和替换 sub方法的格式为 sub replacement string count 0 replacement是被替换成的文本 string是需要被替换的文本 co
  • 编译内核、更新源

    1 ubuntu下面修改更新源 sudo gedit etc apt sources list 2 编译内核 1 cd 到 usr src 下 解压下载的内核源代码包 2 make mrproper 清理生成的文件 貌似对第一次编译内核没有
  • STM32F103 GPIO内部电路图

    GPIO结构图 GPIO工作模式 输入模式 输入浮空 输入上拉 输入下拉 模拟输入 输出模式 开漏输出 开漏复用功能 推挽式输出 推挽式复用功能 输入浮空 输入上拉 输入下拉 模拟输入 开漏输出 开漏复用功能 推挽式输出 推挽式复用功能
  • 掌握Python的X篇_1_认识Python(做什么?;是什么?:控制台使用、Python的本质就是一个exe程序;python是一个翻译器机器:人写的代码转为机器语言)

    掌握Python的X篇 1 认识Python 1 为什么学习Python 2 什么是Python 2 1介绍控制台及其基本使用 2 1 1 控制台的启动方法 2 1 1 控制台及使用 2 1 Python的本质 就是一个exe程序 3 Py
  • xenomai 在X86平台下中断响应时间测试

    版权声明 本文为本文为博主原创文章 转载请注明出处 如有问题 欢迎指正 博客地址 https www cnblogs com wsg1100 本文主要讲述xenomai 在X86平台上的中断响应时间测试 1 中断响应时间 实时操作系统的意义