Linux 中断与轮询

2024-03-11

我正在开发一个带有 DSP 和 ARM 的系统。 ARM上有一个linux操作系统。我有一个 DSP 向 ARM (Linux) 发送数据 - 在 Linux 中,有一个内核模块读取从 DSP 接收到的数据。内核模块被唤醒以读取数据,使用 DSP 和 ARM 之间的硬件中断。

我想编写一个用户空间应用程序,每次有新数据从 DSP 到达时,它都会从内核空间(内核模块)读取数据。
问题是:

有什么更好的方法可以做到这一点,是从内核到用户空间的软件中断,还是每 10 毫秒从用户空间进行轮询(使用内核读取已知的内存地址)?

知道:

  • 从DSP到内核的数据必须在非常短的时间内到达——100us。
  • 数据从内核到用户空间可能需要 10 毫秒到 30 毫秒。
  • 正在读取的数据被认为很小 - 大约 100 字节。

我将创建一个设备并打开用户态程序块read。无需等待 10 毫秒,这是通过阻塞有效处理的。

使用意义上的轮询poll(是的,我明白这不是你的意思)可以正常工作,但是没有理由调用两个函数(首先poll进而read)当一个函数无论如何都可以做到这一点时。不需要每10ms做一次,可以立即调用poll在处理完上次阅读的内容后再次进行。

每 10 毫秒检查一次已知内存位置的轮询是不可取的。这不仅是一个丑陋的黑客行为,而且比你想象的更复杂(你必须将包含该内存位置的页面映射到用户空间),而且是一种不必要地消耗 CPU 的忙碌等待形式,它的平均延迟为 5 毫秒,最坏情况下的延迟为 10 毫秒,这是完全没有必要的。平均和最坏情况延迟read大约为零(嗯,不完全是,但几乎如此......它与唤醒被阻止的任务一样快)。

中断(即信号)非常有效,但与简单的读取和阻塞相比,使程序变得更加复杂/扭曲(必须编写信号处理程序,不得在处理程序中使用某些函数,必须与主应用程序通信等)。虽然从技术上讲这是一个很好的解决方案,但我建议不要使用它们,因为程序不需要比必要的更复杂。

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

