【问题标题】:How to disable interrupt in a C program in linux如何在Linux中的C程序中禁用中断
【发布时间】:2017-06-11 01:42:13
【问题描述】:

我正在使用 A13 处理器的 Linux(A13-OLinuXino-MICRO) 上用 c 编写一个简单的代码。如果这很重要,我正在使用 gcc 编译器。假设我有一个简单的循环,它只是从 1 数到 100,我希望在这个循环中尽可能少地中断。我认为我能做的最好的事情就是禁用中断(如果可能的话,甚至是定时器中断)并在循环后启用它。我的程序中有多个地方需要执行此操作。任何人都可以帮助我编写一个简单的 C 代码来保护循环免受中断...我可以在我的平台上编译和运行的东西吗?

编辑:内核线程可能是一个答案。我怎样才能运行具有内核权限的东西?我看到人们谈论 disable_local_interrupt() 但我不知道如何使用它。

编辑:这是我要解决的实际问题。我需要在无中断环境中运行我的应用程序。

编辑:是的,我确信 Linux 是我需要使用的,而且我知道中断对操作系统很重要,这就是我不想永远禁用它们的原因。当我运行它时,我只想在操作系统上强制执行几分之一秒的无中断。另外,没有我需要解决的主要问题,这是我需要解决的“问题”,所以不要问我为什么要这样做。

【问题讨论】:

  • 希望没有办法做到这一点!您甚至不应该考虑从用户代码进行如此低级别的修改(并且在内核代码中要非常小心)。这是一个 XY 问题。您尝试通过此解决的实际问题是什么?
  • 如果这是一项普遍可用的功能,那么任何人都可以编写一个具有永无止境的循环的程序,该循环会阻塞整个系统,直到有人物理地拔掉插头,因为任务调度依赖于时钟生成的中断.
  • 禁用中断就像处理器指令一样简单。通常助记符类似于cli。但是,它是特权指令,只能在特权上下文中执行。
  • 使用实时操作系统。
  • “我需要在无中断环境中运行我的应用程序”——那么您就不想在 Linux 上运行它。在 Windows、OS X 或任何其他多任务操作系统上也不行。如果您需要确定您的程序不会被中断,那么您可能需要在裸机上将其作为独立程序运行。

标签: c linux linux-kernel interrupt


【解决方案1】:

用户空间不能禁用或启用中断。

【讨论】:

  • 你能演示一下如何进入内核空间然后做吗?
  • @GabrielStaples 编写内核模块并禁用中断。
  • @sevko,你刚刚改写了我的请求。我:“doron,你能演示一下如何进入内核空间然后做吗?”。你:“[换句话说,doron,你能演示一下如何]编写内核模型并禁用中断吗?”
  • 看看实现一个字符设备。网上有例子。一旦进入内核模式,就有一个简单的 API 可以禁用中断。请注意,在重新启用中断之前,您无法返回用户空间
【解决方案2】:

根据 ARM.com http://infocenter.arm.com/help/index.jsp?topic=%2Fcom.arm.doc.ddi0344k%2FBeidabib.html 这个 CPU 确实有不同的操作模式,这表明您可能无法禁用来自用户进程的中断。

【讨论】:

  • 那么有没有什么办法可以用更高的权限来做呢?
  • 是的,在内核中运行您的代码。通过编写内核驱动程序。我不是内核开发人员,但我猜你不希望有一种方法来禁用然后启用来自用户空间的中断;你应该在内核模式下运行你的整个操作:禁用中断,做你想做的任何事情,重新启用中断。这听起来仍然很奇怪,RTOS 很可能是更好的选择。
【解决方案3】:

我认为@doron 是对的,你不能在用户模式下禁用/启用中断,但你有一个解决方法。您可以编写一个将“循环”代码封装在接口中的驱动程序,并且可以在驱动程序中启用/禁用中断。您的应用程序只需要调用该接口即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多