标签: interrupt-handling

引脚电平变化中断 - 带内部中断的外部中断

在程序中,我使用定时器中断循环通过LED,如果有人按下开关,它应该停止第一个中断并触发第二个应该根据按下的开关点亮LED.在这里,我有点困惑,正在调用哪个中断.我为Pin Change Interrupt提到了一些书,并为设置PCMSK2写了几行.我得到的输出是"最初所有的LED都在循环,当按下一个开关...... LED的循环停止并重新开始(这意味着程序正在读取输入,只是没有触发第二次中断).它不会停止或者暂停并且不会点亮随后的领导." 有人可以帮忙吗?

#include <avr/io.h>
#include <avr/interrupt.h>
#define PINK_MASK \
    ((1<<PINK0)|(1<<PINK1)|(1<<PINK2)|(1<<PINK3)|(1<<PINK4)|(1<<PINK5)|(1<<PINK6)|(1<<PINK7))


volatile unsigned int intrs, i=1;

void enable_ports(void);
void delay(void);

extern void __vector_23 (void) __attribute__ ((interrupt));

extern void __vector_25 (void) __attribute__ ((signal));

void enable_ports()
{
    DDRB = 0xff;   //PORTB as output for leds

    PORTB = 0xff;

    DDRK = 0x00;  //PORTK as input from switches

    PORTK |= PINK_MASK;

    PCMSK2 = PINK_MASK;     //ENABLE PCMSK2, Setting interrupts

    PCICR = 0x04;

    PCIFR = 0x04;

    TCCR0B = 0x03;      //Setting TIMER

    TIMSK0 = 0x01; …
Run Code Online (Sandbox Code Playgroud)

c avr interrupt-handling

4
推荐指数
1
解决办法
4708
查看次数

中断处理程序中的浮点运算(PowerPC,VxWorks)

我没有找到任何资源来完全回答我正在尝试理解的问题我在一个我正在研究的软件中看到的问题,所以我会问这些天才!

首先,我在PowerPC处理器上运行VxWorks.

在尝试调试单独的问题时,我尝试在中断处理例程中抛出一些快速而脏的调试代码.它涉及一个双精度浮点运算来存储一个感兴趣的值(即,自从我看到最后一个中断进入以来已经存在多长时间),我后来在运行线程中的处理程序之外使用了它.我没有看到这方面的问题(当然,它需要更长的时间,但时间方面我很快;中断不会太快)但是VxWorks肯定不喜欢它.当它到达那个代码时,它一直崩溃,这是重新启动系统的一个糟糕的崩溃.我花了一些时间来追踪双重操作作为问题的根源,我意识到它甚至不是双重"操作",即使从中断中调用的例程返回一个常量的双重失败也是如此.

在PowerPC(或其他一般体系结构)上,通常会出现在中断处理程序中执行浮点运算并在中断处理程序调用的函数中返回浮点(或其他类型)值的问题吗?我不知道为什么这会导致程序崩溃.

(解决方法是延迟将自上次中断后的"滴答"转换为"时间",因为laster中断直到代码超出处理程序,因为它似乎处理长整数操作就好了.)

c++ embedded powerpc vxworks interrupt-handling

4
推荐指数
2
解决办法
3909
查看次数

Ada中断处理程序

当使用Ada中断处理程序时,我到目前为止已经隔离了一些特定的东西,这些东西需要在代码中才能工作.

使用Ada.Interrupts:

protected Int_Handler is --a protected object to handle interrupts
    procedure Handler_1; --A procedure which handles interrupts from your first device (with a body, of course)
    pragma Interrupt_Handler (Handler_1); --To tell the compiler this is an interrupt handler
    --Later in the program:
begin
    Attach_Handler (Int_Handler.Handler_1'access, Serial_1);
Run Code Online (Sandbox Code Playgroud)

假设这一切都正确并且我已经在寄存器中启用了中断,那么我还需要添加其他与中断相关的代码吗?特别是,我是否需要直接与寄存器交互以某种方式"链接"我的处理程序代码,或者我可以只设置寄存器的记录表示,直接输出必要的设置,然后让rip?

谢谢!

ada interrupt-handling

4
推荐指数
1
解决办法
996
查看次数

Future.cancel()方法不起作用

我创建了一个Callable实例,并使用ExecutorService创建了一个新线程.如果线程未完成执行,我想在一段时间后终止该线程.在浏览了jdk文档之后,我意识到Future.cancel()方法可以用来停止线程的执行,但让我感到沮丧的是它没有用.当然,future.get()方法是在规定的时间(在我的情况下是2秒)之后向线程发送一个中断,甚至线程正在接收这个中断但是只有在线程完成执行后才会发生这种中断完全.但我想在2秒后杀死线程.

任何人都可以帮助我如何实现这一目标.

测试类代码:

====================================

public class TestExecService {

      public static void main(String[] args) {

          //checkFixedThreadPool();
          checkCallablePool();

          }

      private static void checkCallablePool()
      {
          PrintCallableTask task1 = new PrintCallableTask("thread1");

          ExecutorService threadExecutor = Executors.newFixedThreadPool(1);
          Future<String> future = threadExecutor.submit(task1);

          try {
                System.out.println("Started..");
                System.out.println("Return VAL from thread ===>>>>>" + future.get(2, TimeUnit.SECONDS));
                System.out.println("Finished!");
            }
          catch (InterruptedException e) 
          {
            System.out.println("Thread got Interrupted Exception ==============================>>>>>>>>>>>>>>>>>>>>>>>>>");
            //e.printStackTrace();
          }
          catch (ExecutionException e) 
          {
            System.out.println("Thread got Execution Exception ==============================>>>>>>>>>>>>>>>>>>>>>>>>>");
          }
          catch (TimeoutException e)
          {
            System.out.println("Thread got TimedOut Exception ==============================>>>>>>>>>>>>>>>>>>>>>>>>>");
            future.cancel(true);
          } …
Run Code Online (Sandbox Code Playgroud)

java concurrency interrupt interrupt-handling interrupted-exception

4
推荐指数
2
解决办法
1万
查看次数

在ARM皮层A-9的U-boot中启用中断

我正在尝试在uboot中配置GPIO中断,这是为了测试中断响应时间而无需任何操作系统干预(裸机).我能够配置引脚复用并成功设置GPIO引脚的中断.

我的问题是关于注册中断服务程序.我看到我的平台的中断向量表位于地址0xFFFF0000(我读了系统控制寄存器以找出这个).GPIO的中断ID为56,我刚刚计算了中断服务程序应该驻留的地址,并尝试用指向我的ISR例程的指针写入地址.这是正确的做法吗?或者我必须自己处理所有其他事情,如上下文保存等?

注意:我使用的是ARM Cortex A-9.

编辑:

基于我通过代码的答案,我有以下问题.的定义

我的架构的do_irq(arm v7)没有做太多,CONFIG_USE_IRQ对我来说不起作用,因为没有为我定义像arch_interrupt_init这样的函数.所以我可以得出结论,我的架构不支持中断.现在,如果我必须自己定义我需要实现的所有功能,以使其工作?由于这只是我项目的一小部分,我想看看能否做到这一点是可行的.我只是想知道这是否需要几行代码或者需要一些努力来实现这种中断支持.

arm interrupt interrupt-handling u-boot

4
推荐指数
1
解决办法
5092
查看次数

如何在linux中给予以太网中断最高优先级

我列出了所有中断:

cat /proc/interruts
Run Code Online (Sandbox Code Playgroud)

它给出了这个:

        CPU0        CPU1         CPU2        CPU3
    0:   126           0            0           0     IO-APIC-edge        timer
    1:   941           0            0           0     IO-APIC-edge        keyboard
    ... (etc.)
   19:   941           0            0           0     IO-APIC-fasteoi      eth0
    ... (etc.)
Run Code Online (Sandbox Code Playgroud)

此表中的第一列是否给出优先级中断?我只是想学习优先级,因为我想提高NIC的中断优先级以获得更好的网络性能.我想,前两个中断不能改变(我想是因为intel x86架构).

无论如何,这是我的问题:

是否可以提高NIC中断的优先级?

linux nic linux-kernel interrupt-handling

4
推荐指数
1
解决办法
8375
查看次数

ARM Cortex A9中的处理器间中断(如何在Linux中为软件生成的中断(ARM)编写处理程序?)

我读到ARM中软件生成的中断被用作处理器间中断.我还可以看到其中5个中断已经在使用中.我也知道ARM提供了16个软件生成的中断.

在我的应用程序中,我正在运行ARM-cortex内核和Linux上的裸机应用程序.我想将运行裸机应用程序的核心数据传递给运行Linux的核心.我计划将数据复制到片上存储器(共享),然后我将在Core(运行linux)上触发一个SGI来指示一些数据可供它处理.现在我能够从核心(运行裸机应用程序)生成SGI.但是为了处理linux端的中断,我不确定SGI IRQ号是免费的,我也不确定我是否可以直接使用IRQ号(一般SGI是0-15).有没有人知道如何在Linux中为SGI编写处理程序?

编辑: 这是上述文本的重新措辞,因为该问题因SSCE原因而被关闭.Cortex-A CPU用于多CPU系统.ARM 通用中断控制器(GIC)监视所有全局中断并将它们分派给特定的CPU.为了使各个CPU相互发信号,软件生成中断(SGI)从一个核心发送到另一个核心; 这使用外围专用中断(PPI).这个问题是,

如何实现可以接收SGI作为PPI的Linux内核驱动程序?

arm linux-kernel interrupt-handling

4
推荐指数
1
解决办法
4130
查看次数

PPI,SPI和SGI中断有什么区别?

在ARM架构中,我已经读过有3种中断:

  • PPI - 每处理器中断
  • SPI - 共享处理器中断
  • SGI - 软件生成的中断

我想知道这些是什么,以及它们彼此之间有何不同?

arm interrupt interrupt-handling

4
推荐指数
1
解决办法
8524
查看次数

数据包流量在下半部分

我正在阅读从NIC中断处理程序到用户空间的接收路径中的数据包流.

我想知道新分配的skbuff在下半部分中保留到哪一点.

从LDD获取snull_rx()代码:

void snull_rx(struct net_device *dev, struct snull_packet *pkt)
{
    struct sk_buff *skb;
    struct snull_priv *priv = netdev_priv(dev);

    /*
     * The packet has been retrieved from the transmission
     * medium. Build an skb around it, so upper layers can handle it
     */
    skb = dev_alloc_skb(pkt->datalen + 2);
    if (!skb) {
        if (printk_ratelimit(  ))
            printk(KERN_NOTICE "snull rx: low on mem - packet dropped\n");
        priv->stats.rx_dropped++;
        goto out;
    }
    memcpy(skb_put(skb, pkt->datalen), pkt->data, pkt->datalen);

    /* Write metadata, and then pass to the receive …
Run Code Online (Sandbox Code Playgroud)

cpu-architecture interrupt-handling

4
推荐指数
1
解决办法
762
查看次数

如何加载IDT?

我正在写自己的小操作系统。我已经完成启动,进入保护模式,一些文本打印以及与qemu的串行通信。我已经尝试添加中断两天了。我到处都在寻找,包括其他系统资源。不,我下面没有代码,qemu(我不知道为什么)关闭了。我包括geust errorsqemu。

这是我的主文件 kernel.cpp

__asm__ (".pushsection .text.start\r\n" \
          "jmp main\r\n" \
          ".popsection\r\n");

#include &lt;stdbool.h>
#include "utils/debug.h"
#include "drivers/display.h"
#include "drivers/serial.h"
#include "drivers/keyboard.h"
#include "drivers/pic.h"
#include "interrupt/interrupt.h"


void initDrivers(){
    serial::init();
    pic::init();
    interrupt::init();
    interrupt::enable();
    terminal_initialize();
}

int main() {
    initDrivers();
    terminal_setcolor(VGA_COLOR_WHITE);
    terminal_writestring("Hello!");

    debug::println("after println");

    bool alive = true;
    while(alive) {

    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

PIC驱动程序pic.cpppic.h

#include "pic.h"
#include &lt;stddef.h>
#include &lt;stdint.h>
#include "IO.h"
#include "../utils/debug.h"
/*
* IMR - Interrupt Mask Register
* IRR - Interrupt Request …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly osdev interrupt-handling

4
推荐指数
1
解决办法
375
查看次数