Linux 中断与轮询 的相关文章

  • getline 之后返回到文件开头

    所以我已经从文件中读取了所有行 while getline ifile line logic 其中 ifile 是 ifstream line 是字符串 我的问题是我现在想再次使用 getline 并且似乎无法返回到文件的开头 因为运行 c
  • 内核与系统中的 Windows 进程

    我有一些与内核和用户模式下的 Windows 进程相关的问题 如果我有一个 hello world 应用程序和一个公开新系统调用 foo 的 hello world 驱动程序 我很好奇一旦处于内核模式 我能做什么和不能做什么 对于初学者来说
  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • 头文件中实现的函数的静态与内联

    我想到的方式inline在 C 中用于链接 作用域 我把它放在同一个篮子里extern and static对于全局对象 通常 对于在头文件中实现的函数 我的首选解决方案是将其设为静态 In Foo h static void foo Do
  • 对 ExecuteNonQuery() 的单次调用是原子的

    对 ExecuteNonQuery 的单次调用是否是原子的 或者如果单个 DbCommand 中有多个 sql 语句 那么使用事务是否有意义 请参阅我的示例以进行说明 using var ts new TransactionScope us
  • 从内存流播放视频文件

    只是好奇看看这是否可能 我有一个 Windows 应用程序 它从我的电脑上的 avi 文件读取所有字节 然后将其存储在 byte 中 现在我的内存中有 avi 文件 我想直接从内存将其加载到某种视频播放器控件中 我尝试过使用 wmplaye
  • 在 .NET Core 中从 HttpResponseMessage 转换为 IActionResult

    我正在将之前在 NET Framework 中编写的一些代码移植到 NET Core 我有这样的事情 HttpResponseMessage result await client SendAync request if result St
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 节点*链表中的下一个

    我是数据结构和算法的新手 我遇到了以下代码 typedef struct node int data node next 谁能告诉我为什么我们要声明节点 next next 不能声明为 int next 吗 因为你希望能够做到n gt ne
  • 使用 OleDbCommand / OleDbDataAdapter 读取 CSV 文件

    我不明白为什么 但是当我使用 OleDbDataAdapter 或 OleDbCommand 读取 CSV 文件时 在这两种情况下 生成的数据结构良好 它识别文件头中的列 但行数据都是空字符串 我之前已经成功进行过多次 CSV 处理 因此我
  • 在 C# .NET 中对非 ASCII 字符进行编码

    我想向我的应用程序发送的电子邮件添加自定义标头 标头名称只能包含 ASCII 字符 但对于值和用户可能会输入 UTF 8 字符 我必须对它们进行 Base64 编码 此外 我还必须将它们解码回 UTF 8 以便在 UI 中向用户显示它们 最
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • 展开 std::reference_wrapper 的成本

    Given include
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso
  • 为什么 C++ 标准没有将 sizeof(bool) 定义为 1?

    Size of char signed char and unsigned char由 C 标准本身定义为 1 个字节 我想知道为什么它没有定义sizeof bool also C 03 标准 5 3 3 1 说 sizeof char s
  • Asp.Net Core 中的 SSL 不起作用

    我从 Visual Studio 创建了一个简单的 Web 应用程序Web Application Net Core 具有个人用户帐户授权的模板 然后 我启用了 SSLProject gt MyProject Properties 将带有
  • 在 C# 中使用自定义千位分隔符

    在显示字符串时 我尝试不使用 字符作为千位分隔符 而是使用空格 我想我需要定义一种自定义文化 但我似乎做得不对 有什么指点吗 例如 将 1000000 显示为 1 000 000 而不是 1 000 000 no String Replac
  • 如何通过API退出Win32应用程序?

    我有一个使用 Win32 API 编写的 C Win32 应用程序 我希望强制它在其中一个函数中退出 有没有类似的东西Exit or Destroy or Abort 类似的东西会终止它吗 哎呀呀呀呀呀呀 不要做任何这些事情 exit 和

