我有一个中断处理模块,它控制嵌入式处理器上的中断控制器硬件.现在我想为它添加更多测试.目前,测试仅测试中断嵌套是否有效,方法是在ISR中进行两次软件中断,一次是低优先级,另一次是高优先级.如何进一步测试该模块?
嵌入式编程中最常听到的建议是"保持中断时间短".
现在我的情况是我的main()循环中有一个非常长的运行任务(将大块数据写入SD卡),有时需要100ms.因此,为了保持我的系统响应,我将所有其他内容移动到了中断处理程序.
例如,通常可以在中断中处理传入的UART数据,然后在main()循环中处理传入的命令,然后发回响应.但在我的情况下,命令的整个处理/处理也在中断中进行,因为我的main()循环可以被阻塞(相对)长时间.
最佳解决方案是切换到RTOS,但我没有RAM.我的设计是否有替代方案可以缩短中断时间?
在stackoverflow上,我经常看到使用Thread.currentThread().isInterrupted().Runnable在while循环中实现和使用它时,如下所示:
public void run() {
while(!Thread.currentThread().isInterrupted()) { ... }
}
Run Code Online (Sandbox Code Playgroud)
是否有任何不同使用Thread.interrupted()(除了interrupted使用时清除标志interrupted())?
我也见过Thread.currentThread().interrupted().这是正确的使用方式,还是Thread.interrupted()足够的?
如果我们今天查看Haswell架构图,我们可以看到有PCIe通道直接连接到CPU(用于图形)以及其中一些路由到平台控制器集线器(南桥更换): 
如果我们看一下英特尔8系列数据表(C222的规格),我们会发现英特尔C222包含用于路由传统INTx中断的I/O APIC(第5.10章).我的问题是,如果传统的INTx中断请求直接到达CPU(通过PCIe 3.0通道)会发生什么.是否必须首先转发到C222,还是系统代理中还有另一个I/O APIC,在这种情况下我必须编程?此外,借助用于定向I/O的英特尔虚拟化技术,现在还有一个额外的间接,即中断重映射表.在CPU或C222上的系统代理(前北桥)中的那个表是否意味着在启用重映射的情况下,需要首先将PCIe 3.0通道的所有中断路由到C222?
我应该先分享我所知道的一切 - 那就是完全混乱.关于这个主题有几个不同的问题,所以请不要生气:).
1)为了找到ISR,CPU具有中断号.在x86机器(286/386及以上)中,有一个带有ISR的IVT; 每个4字节大小的条目.所以我们需要将中断数乘以4才能找到ISR.所以第一堆问题是 - 我完全混淆了CPU接收中断的机制.为了引发中断,首先设备应该探测IRQ - 然后是什么?中断号在"IRQ"上向CPU传输?我还读过像数据总线上设置ISR地址的设备; 什么呢?覆盖ISR的设备的概念是什么?有人可以告诉我几个CPU轮询中断的示例设备吗?它在哪里找到它们的ISR?
2)如果两个设备共享IRQ(这是非常可能的),它们之间的CPU有何不同?如果两个设备同时引发相同优先级的中断怎么办 我知道会有相同类型和低优先级中断的屏蔽 - 但这种通信是如何在CPU和设备控制器之间发生的?我研究了PIC和APIC在这个问题上的作用,但是无法理解.
谢谢阅读.非常感谢您的回答.
在Ruby中我有以下内容:
# Trap Interrupts
trap("INT") do
puts "Shutting down..."
exit
end
Run Code Online (Sandbox Code Playgroud)
当我中断程序时,将打印以下内容(Mac OSX Lion):
^ CShutting down ...
有没有办法^C在Ruby中隐藏?
我正在做一个我需要在Linux中处理中断的项目.
我使用的板是一个ARM9Board由三星(臂11处理器)的基础上S3C6410 MCU和它具有以下的I/O接口:

如图所示,我有外部中断的EINTx引脚和GPIO引脚作为GPIO引脚,我不介意使用其中任何一个,但我没有他们的数字!
对于EINTx引脚:
我打电话的时候
int request_irq(unsigned int irq, void (*handler)(int, struct pt_regs *),
unsigned long flags, const char *device);
Run Code Online (Sandbox Code Playgroud)
我需要中断号作为函数的第一个参数传递它,那么如何获得irq数,例如EINT16引脚?
对于GPxx引脚: 与我需要GPIO引脚编号将其传递给这些功能的故事相同
int gpio_request(unsigned gpio, const char *label);
int gpio_direction_input(unsigned gpio);
int gpio_to_irq(unsigned gpio);
Run Code Online (Sandbox Code Playgroud)
即,我如何知道GPP8引脚的GPIO编号?
我搜索了董事会文件和数据表,但它没有包含任何关于如何获得这些数字,任何想法或帮助在哪里看?
有没有办法让程序无法中断(一个不间断的程序)?通过这个,我的意思是a process that can't be terminated by any signal, kill command, or any other key combinations在任何系统:Linux,Windows等.
首先,我有兴趣知道它是否可能.如果是,那么可能的范围是什么?
我主要用C,C++和python编写代码; 但我不知道这些编程语言中有任何这样的命令.
是否可以使用汇编语言,以及如何使用?或者使用嵌入式汇编代码(内联汇编)的高级语言c?
我知道有些信号可以捕获,有些信号不像SIGKILL和SIGSTOP.
我记得,当我some viruses couldn't be terminated even from Task Manager.习惯使用Windows-XP时,我想在低级语言中可能有一些解决方案.也许通过重写中断向量表.
我们可以使用TSR(挂钩)编写一个不间断的程序吗?因为TSR只能在重新启动计算机时或者从内存中明确删除TSR时删除.我对么?
我在Google上找不到任何东西.
我正在开发一个带有DSP和ARM的系统.在ARM上有一个Linux操作系统.我有一个DSP向ARM(Linux)发送数据 - 在Linux中有一个内核模块,它读取从DSP接收的数据.内核模块正在唤醒以使用DSP与ARM之间的硬件中断来读取数据.
我想编写一个用户空间应用程序,每次有来自DSP的新数据时,它将从内核空间(内核模块)读取数据.
问题是:
有什么方法可以做到这一点,从内核到用户空间的软件中断,或者每隔10ms从用户空间轮询(用内核读取已知的内存地址).
知道:
我对DMA和中断I/O之间的差异有点不清楚.(目前正在阅读操作系统概念,第7版).
具体来说,我不确定在任何一种情况下中断何时发生,并且在两种情况下在哪些点上CPU都可以自由地进行其他工作.我一直在阅读的东西,但不一定和解:
中断驱动
DMA