随机推荐

  • Sitecore 插入规则以确保最多 (1) 个特定类型的子级

    sitecore 中有没有办法确保某种类型的项目只能有某种类型项目的 1 个子项 我正在阅读规则引擎食谱 但我没有得到太多细节 我工作过的一个网站要求特定项目类型下不能存在超过 6 个子项目 我们考虑过使用插入选项规则 但决定放弃这个想法
  • Spring可以在抽象类中自动装配吗?

    Spring 无法自动装配我的对象 是否可以在抽象类中自动装配对象 假设所有模式都在 application context xml 中提供 问题 基类和扩展类 如果有 Service Component 上应该使用什么注释 Example
  • Azure 存储 403 禁止异常是 32 位问题吗?

    我们花了相当多的时间来定位出现以下异常的原因 The remote server returned an error 403 Forbidden 堆栈跟踪 at Microsoft WindowsAzure Storage Core Exe
  • PC 客户端上的 C# Crystal Report 总是要求登录提示 SQL Server

    创建setup我的程序 程序运行良好 可以增删改查数据库 当我打开报告时 总是出现登录提示的问题 但在数据库字段中为空禁用 在服务器计算机上 报告没有问题 在我建立连接的代码中 像这样 cnn ServerName 179 15 30 74
  • map() get() 混淆

    我刚刚浏览了 jQuery API 我有点困惑map get 方法 我知道我错了但是map 方法看起来很像 each 陈述 除了文档说它返回一个新的 jQuery 对象 我一直在 jsfiddle 上玩这个 试图弄清楚它 但我还不太明白 h
  • 日志文件监视器

    是否可以在另一个应用程序更新文件时打开文本文件并读取内容 这样就不会导致锁定冲突 我需要监视一个应用程序的日志文件 每次发生事件时该日志文件都会由另一个应用程序更新 在尝试读取文件之前 我会检查该文件是否正在使用 但这似乎并不在所有情况下都
  • 在 Qt Creator 中使用 Qt 标准图标

    我想使用 Qt Standard 图标 as here http standards freedesktop org icon naming spec icon naming spec latest html 我发现了很多例子如何以编程方式
  • Thymeleaf 不解释 sec 标签

    我遇到了一个问题 thymleaf 无法识别我的 Spring Boot 项目中的 sec 标签 例如下面的 sec authentication 未被解释 并按浏览器中的 html 中的形式显示 div Roles span span d
  • 从 Elasticsearch 文档中删除字段

    我需要删除索引到 Elasticsearch 的所有文档中的一个字段 我该怎么做 backtrack 所说的是 true 但是在 Elasticsearch 中有一种非常方便的方法可以做到这一点 Elasticsearch 会抽象出删除的内
  • SQLite .NET,ExecuteScalarAsync,如何知道何时没有结果?

    SQL 语句正在检索行的 ID 但可能不存在这样的行 当我在 GUI 工具中执行特定 SQL 语句时 它返回 0 行在 0 毫秒内返回 但是 当我执行相同的 SQL 语句时ExecuteScalarAsync
  • Spark Scala UDP 在侦听端口上接收

    中提到的例子http spark apache org docs latest streaming programming guide html http spark apache org docs latest streaming pro
  • curl 重新使用 https 连接会话

    我已经使用 openssl 构建了curl 并且能够执行https 连接 现在 每次当curl建立TLS连接时 它都会再次握手 我需要利用客户端与服务器的先前连接会话ID 并在下一个请求中使用它 我已经尝试过以下选项 但每次尝试仍然会进行新
  • 当您有列名的字符向量时,如何不使用 select() dplyr 选择列?

    我正在尝试使用 dplyr 取消选择数据集中的列 但自昨晚以来我无法实现这一目标 我很清楚解决方法 但我正在严格尝试通过 dplyr 找到答案 library dplyr df lt tibble x c 1 2 3 4 y c a b c
  • Angular 2 HTTP 响应拦截器

    在 Angular 1 中 全局处理 HTTP 响应状态是通过 httpProvider angular module app service httpResponseInterceptor q function q this respon
  • Node.js 开发人员的高级文档 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 最近我们的团队正在使用 Node js 开发一个新项目 开始使用 Node js 并不难 但现在我们才
  • 检查范围内唯一单元格的数量

    我有一张 Excel 表格 在 E 列下 我有 425 个包含数据的单元格 我想检查相同的数据 即单元格内的文本 是否在 E 列下剩余 424 个单元格中的任何其他位置重复 我该如何执行此操作 例如 在 E54 中我有 Hello Jack
  • UITextField 文本上的阴影

    是否可以在文本中添加阴影UITextField 从 3 2 开始 您可以使用 CALayer 阴影属性 textField layer shadowOpacity 1 0 textField layer shadowRadius 0 0 t
  • 错误:错误 1005:无法创建表“cat10e.recording”(错误号:150)[重复]

    这个问题在这里已经有答案了 我正在尝试对我的数据库进行正向工程 该数据库有 7 个表 但其中一个向我发送了错误 我真的不知道从这里做什么 因为它的设置就像我的其他表一样 所以我不确定是什么导致了错误 谷歌返回了许多不同的答案 专辑SQL p
  • 代码不适用于 matlab 中的图像处理

    我想在matlab中计算这个公式 m n d size img1 matrix1 sum abs img1 img2 a matrix1 m n b a 100 其中img1 img2是尺寸为512 512 3的两张图像 目标是获得单个数值
  • Linux 中断与轮询

    我正在开发一个带有 DSP 和 ARM 的系统 ARM上有一个linux操作系统 我有一个 DSP 向 ARM Linux 发送数据 在 Linux 中 有一个内核模块读取从 DSP 接收到的数据 内核模块被唤醒以读取数据 使用 DSP 和